Autobahn|Testsuite fixes

This commit is contained in:
Vinnie Falco
2017-08-13 17:25:48 -07:00
parent 5940002c96
commit 66b657a85f
5 changed files with 47 additions and 40 deletions

View File

@ -14,6 +14,7 @@ WebSocket:
* Refactor close_op * Refactor close_op
* Refactor read_op + fail_op * Refactor read_op + fail_op
* Websocket close will automatically drain * Websocket close will automatically drain
* Autobahn|Testsuite fixes
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@ -104,7 +104,6 @@ do_sync_session(tcp::socket& socket)
break; break;
if(ec) if(ec)
return fail(ec, "read"); return fail(ec, "read");
ws.text(ws.got_text()); ws.text(ws.got_text());
ws.write(buffer.data(), ec); ws.write(buffer.data(), ec);
if(ec) if(ec)

View File

@ -210,17 +210,21 @@ operator()(
ws_.rd_.key); ws_.rd_.key);
if(detail::is_control(ws_.rd_.fh.op)) if(detail::is_control(ws_.rd_.fh.op))
{ {
// Clear this otherwise the next
// frame will be considered final.
ws_.rd_.fh.fin = false;
// Handle ping frame // Handle ping frame
if(ws_.rd_.fh.op == detail::opcode::ping) if(ws_.rd_.fh.op == detail::opcode::ping)
{ {
{ {
auto const cb = buffer_prefix( auto const b = buffer_prefix(
clamp(ws_.rd_.fh.len), clamp(ws_.rd_.fh.len),
ws_.rd_.buf.data()); ws_.rd_.buf.data());
auto const len = buffer_size(cb); auto const len = buffer_size(b);
BOOST_ASSERT(len == ws_.rd_.fh.len); BOOST_ASSERT(len == ws_.rd_.fh.len);
ping_data payload; ping_data payload;
detail::read_ping(payload, cb); detail::read_ping(payload, b);
ws_.rd_.buf.consume(len); ws_.rd_.buf.consume(len);
// Ignore ping when closing // Ignore ping when closing
if(ws_.wr_close_) if(ws_.wr_close_)
@ -356,11 +360,9 @@ operator()(
// get fewer bytes at the cost of one I/O. // get fewer bytes at the cost of one I/O.
BOOST_ASIO_CORO_YIELD BOOST_ASIO_CORO_YIELD
ws_.stream_.async_read_some( ws_.stream_.async_read_some(
ws_.rd_.buf.prepare( ws_.rd_.buf.prepare(read_size(
read_size( ws_.rd_.buf, ws_.rd_.buf.max_size())),
ws_.rd_.buf, std::move(*this));
ws_.rd_.buf.max_size())),
std::move(*this));
dispatched_ = true; dispatched_ = true;
ws_.failed_ = !!ec; ws_.failed_ = !!ec;
if(ws_.failed_) if(ws_.failed_)
@ -954,15 +956,20 @@ loop:
if(detail::is_control(rd_.fh.op)) if(detail::is_control(rd_.fh.op))
{ {
// Get control frame payload // Get control frame payload
auto const cb = buffer_prefix( auto const b = buffer_prefix(
clamp(rd_.fh.len), rd_.buf.data()); clamp(rd_.fh.len), rd_.buf.data());
auto const len = buffer_size(cb); auto const len = buffer_size(b);
BOOST_ASSERT(len == rd_.fh.len); BOOST_ASSERT(len == rd_.fh.len);
// Process control frame
// Clear this otherwise the next
// frame will be considered final.
rd_.fh.fin = false;
// Handle ping frame
if(rd_.fh.op == detail::opcode::ping) if(rd_.fh.op == detail::opcode::ping)
{ {
ping_data payload; ping_data payload;
detail::read_ping(payload, cb); detail::read_ping(payload, b);
rd_.buf.consume(len); rd_.buf.consume(len);
if(wr_close_) if(wr_close_)
{ {
@ -980,21 +987,23 @@ loop:
return bytes_written; return bytes_written;
goto loop; goto loop;
} }
else if(rd_.fh.op == detail::opcode::pong) // Handle pong frame
if(rd_.fh.op == detail::opcode::pong)
{ {
ping_data payload; ping_data payload;
detail::read_ping(payload, cb); detail::read_ping(payload, b);
rd_.buf.consume(len); rd_.buf.consume(len);
if(ctrl_cb_) if(ctrl_cb_)
ctrl_cb_(frame_type::pong, payload); ctrl_cb_(frame_type::pong, payload);
goto loop; goto loop;
} }
// Handle close frame
BOOST_ASSERT(rd_.fh.op == detail::opcode::close); BOOST_ASSERT(rd_.fh.op == detail::opcode::close);
{ {
BOOST_ASSERT(! rd_close_); BOOST_ASSERT(! rd_close_);
rd_close_ = true; rd_close_ = true;
close_reason cr; close_reason cr;
detail::read_close(cr, cb, code); detail::read_close(cr, b, code);
if(code != close_code::none) if(code != close_code::none)
{ {
// _Fail the WebSocket Connection_ // _Fail the WebSocket Connection_
@ -1040,18 +1049,16 @@ loop:
{ {
// Fill the read buffer first, otherwise we // Fill the read buffer first, otherwise we
// get fewer bytes at the cost of one I/O. // get fewer bytes at the cost of one I/O.
auto const mb = rd_.buf.prepare( rd_.buf.commit(stream_.read_some(
read_size(rd_.buf, rd_.buf.max_size())); rd_.buf.prepare(read_size(rd_.buf,
auto const bytes_transferred = rd_.buf.max_size())), ec));
stream_.read_some(mb, ec);
failed_ = !!ec; failed_ = !!ec;
if(failed_) if(failed_)
return bytes_written; return bytes_written;
if(rd_.fh.mask) if(rd_.fh.mask)
detail::mask_inplace(buffer_prefix( detail::mask_inplace(
clamp(rd_.remain), mb), rd_.key); buffer_prefix(clamp(rd_.remain),
// VFALCO Do this before masking for symmetry with the async version rd_.buf.data()), rd_.key);
rd_.buf.commit(bytes_transferred);
} }
if(rd_.buf.size() > 0) if(rd_.buf.size() > 0)
{ {

View File

@ -304,10 +304,10 @@ parse_fh(
consuming_buffers<typename consuming_buffers<typename
DynamicBuffer::const_buffers_type> cb{ DynamicBuffer::const_buffers_type> cb{
b.data()}; b.data()};
std::size_t need;
{ {
std::uint8_t tmp[2]; std::uint8_t tmp[2];
cb.consume(buffer_copy(buffer(tmp), cb)); cb.consume(buffer_copy(buffer(tmp), cb));
std::size_t need;
fh.len = tmp[1] & 0x7f; fh.len = tmp[1] & 0x7f;
switch(fh.len) switch(fh.len)
{ {
@ -393,7 +393,7 @@ parse_fh(
if(role_ == role_type::client && fh.mask) if(role_ == role_type::client && fh.mask)
return err(close_code::protocol_error); return err(close_code::protocol_error);
if(detail::is_control(fh.op) && if(detail::is_control(fh.op) &&
buffer_size(cb) < fh.len) buffer_size(cb) < need + fh.len)
{ {
// Make the entire control frame payload // Make the entire control frame payload
// get read in before we return `true` // get read in before we return `true`
@ -489,24 +489,24 @@ write_close(DynamicBuffer& db, close_reason const& cr)
if(fh.mask) if(fh.mask)
detail::prepare_key(key, fh.key); detail::prepare_key(key, fh.key);
{ {
std::uint8_t b[2]; std::uint8_t tmp[2];
::new(&b[0]) big_uint16_buf_t{ ::new(&tmp[0]) big_uint16_buf_t{
(std::uint16_t)cr.code}; (std::uint16_t)cr.code};
auto d = db.prepare(2); auto mb = db.prepare(2);
boost::asio::buffer_copy(d, boost::asio::buffer_copy(mb,
boost::asio::buffer(b)); boost::asio::buffer(tmp));
if(fh.mask) if(fh.mask)
detail::mask_inplace(d, key); detail::mask_inplace(mb, key);
db.commit(2); db.commit(2);
} }
if(! cr.reason.empty()) if(! cr.reason.empty())
{ {
auto d = db.prepare(cr.reason.size()); auto mb = db.prepare(cr.reason.size());
boost::asio::buffer_copy(d, boost::asio::buffer_copy(mb,
boost::asio::const_buffer( boost::asio::const_buffer(
cr.reason.data(), cr.reason.size())); cr.reason.data(), cr.reason.size()));
if(fh.mask) if(fh.mask)
detail::mask_inplace(d, key); detail::mask_inplace(mb, key);
db.commit(cr.reason.size()); db.commit(cr.reason.size());
} }
} }
@ -535,12 +535,12 @@ write_ping(DynamicBuffer& db,
detail::prepared_key key; detail::prepared_key key;
if(fh.mask) if(fh.mask)
detail::prepare_key(key, fh.key); detail::prepare_key(key, fh.key);
auto d = db.prepare(data.size()); auto mb = db.prepare(data.size());
boost::asio::buffer_copy(d, boost::asio::buffer_copy(mb,
boost::asio::const_buffers_1( boost::asio::const_buffers_1(
data.data(), data.size())); data.data(), data.size()));
if(fh.mask) if(fh.mask)
detail::mask_inplace(d, key); detail::mask_inplace(mb, key);
db.commit(data.size()); db.commit(data.size());
} }

View File

@ -3766,11 +3766,11 @@ private:
template<class DynamicBuffer> template<class DynamicBuffer>
void void
write_close(DynamicBuffer& db, close_reason const& rc); write_close(DynamicBuffer& b, close_reason const& rc);
template<class DynamicBuffer> template<class DynamicBuffer>
void void
write_ping(DynamicBuffer& db, write_ping(DynamicBuffer& b,
detail::opcode op, ping_data const& data); detail::opcode op, ping_data const& data);
template<class Decorator> template<class Decorator>