如何在beast :: websocket中读取错误请求的标头?

时间:2019-02-08 19:51:11

标签: c++ boost boost-beast beast-websockets

我有一个Websocket服务器(监听回送接口),该服务器应响应GET请求。这是我的方法

console.log("Hello ${first}");

但是我还需要能够处理位置(例如ws_.async_accept_ex( [self = shared_from_this()](websocket::response_type& res) // { if (res.result_int() == 400) { // bad request, assume HTTP GET osstream response; /* invoke request handlers */ for (auto& do_handle : self->handlers) { do_handle({ "GET" }, response); /* if responded, assing response to the body*/ if (response.tellp()) { res.content_length(response.str().size()); res.body() = std::move(response.str()); break; } } } }, net::bind_executor(strand_, [self = shared_from_this()](beast::error_code ec) { self->on_accept(ec); })); )。

有办法吗?

解决方案::手动阅读标题,检查其是否为升级

localhost:2019/some_location

1 个答案:

答案 0 :(得分:1)

WebSocket升级请求的请求目标必须采用原始形式。 “ localhost:2019 / some_location”为绝对格式,因此是非法的。在我看来,您想要的是能够专门处理不是WebSocket升级的HTTP请求,对于实际的WebSocket升级,请让websocket流通过执行握手来处理它。

这在文档中涉及: https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/using_websocket/handshaking_servers.html#beast.using_websocket.handshaking_servers.passing_http_requests

在示例中: https://github.com/boostorg/beast/blob/06efddd8b851610b5b3a5832ac87f1c52b838d9b/example/advanced/server/advanced_server.cpp#L665

tl; dr:使用beast::http::async_read自己读取请求,看看是否是使用beast::websocket::is_upgrade的websocket升级。如果是升级,请构造beast::websocket::stream并使用请求在其上调用async_accept,否则以所需方式处理HTTP请求,并使用beast::http::async_write自己发送回响应。