我有一个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
答案 0 :(得分:1)
WebSocket升级请求的请求目标必须采用原始形式。 “ localhost:2019 / some_location”为绝对格式,因此是非法的。在我看来,您想要的是能够专门处理不是WebSocket升级的HTTP请求,对于实际的WebSocket升级,请让websocket流通过执行握手来处理它。
tl; dr:使用beast::http::async_read
自己读取请求,看看是否是使用beast::websocket::is_upgrade
的websocket升级。如果是升级,请构造beast::websocket::stream
并使用请求在其上调用async_accept
,否则以所需方式处理HTTP请求,并使用beast::http::async_write
自己发送回响应。>