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

8
我希望使用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;
})

这是我的新代码:
.map(Some).or_else(|_| -> Result<_, ()> {
    // SPAWN THE FUTURE
    Ok(None)
})

这是我卡住的地方。示例代码调用一个名为spawn_future的函数,该函数需要一个参数(upgrade.reject()),但由于我无法访问upgrade结构,因此在我的代码中没有可用的参数。我尝试了一些其他方法(例如调用handle.spawn_fn),但编译器从未喜欢过我的做法。(我可以粘贴一些编译器错误,但我认为它们不会提高我发布的质量。) 这是我的问题:如何推荐编写同时能处理http请求和websocket请求的异步服务器?如果我的方法正确,请帮我填写SPAWN THE FUTURE行。
附加上下文(如果您还没有注意到):我是一个完全的Rust初学者。
1个回答

8

在rust-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();

1
谢谢。这在文档中隐藏得很好。我本来找不到它的。 - cruppstahl
链接已经失效,cythedize似乎已经消失了。 - Mathieu Dutour Sikiric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接