对于 HTTP 调用,您可以执行以下操作:
http::async_read(m_stream, m_buffer, m_res, beast::bind_front_handler(&RestSession::on_read, shared_from_this()));
// ... then
void on_read(beast::error_code ec, std::size_t /*bytes_transferred*/)
{
if (ec)
return ; // handle error_code
if (m_res.result() == http::status::not_found)
return ; // handle target not found
}
但我看不到如何为 websocket 流做同样的事情。如果流目标不存在,则永远不会调用 on_read()。
我尝试从 websocket 流 (m_websocketStream) 中获取下一个流,但从未调用过 lambda,大概是因为 websocket 层已经吞噬了 HTTP 响应:
void on_handshake(beast::error_code ec)
{
if(ec)
return fail(ec, "handshake", m_callback);
http::async_read(m_websockStream.next_layer(), m_buffer, m_httpRes, [this, self = shared_from_this()](beast::error_code ec, std::size_t)
{
if (m_httpResponse.result() == http::status::not_found)
return fail("path not found", m_callback);
else
m_ws.async_read(m_buffer, beast::bind_front_handler(&WsSession::on_read, self->shared_from_this()));
});
}
这可能吗?