在同一端口上运行websocket和http服务器(Rust,hyper)

cru*_*ahl 7 websocket rust hyper

我想用Rust,Hyper和websocket-rs编写一个Web服务器.Web服务器必须能够在同一端口上处理http请求和websocket请求.我使用官方样本(async-server.rs:https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs)并尝试修改它.我的想法是改变错误处理.如果客户端的请求是一个简单的http请求,那么不会返回错误,而是产生一个处理请求的未来.

基于另一个SO问题(如何在使用rust-websocket时处理错误,以便只有那个连接失败而不是整个程序?)我改变了样本中的错误处理.

这是旧代码:

.map_err(|InvalidConnection {error, ..}| {
    println!("Error:{:?}",error);
    return error;
})
Run Code Online (Sandbox Code Playgroud)

这是我的新代码:

.map(Some).or_else(|_| -> Result<_, ()> {
    // SPAWN THE FUTURE
    Ok(None)
})
Run Code Online (Sandbox Code Playgroud)

这是我被困的地方.示例代码调用一个函数spawn_future,该函数需要一个upgrade.reject()在我的代码中不可用的parameter(),因为我无法访问upgrade结构.我尝试了一些其他的东西(即调用handle.spawn_fn),但编译器从不喜欢我做的事情.(我可以粘贴一些编译器错误,但我认为它们不会提高我帖子的质量.)

这是我的问题:编写可以在同一端口上处理http请求和websocket请求的异步服务器的推荐方法是什么?如果我的方法是正确的:你能帮我填一下SPAWN THE FUTURE吗?

附加上下文(如果你还没有注意到):我是一个完整的Rust初学者.

Ale*_* jg 7

似乎有一些文档上这个锈的WebSocket文档中的位置

从文档粘贴:

use hyper::server::{Server, Request, Response};
use websocket::Message;
use websocket::sync::server::upgrade::IntoWs;
use websocket::sync::server::upgrade::HyperRequest;

Server::http("0.0.0.0:80").unwrap().handle(move |req: Request, res: Response| {
    match HyperRequest(req).into_ws() {
        Ok(upgrade) => {
            // `accept` sends a successful handshake, no need to worry about res
            let mut client = match upgrade.accept() {
                Ok(c) => c,
                Err(_) => panic!(),
            };

            client.send_message(&Message::text("its free real estate"));
        },

        Err((request, err)) => {
            // continue using the request as normal, "echo uri"
            res.send(b"Try connecting over ws instead.").unwrap();
        },
    };
})
.unwrap();
Run Code Online (Sandbox Code Playgroud)