forked from boostorg/beast
Remove opcode from read, async_read (API Change):
fix #446 * Read signatures no longer include `opcode` * stream::got_binary and stream::got_text inform the caller if the current incoming message is binary or text. Actions Required: * Remove the `opcode` reference parameter from calls to synchronous and asynchronous read functions, replace the logic with calls to stream::got_binary and stream::got_text instead.
This commit is contained in:
@@ -8,6 +8,7 @@ API Changes:
|
|||||||
* read_message_max is a member of stream
|
* read_message_max is a member of stream
|
||||||
* write_buffer_size is a member of stream
|
* write_buffer_size is a member of stream
|
||||||
* ping_callback is a member of stream
|
* ping_callback is a member of stream
|
||||||
|
* Remove opcode from read, async_read
|
||||||
|
|
||||||
Actions Required:
|
Actions Required:
|
||||||
|
|
||||||
@@ -29,6 +30,10 @@ Actions Required:
|
|||||||
* Change call sites which use ping_callback with set_option to
|
* Change call sites which use ping_callback with set_option to
|
||||||
call stream::ping_callback instead.
|
call stream::ping_callback instead.
|
||||||
|
|
||||||
|
* Remove the `opcode` reference parameter from calls to synchronous
|
||||||
|
and asynchronous read functions, replace the logic with calls to
|
||||||
|
stream::got_binary and stream::got_text instead.
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Version 51
|
Version 51
|
||||||
|
@@ -42,8 +42,6 @@ int main()
|
|||||||
|
|
||||||
// Receive Secure WebSocket message, print and close using Beast
|
// Receive Secure WebSocket message, print and close using Beast
|
||||||
beast::multi_buffer b;
|
beast::multi_buffer b;
|
||||||
beast::websocket::opcode op;
|
|
||||||
ws.read(op, b);
|
|
||||||
ws.close(beast::websocket::close_code::normal);
|
ws.close(beast::websocket::close_code::normal);
|
||||||
std::cout << beast::buffers(b.data()) << "\n";
|
std::cout << beast::buffers(b.data()) << "\n";
|
||||||
}
|
}
|
||||||
|
@@ -139,7 +139,6 @@ private:
|
|||||||
int state = 0;
|
int state = 0;
|
||||||
beast::websocket::stream<socket_type> ws;
|
beast::websocket::stream<socket_type> ws;
|
||||||
boost::asio::io_service::strand strand;
|
boost::asio::io_service::strand strand;
|
||||||
beast::websocket::opcode op;
|
|
||||||
beast::multi_buffer db;
|
beast::multi_buffer db;
|
||||||
std::size_t id;
|
std::size_t id;
|
||||||
|
|
||||||
@@ -218,7 +217,7 @@ private:
|
|||||||
d.db.consume(d.db.size());
|
d.db.consume(d.db.size());
|
||||||
// read message
|
// read message
|
||||||
d.state = 2;
|
d.state = 2;
|
||||||
d.ws.async_read(d.op, d.db,
|
d.ws.async_read(d.db,
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -230,7 +229,7 @@ private:
|
|||||||
return fail("async_read", ec);
|
return fail("async_read", ec);
|
||||||
// write message
|
// write message
|
||||||
d.state = 1;
|
d.state = 1;
|
||||||
d.ws.binary(d.op == beast::websocket::opcode::binary);
|
d.ws.binary(d.ws.got_binary());
|
||||||
d.ws.async_write(d.db.data(),
|
d.ws.async_write(d.db.data(),
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
@@ -30,8 +30,7 @@ int main()
|
|||||||
|
|
||||||
// Receive WebSocket message, print and close using beast
|
// Receive WebSocket message, print and close using beast
|
||||||
beast::multi_buffer b;
|
beast::multi_buffer b;
|
||||||
beast::websocket::opcode op;
|
ws.read(b);
|
||||||
ws.read(op, b);
|
|
||||||
ws.close(beast::websocket::close_code::normal);
|
ws.close(beast::websocket::close_code::normal);
|
||||||
std::cout << beast::buffers(b.data()) << "\n";
|
std::cout << beast::buffers(b.data()) << "\n";
|
||||||
}
|
}
|
||||||
|
@@ -207,15 +207,14 @@ private:
|
|||||||
}
|
}
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
beast::websocket::opcode op;
|
|
||||||
beast::multi_buffer b;
|
beast::multi_buffer b;
|
||||||
ws.read(op, b, ec);
|
ws.read(b, ec);
|
||||||
if(ec)
|
if(ec)
|
||||||
{
|
{
|
||||||
auto const s = ec.message();
|
auto const s = ec.message();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ws.binary(op == beast::websocket::opcode::binary);
|
ws.binary(ws.got_binary());
|
||||||
ws.write(b.data(), ec);
|
ws.write(b.data(), ec);
|
||||||
if(ec)
|
if(ec)
|
||||||
break;
|
break;
|
||||||
|
@@ -1001,16 +1001,13 @@ class stream<NextLayer>::read_op
|
|||||||
{
|
{
|
||||||
bool cont;
|
bool cont;
|
||||||
stream<NextLayer>& ws;
|
stream<NextLayer>& ws;
|
||||||
opcode& op;
|
|
||||||
DynamicBuffer& db;
|
DynamicBuffer& db;
|
||||||
frame_info fi;
|
frame_info fi;
|
||||||
int state = 0;
|
int state = 0;
|
||||||
|
|
||||||
data(Handler& handler,
|
data(Handler& handler, stream<NextLayer>& ws_,
|
||||||
stream<NextLayer>& ws_, opcode& op_,
|
|
||||||
DynamicBuffer& sb_)
|
DynamicBuffer& sb_)
|
||||||
: ws(ws_)
|
: ws(ws_)
|
||||||
, op(op_)
|
|
||||||
, db(sb_)
|
, db(sb_)
|
||||||
{
|
{
|
||||||
using boost::asio::asio_handler_is_continuation;
|
using boost::asio::asio_handler_is_continuation;
|
||||||
@@ -1091,7 +1088,6 @@ operator()(error_code const& ec, bool again)
|
|||||||
|
|
||||||
// got payload
|
// got payload
|
||||||
case 1:
|
case 1:
|
||||||
d.op = d.fi.op;
|
|
||||||
if(d.fi.fin)
|
if(d.fi.fin)
|
||||||
goto upcall;
|
goto upcall;
|
||||||
d.state = 0;
|
d.state = 0;
|
||||||
@@ -1107,8 +1103,7 @@ template<class DynamicBuffer, class ReadHandler>
|
|||||||
async_return_type<
|
async_return_type<
|
||||||
ReadHandler, void(error_code)>
|
ReadHandler, void(error_code)>
|
||||||
stream<NextLayer>::
|
stream<NextLayer>::
|
||||||
async_read(opcode& op,
|
async_read(DynamicBuffer& buffer, ReadHandler&& handler)
|
||||||
DynamicBuffer& buffer, ReadHandler&& handler)
|
|
||||||
{
|
{
|
||||||
static_assert(is_async_stream<next_layer_type>::value,
|
static_assert(is_async_stream<next_layer_type>::value,
|
||||||
"AsyncStream requirements requirements not met");
|
"AsyncStream requirements requirements not met");
|
||||||
@@ -1117,8 +1112,8 @@ async_read(opcode& op,
|
|||||||
async_completion<ReadHandler,
|
async_completion<ReadHandler,
|
||||||
void(error_code)> init{handler};
|
void(error_code)> init{handler};
|
||||||
read_op<DynamicBuffer, handler_type<
|
read_op<DynamicBuffer, handler_type<
|
||||||
ReadHandler, void(error_code)>>{init.completion_handler,
|
ReadHandler, void(error_code)>>{
|
||||||
*this, op, buffer};
|
init.completion_handler, *this, buffer};
|
||||||
return init.result.get();
|
return init.result.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1126,14 +1121,14 @@ template<class NextLayer>
|
|||||||
template<class DynamicBuffer>
|
template<class DynamicBuffer>
|
||||||
void
|
void
|
||||||
stream<NextLayer>::
|
stream<NextLayer>::
|
||||||
read(opcode& op, DynamicBuffer& buffer)
|
read(DynamicBuffer& buffer)
|
||||||
{
|
{
|
||||||
static_assert(is_sync_stream<next_layer_type>::value,
|
static_assert(is_sync_stream<next_layer_type>::value,
|
||||||
"SyncStream requirements not met");
|
"SyncStream requirements not met");
|
||||||
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
static_assert(beast::is_dynamic_buffer<DynamicBuffer>::value,
|
||||||
"DynamicBuffer requirements not met");
|
"DynamicBuffer requirements not met");
|
||||||
error_code ec;
|
error_code ec;
|
||||||
read(op, buffer, ec);
|
read(buffer, ec);
|
||||||
if(ec)
|
if(ec)
|
||||||
BOOST_THROW_EXCEPTION(system_error{ec});
|
BOOST_THROW_EXCEPTION(system_error{ec});
|
||||||
}
|
}
|
||||||
@@ -1142,7 +1137,7 @@ template<class NextLayer>
|
|||||||
template<class DynamicBuffer>
|
template<class DynamicBuffer>
|
||||||
void
|
void
|
||||||
stream<NextLayer>::
|
stream<NextLayer>::
|
||||||
read(opcode& op, DynamicBuffer& buffer, error_code& ec)
|
read(DynamicBuffer& buffer, error_code& ec)
|
||||||
{
|
{
|
||||||
static_assert(is_sync_stream<next_layer_type>::value,
|
static_assert(is_sync_stream<next_layer_type>::value,
|
||||||
"SyncStream requirements not met");
|
"SyncStream requirements not met");
|
||||||
@@ -1154,7 +1149,6 @@ read(opcode& op, DynamicBuffer& buffer, error_code& ec)
|
|||||||
read_frame(fi, buffer, ec);
|
read_frame(fi, buffer, ec);
|
||||||
if(ec)
|
if(ec)
|
||||||
break;
|
break;
|
||||||
op = fi.op;
|
|
||||||
if(fi.fin)
|
if(fi.fin)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -75,8 +75,8 @@ struct frame_info
|
|||||||
@endcode
|
@endcode
|
||||||
Alternatively, you can write:
|
Alternatively, you can write:
|
||||||
@code
|
@code
|
||||||
ip::tcp::socket sock(io_service);
|
ip::tcp::socket sock{io_service};
|
||||||
websocket::stream<ip::tcp::socket&> ws(sock);
|
websocket::stream<ip::tcp::socket&> ws{sock};
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
@tparam NextLayer The type representing the next layer, to which
|
@tparam NextLayer The type representing the next layer, to which
|
||||||
@@ -223,28 +223,6 @@ public:
|
|||||||
return stream_.lowest_layer();
|
return stream_.lowest_layer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set options on the stream.
|
|
||||||
|
|
||||||
The application must ensure that calls to set options
|
|
||||||
are performed within the same implicit or explicit strand.
|
|
||||||
|
|
||||||
@param args One or more stream options to set.
|
|
||||||
*/
|
|
||||||
#if BEAST_DOXYGEN
|
|
||||||
template<class... Args>
|
|
||||||
void
|
|
||||||
set_option(Args&&... args)
|
|
||||||
#else
|
|
||||||
template<class A1, class A2, class... An>
|
|
||||||
void
|
|
||||||
set_option(A1&& a1, A2&& a2, An&&... an)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
set_option(std::forward<A1>(a1));
|
|
||||||
set_option(std::forward<A2>(a2),
|
|
||||||
std::forward<An>(an)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the permessage-deflate extension options
|
/// Set the permessage-deflate extension options
|
||||||
void
|
void
|
||||||
set_option(permessage_deflate const& o);
|
set_option(permessage_deflate const& o);
|
||||||
@@ -469,6 +447,38 @@ public:
|
|||||||
return wr_buf_size_;
|
return wr_buf_size_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set the text message option.
|
||||||
|
|
||||||
|
This controls whether or not outgoing message opcodes
|
||||||
|
are set to binary or text. The setting is only applied
|
||||||
|
at the start when a caller begins a new message. Changing
|
||||||
|
the opcode after a message is started will only take effect
|
||||||
|
after the current message being sent is complete.
|
||||||
|
|
||||||
|
The default setting is to send text messages.
|
||||||
|
|
||||||
|
@param v `true` if outgoing messages should indicate
|
||||||
|
text, or `false` if they should indicate binary.
|
||||||
|
|
||||||
|
@par Example
|
||||||
|
Setting the message type to text.
|
||||||
|
@code
|
||||||
|
ws.text(true);
|
||||||
|
@endcode
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
text(bool v)
|
||||||
|
{
|
||||||
|
wr_opcode_ = v ? opcode::text : opcode::binary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if the text message option is set.
|
||||||
|
bool
|
||||||
|
text() const
|
||||||
|
{
|
||||||
|
return wr_opcode_ == opcode::text;
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns the close reason received from the peer.
|
/** Returns the close reason received from the peer.
|
||||||
|
|
||||||
This is only valid after a read completes with error::closed.
|
This is only valid after a read completes with error::closed.
|
||||||
@@ -479,6 +489,36 @@ public:
|
|||||||
return cr_;
|
return cr_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns `true` if the latest message data indicates binary.
|
||||||
|
|
||||||
|
This function informs the caller of whether the last
|
||||||
|
received message frame represents a message with the
|
||||||
|
binary opcode.
|
||||||
|
|
||||||
|
If there is no last message frame, the return value is
|
||||||
|
undefined.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
got_binary()
|
||||||
|
{
|
||||||
|
return rd_.op == opcode::binary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns `true` if the latest message data indicates text.
|
||||||
|
|
||||||
|
This function informs the caller of whether the last
|
||||||
|
received message frame represents a message with the
|
||||||
|
text opcode.
|
||||||
|
|
||||||
|
If there is no last message frame, the return value is
|
||||||
|
undefined.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
got_text()
|
||||||
|
{
|
||||||
|
return ! got_binary();
|
||||||
|
}
|
||||||
|
|
||||||
/** Read and respond to a WebSocket HTTP Upgrade request.
|
/** Read and respond to a WebSocket HTTP Upgrade request.
|
||||||
|
|
||||||
This function is used to synchronously read an HTTP WebSocket
|
This function is used to synchronously read an HTTP WebSocket
|
||||||
@@ -1638,8 +1678,7 @@ public:
|
|||||||
@endcode
|
@endcode
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
handshake(string_view host,
|
handshake(string_view host, string_view target);
|
||||||
string_view target);
|
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
|
|
||||||
@@ -1686,8 +1725,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
handshake(response_type& res,
|
handshake(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target);
|
||||||
string_view target);
|
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
|
|
||||||
@@ -1743,8 +1781,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
template<class RequestDecorator>
|
template<class RequestDecorator>
|
||||||
void
|
void
|
||||||
handshake_ex(string_view host,
|
handshake_ex(string_view host, string_view target,
|
||||||
string_view target,
|
|
||||||
RequestDecorator const& decorator);
|
RequestDecorator const& decorator);
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
@@ -1806,8 +1843,7 @@ public:
|
|||||||
template<class RequestDecorator>
|
template<class RequestDecorator>
|
||||||
void
|
void
|
||||||
handshake_ex(response_type& res,
|
handshake_ex(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target,
|
||||||
string_view target,
|
|
||||||
RequestDecorator const& decorator);
|
RequestDecorator const& decorator);
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
@@ -1894,9 +1930,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
handshake(response_type& res,
|
handshake(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target, error_code& ec);
|
||||||
string_view target,
|
|
||||||
error_code& ec);
|
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
|
|
||||||
@@ -1952,8 +1986,7 @@ public:
|
|||||||
template<class RequestDecorator>
|
template<class RequestDecorator>
|
||||||
void
|
void
|
||||||
handshake_ex(string_view host,
|
handshake_ex(string_view host,
|
||||||
string_view target,
|
string_view target, RequestDecorator const& decorator,
|
||||||
RequestDecorator const& decorator,
|
|
||||||
error_code& ec);
|
error_code& ec);
|
||||||
|
|
||||||
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
/** Send an HTTP WebSocket Upgrade request and receive the response.
|
||||||
@@ -2014,10 +2047,8 @@ public:
|
|||||||
template<class RequestDecorator>
|
template<class RequestDecorator>
|
||||||
void
|
void
|
||||||
handshake_ex(response_type& res,
|
handshake_ex(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target,
|
||||||
string_view target,
|
RequestDecorator const& decorator, error_code& ec);
|
||||||
RequestDecorator const& decorator,
|
|
||||||
error_code& ec);
|
|
||||||
|
|
||||||
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
||||||
|
|
||||||
@@ -2067,8 +2098,7 @@ public:
|
|||||||
HandshakeHandler, void(error_code)>
|
HandshakeHandler, void(error_code)>
|
||||||
#endif
|
#endif
|
||||||
async_handshake(string_view host,
|
async_handshake(string_view host,
|
||||||
string_view target,
|
string_view target, HandshakeHandler&& handler);
|
||||||
HandshakeHandler&& handler);
|
|
||||||
|
|
||||||
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
||||||
|
|
||||||
@@ -2122,8 +2152,7 @@ public:
|
|||||||
HandshakeHandler, void(error_code)>
|
HandshakeHandler, void(error_code)>
|
||||||
#endif
|
#endif
|
||||||
async_handshake(response_type& res,
|
async_handshake(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target,
|
||||||
string_view target,
|
|
||||||
HandshakeHandler&& handler);
|
HandshakeHandler&& handler);
|
||||||
|
|
||||||
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
||||||
@@ -2183,8 +2212,7 @@ public:
|
|||||||
HandshakeHandler, void(error_code)>
|
HandshakeHandler, void(error_code)>
|
||||||
#endif
|
#endif
|
||||||
async_handshake_ex(string_view host,
|
async_handshake_ex(string_view host,
|
||||||
string_view target,
|
string_view target, RequestDecorator const& decorator,
|
||||||
RequestDecorator const& decorator,
|
|
||||||
HandshakeHandler&& handler);
|
HandshakeHandler&& handler);
|
||||||
|
|
||||||
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
/** Start an asynchronous operation to send an upgrade request and receive the response.
|
||||||
@@ -2248,8 +2276,7 @@ public:
|
|||||||
HandshakeHandler, void(error_code)>
|
HandshakeHandler, void(error_code)>
|
||||||
#endif
|
#endif
|
||||||
async_handshake_ex(response_type& res,
|
async_handshake_ex(response_type& res,
|
||||||
string_view host,
|
string_view host, string_view target,
|
||||||
string_view target,
|
|
||||||
RequestDecorator const& decorator,
|
RequestDecorator const& decorator,
|
||||||
HandshakeHandler&& handler);
|
HandshakeHandler&& handler);
|
||||||
|
|
||||||
@@ -2580,7 +2607,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
template<class DynamicBuffer>
|
template<class DynamicBuffer>
|
||||||
void
|
void
|
||||||
read(opcode& op, DynamicBuffer& buffer);
|
read(DynamicBuffer& buffer);
|
||||||
|
|
||||||
/** Read a message from the stream.
|
/** Read a message from the stream.
|
||||||
|
|
||||||
@@ -2620,7 +2647,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
template<class DynamicBuffer>
|
template<class DynamicBuffer>
|
||||||
void
|
void
|
||||||
read(opcode& op, DynamicBuffer& buffer, error_code& ec);
|
read(DynamicBuffer& buffer, error_code& ec);
|
||||||
|
|
||||||
/** Start an asynchronous operation to read a message from the stream.
|
/** Start an asynchronous operation to read a message from the stream.
|
||||||
|
|
||||||
@@ -2688,7 +2715,7 @@ public:
|
|||||||
async_return_type<
|
async_return_type<
|
||||||
ReadHandler, void(error_code)>
|
ReadHandler, void(error_code)>
|
||||||
#endif
|
#endif
|
||||||
async_read(opcode& op, DynamicBuffer& buffer, ReadHandler&& handler);
|
async_read(DynamicBuffer& buffer, ReadHandler&& handler);
|
||||||
|
|
||||||
/** Read a message frame from the stream.
|
/** Read a message frame from the stream.
|
||||||
|
|
||||||
|
@@ -151,10 +151,9 @@ boost::asio::ip::tcp::socket sock{ios};
|
|||||||
stream<boost::asio::ip::tcp::socket> ws{ios};
|
stream<boost::asio::ip::tcp::socket> ws{ios};
|
||||||
//[ws_snippet_15
|
//[ws_snippet_15
|
||||||
multi_buffer buffer;
|
multi_buffer buffer;
|
||||||
opcode op;
|
ws.read(buffer);
|
||||||
ws.read(op, buffer);
|
|
||||||
|
|
||||||
ws.binary(op == opcode::binary);
|
ws.text(ws.got_text());
|
||||||
ws.write(buffer.data());
|
ws.write(buffer.data());
|
||||||
buffer.consume(buffer.size());
|
buffer.consume(buffer.size());
|
||||||
//]
|
//]
|
||||||
@@ -210,9 +209,8 @@ boost::asio::ip::tcp::socket sock{ios};
|
|||||||
//]
|
//]
|
||||||
|
|
||||||
//[ws_snippet_20
|
//[ws_snippet_20
|
||||||
opcode op;
|
|
||||||
multi_buffer buffer;
|
multi_buffer buffer;
|
||||||
ws.async_read(op, buffer,
|
ws.async_read(buffer,
|
||||||
[](error_code ec)
|
[](error_code ec)
|
||||||
{
|
{
|
||||||
// Do something with the buffer
|
// Do something with the buffer
|
||||||
@@ -226,8 +224,7 @@ boost::asio::ip::tcp::socket sock{ios};
|
|||||||
void echo(stream<boost::asio::ip::tcp::socket>& ws,
|
void echo(stream<boost::asio::ip::tcp::socket>& ws,
|
||||||
multi_buffer& buffer, boost::asio::yield_context yield)
|
multi_buffer& buffer, boost::asio::yield_context yield)
|
||||||
{
|
{
|
||||||
opcode op;
|
ws.async_read(buffer, yield);
|
||||||
ws.async_read(op, buffer, yield);
|
|
||||||
std::future<void> fut =
|
std::future<void> fut =
|
||||||
ws.async_write(buffer.data(), boost::asio::use_future);
|
ws.async_write(buffer.data(), boost::asio::use_future);
|
||||||
}
|
}
|
||||||
|
@@ -130,14 +130,13 @@ public:
|
|||||||
|
|
||||||
// Receive Secure WebSocket message, print and close using Beast
|
// Receive Secure WebSocket message, print and close using Beast
|
||||||
beast::multi_buffer b;
|
beast::multi_buffer b;
|
||||||
beast::websocket::opcode op;
|
ws.read(b);
|
||||||
ws.read(op, b);
|
|
||||||
ws.close(beast::websocket::close_code::normal);
|
ws.close(beast::websocket::close_code::normal);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
ws.read(op, b);
|
ws.read(b);
|
||||||
b.consume(b.size());
|
b.consume(b.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -243,7 +243,7 @@ private:
|
|||||||
return fail("async_write", ec);
|
return fail("async_write", ec);
|
||||||
d.db.consume(d.db.size());
|
d.db.consume(d.db.size());
|
||||||
d.state = 4;
|
d.state = 4;
|
||||||
d.ws.async_read(d.op, d.db,
|
d.ws.async_read(d.db,
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ private:
|
|||||||
if(ec)
|
if(ec)
|
||||||
return fail("async_read", ec);
|
return fail("async_read", ec);
|
||||||
d.state = 3;
|
d.state = 3;
|
||||||
d.ws.binary(d.op == beast::websocket::opcode::binary);
|
d.ws.binary(d.ws.got_binary());
|
||||||
d.ws.async_write(d.db.data(),
|
d.ws.async_write(d.db.data(),
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
@@ -265,9 +265,9 @@ public:
|
|||||||
class NextLayer, class DynamicBuffer>
|
class NextLayer, class DynamicBuffer>
|
||||||
void
|
void
|
||||||
read(stream<NextLayer>& ws,
|
read(stream<NextLayer>& ws,
|
||||||
opcode& op, DynamicBuffer& buffer) const
|
DynamicBuffer& buffer) const
|
||||||
{
|
{
|
||||||
ws.read(op, buffer);
|
ws.read(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
@@ -503,10 +503,10 @@ public:
|
|||||||
class NextLayer, class DynamicBuffer>
|
class NextLayer, class DynamicBuffer>
|
||||||
void
|
void
|
||||||
read(stream<NextLayer>& ws,
|
read(stream<NextLayer>& ws,
|
||||||
opcode& op, DynamicBuffer& buffer) const
|
DynamicBuffer& buffer) const
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
ws.async_read(op, buffer, yield_[ec]);
|
ws.async_read(buffer, yield_[ec]);
|
||||||
if(ec)
|
if(ec)
|
||||||
throw system_error{ec};
|
throw system_error{ec};
|
||||||
}
|
}
|
||||||
@@ -741,9 +741,8 @@ public:
|
|||||||
cbuf(0x88, 0x82, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17));
|
cbuf(0x88, 0x82, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17));
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
opcode op;
|
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
c.read(ws, op, b);
|
c.read(ws, b);
|
||||||
fail("success", __FILE__, __LINE__);
|
fail("success", __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
catch(system_error const& e)
|
catch(system_error const& e)
|
||||||
@@ -771,9 +770,8 @@ public:
|
|||||||
BEAST_EXPECT(called);
|
BEAST_EXPECT(called);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
opcode op;
|
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
c.read(ws, op, b);
|
c.read(ws, b);
|
||||||
fail("success", __FILE__, __LINE__);
|
fail("success", __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
catch(system_error const& e)
|
catch(system_error const& e)
|
||||||
@@ -799,9 +797,8 @@ public:
|
|||||||
c.accept(ws, req);
|
c.accept(ws, req);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
opcode op;
|
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
c.read(ws, op, b);
|
c.read(ws, b);
|
||||||
fail("success", __FILE__, __LINE__);
|
fail("success", __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
catch(system_error const& e)
|
catch(system_error const& e)
|
||||||
@@ -828,9 +825,8 @@ public:
|
|||||||
cbuf(0x88, 0x82, 0xff, 0xff));
|
cbuf(0x88, 0x82, 0xff, 0xff));
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
opcode op;
|
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
c.read(ws, op, b);
|
c.read(ws, b);
|
||||||
fail("success", __FILE__, __LINE__);
|
fail("success", __FILE__, __LINE__);
|
||||||
}
|
}
|
||||||
catch(system_error const& e)
|
catch(system_error const& e)
|
||||||
@@ -1193,9 +1189,8 @@ public:
|
|||||||
ws.write(boost::asio::buffer(v), ec);
|
ws.write(boost::asio::buffer(v), ec);
|
||||||
if(! BEAST_EXPECTS(! ec, ec.message()))
|
if(! BEAST_EXPECTS(! ec, ec.message()))
|
||||||
break;
|
break;
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
ws.read(op, db, ec);
|
ws.read(db, ec);
|
||||||
if(! BEAST_EXPECTS(! ec, ec.message()))
|
if(! BEAST_EXPECTS(! ec, ec.message()))
|
||||||
break;
|
break;
|
||||||
BEAST_EXPECT(to_string(db.data()) ==
|
BEAST_EXPECT(to_string(db.data()) ==
|
||||||
@@ -1219,9 +1214,8 @@ public:
|
|||||||
ws.async_write(boost::asio::buffer(v), do_yield[ec]);
|
ws.async_write(boost::asio::buffer(v), do_yield[ec]);
|
||||||
if(! BEAST_EXPECTS(! ec, ec.message()))
|
if(! BEAST_EXPECTS(! ec, ec.message()))
|
||||||
break;
|
break;
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
ws.async_read(op, db, do_yield[ec]);
|
ws.async_read(db, do_yield[ec]);
|
||||||
if(! BEAST_EXPECTS(! ec, ec.message()))
|
if(! BEAST_EXPECTS(! ec, ec.message()))
|
||||||
break;
|
break;
|
||||||
BEAST_EXPECT(to_string(db.data()) ==
|
BEAST_EXPECT(to_string(db.data()) ==
|
||||||
@@ -1284,10 +1278,9 @@ public:
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Read
|
// Read
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
++count;
|
++count;
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
--count;
|
--count;
|
||||||
@@ -1340,12 +1333,11 @@ public:
|
|||||||
ws.binary(true);
|
ws.binary(true);
|
||||||
ws.write(buffer_cat(sbuf("TEXT"),
|
ws.write(buffer_cat(sbuf("TEXT"),
|
||||||
cbuf(0x03, 0xea, 0xf0, 0x28, 0x8c, 0xbc)));
|
cbuf(0x03, 0xea, 0xf0, 0x28, 0x8c, 0xbc)));
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
std::size_t count = 0;
|
std::size_t count = 0;
|
||||||
// Read text message with bad utf8.
|
// Read text message with bad utf8.
|
||||||
// Causes a close to be sent, blocking writes.
|
// Causes a close to be sent, blocking writes.
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
// Read should fail with protocol error
|
// Read should fail with protocol error
|
||||||
@@ -1353,7 +1345,7 @@ public:
|
|||||||
BEAST_EXPECTS(
|
BEAST_EXPECTS(
|
||||||
ec == error::failed, ec.message());
|
ec == error::failed, ec.message());
|
||||||
// Reads after failure are aborted
|
// Reads after failure are aborted
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
++count;
|
++count;
|
||||||
@@ -1408,12 +1400,11 @@ public:
|
|||||||
// Cause close to be received
|
// Cause close to be received
|
||||||
ws.binary(true);
|
ws.binary(true);
|
||||||
ws.write(sbuf("CLOSE"));
|
ws.write(sbuf("CLOSE"));
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
std::size_t count = 0;
|
std::size_t count = 0;
|
||||||
// Read a close frame.
|
// Read a close frame.
|
||||||
// Sends a close frame, blocking writes.
|
// Sends a close frame, blocking writes.
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
// Read should complete with error::closed
|
// Read should complete with error::closed
|
||||||
@@ -1474,10 +1465,9 @@ public:
|
|||||||
// Cause close to be received
|
// Cause close to be received
|
||||||
ws.binary(true);
|
ws.binary(true);
|
||||||
ws.write(sbuf("CLOSE"));
|
ws.write(sbuf("CLOSE"));
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
std::size_t count = 0;
|
std::size_t count = 0;
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
++count;
|
++count;
|
||||||
@@ -1525,9 +1515,8 @@ public:
|
|||||||
BEAST_EXPECT(! ec);
|
BEAST_EXPECT(! ec);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
ws.async_read(op, db,
|
ws.async_read(db,
|
||||||
[&](error_code ec)
|
[&](error_code ec)
|
||||||
{
|
{
|
||||||
BEAST_EXPECTS(ec == error::closed, ec.message());
|
BEAST_EXPECTS(ec == error::closed, ec.message());
|
||||||
@@ -1558,8 +1547,7 @@ public:
|
|||||||
ws.write_frame(false, sbuf("u"));
|
ws.write_frame(false, sbuf("u"));
|
||||||
ws.write_frame(true, sbuf("v"));
|
ws.write_frame(true, sbuf("v"));
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
opcode op;
|
ws.read(b, ec);
|
||||||
ws.read(op, b, ec);
|
|
||||||
if(! BEAST_EXPECTS(! ec, ec.message()))
|
if(! BEAST_EXPECTS(! ec, ec.message()))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1617,9 +1605,8 @@ public:
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
fail();
|
fail();
|
||||||
throw abort_test{};
|
throw abort_test{};
|
||||||
}
|
}
|
||||||
@@ -1651,10 +1638,9 @@ public:
|
|||||||
c.write(ws, sbuf("Hello"));
|
c.write(ws, sbuf("Hello"));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
BEAST_EXPECT(op == opcode::text);
|
BEAST_EXPECT(ws.got_text());
|
||||||
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1685,11 +1671,10 @@ public:
|
|||||||
c.write(ws, sbuf("Hello"));
|
c.write(ws, sbuf("Hello"));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
BEAST_EXPECT(pong == 1);
|
BEAST_EXPECT(pong == 1);
|
||||||
BEAST_EXPECT(op == opcode::binary);
|
BEAST_EXPECT(ws.got_binary());
|
||||||
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
||||||
}
|
}
|
||||||
ws.ping_callback({});
|
ws.ping_callback({});
|
||||||
@@ -1707,9 +1692,8 @@ public:
|
|||||||
c.write_frame(ws, true, sbuf("World!"));
|
c.write_frame(ws, true, sbuf("World!"));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
BEAST_EXPECT(pong == 1);
|
BEAST_EXPECT(pong == 1);
|
||||||
BEAST_EXPECT(to_string(db.data()) == "Hello, World!");
|
BEAST_EXPECT(to_string(db.data()) == "Hello, World!");
|
||||||
}
|
}
|
||||||
@@ -1724,9 +1708,8 @@ public:
|
|||||||
c.write(ws, sbuf("Now is the time for all good men"));
|
c.write(ws, sbuf("Now is the time for all good men"));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer b;
|
multi_buffer b;
|
||||||
c.read(ws, op, b);
|
c.read(ws, b);
|
||||||
BEAST_EXPECT(to_string(b.data()) == "Now is the time for all good men");
|
BEAST_EXPECT(to_string(b.data()) == "Now is the time for all good men");
|
||||||
}
|
}
|
||||||
ws.auto_fragment(false);
|
ws.auto_fragment(false);
|
||||||
@@ -1739,9 +1722,8 @@ public:
|
|||||||
c.write(ws, buffer(s.data(), s.size()));
|
c.write(ws, buffer(s.data(), s.size()));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
BEAST_EXPECT(to_string(db.data()) == s);
|
BEAST_EXPECT(to_string(db.data()) == s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1753,10 +1735,9 @@ public:
|
|||||||
c.write(ws, sbuf("Hello"));
|
c.write(ws, sbuf("Hello"));
|
||||||
{
|
{
|
||||||
// receive echoed message
|
// receive echoed message
|
||||||
opcode op;
|
|
||||||
multi_buffer db;
|
multi_buffer db;
|
||||||
c.read(ws, op, db);
|
c.read(ws, db);
|
||||||
BEAST_EXPECT(op == opcode::text);
|
BEAST_EXPECT(ws.got_text());
|
||||||
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
BEAST_EXPECT(to_string(db.data()) == "Hello");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -312,7 +312,7 @@ private:
|
|||||||
d.db.consume(d.db.size());
|
d.db.consume(d.db.size());
|
||||||
// read message
|
// read message
|
||||||
d.state = 2;
|
d.state = 2;
|
||||||
d.ws.async_read(d.op, d.db,
|
d.ws.async_read(d.db,
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -357,7 +357,7 @@ private:
|
|||||||
}
|
}
|
||||||
// write message
|
// write message
|
||||||
d.state = 1;
|
d.state = 1;
|
||||||
d.ws.binary(d.op == beast::websocket::opcode::binary);
|
d.ws.binary(d.ws.got_binary());
|
||||||
d.ws.async_write(d.db.data(),
|
d.ws.async_write(d.db.data(),
|
||||||
d.strand.wrap(std::move(*this)));
|
d.strand.wrap(std::move(*this)));
|
||||||
return;
|
return;
|
||||||
|
@@ -304,15 +304,14 @@ private:
|
|||||||
}
|
}
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
beast::websocket::opcode op;
|
|
||||||
beast::multi_buffer b;
|
beast::multi_buffer b;
|
||||||
ws.read(op, b, ec);
|
ws.read(b, ec);
|
||||||
if(ec)
|
if(ec)
|
||||||
{
|
{
|
||||||
auto const s = ec.message();
|
auto const s = ec.message();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ws.binary(op == beast::websocket::opcode::binary);
|
ws.binary(ws.got_binary());
|
||||||
if(match(b, "RAW"))
|
if(match(b, "RAW"))
|
||||||
{
|
{
|
||||||
boost::asio::write(
|
boost::asio::write(
|
||||||
|
Reference in New Issue
Block a user