Refactor WebSocket error codes (API Change):

fix #325

This removes unused and misleading handshake error codes.
All semantic handshake failures are now reported using
the same code, error::handshake_failed. Errors originating
from stream operations still use the underlying stream
error codes (for example: boost::asio::error::connection_reset).
This commit is contained in:
Vinnie Falco
2017-05-01 20:49:51 -07:00
parent 30d0e9b1e7
commit 3da0d8b6a9
6 changed files with 31 additions and 59 deletions

View File

@ -8,6 +8,10 @@
* More flat_streambuf tests * More flat_streambuf tests
* WebSocket doc work * WebSocket doc work
API Changes:
* Refactor WebSocket error codes (API Change)
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1.0.0-b37 1.0.0-b37

View File

@ -23,32 +23,8 @@ enum class error
/// WebSocket connection failed, protocol violation /// WebSocket connection failed, protocol violation
failed, failed,
/// Upgrade request failed, connection is closed /// Upgrade handshake failed
handshake_failed, handshake_failed
/// Upgrade request failed, but connection is still open
keep_alive,
/// HTTP response is malformed
response_malformed,
/// HTTP response failed the upgrade
response_failed,
/// Upgrade request denied for invalid fields.
response_denied,
/// Upgrade request is malformed
request_malformed,
/// Upgrade request fields incorrect
request_invalid,
/// Upgrade request denied
request_denied,
/// General WebSocket error
general
}; };
} // websocket } // websocket

View File

@ -39,14 +39,7 @@ public:
case error::closed: return "WebSocket connection closed normally"; case error::closed: return "WebSocket connection closed normally";
case error::failed: return "WebSocket connection failed due to a protocol violation"; case error::failed: return "WebSocket connection failed due to a protocol violation";
case error::handshake_failed: return "WebSocket Upgrade handshake failed"; case error::handshake_failed: return "WebSocket Upgrade handshake failed";
case error::keep_alive: return "WebSocket Upgrade handshake failed but connection is still open";
case error::response_malformed: return "malformed HTTP response";
case error::response_failed: return "upgrade request failed";
case error::response_denied: return "upgrade request denied";
case error::request_malformed: return "malformed HTTP request";
case error::request_invalid: return "upgrade request invalid";
case error::request_denied: return "upgrade request denied";
default: default:
return "websocket error"; return "websocket error";
} }

View File

@ -289,23 +289,30 @@ stream<NextLayer>::
do_response(http::response_header const& res, do_response(http::response_header const& res,
detail::sec_ws_key_type const& key, error_code& ec) detail::sec_ws_key_type const& key, error_code& ec)
{ {
// VFALCO Review these error codes bool const success = [&]()
auto fail = [&]{ ec = error::response_failed; }; {
if(res.version < 11) if(res.version < 11)
return fail(); return false;
if(res.status != 101) if(res.status != 101)
return fail(); return false;
if(! is_upgrade(res)) if(! is_upgrade(res))
return fail(); return false;
if(! http::token_list{res.fields["Upgrade"]}.exists("websocket")) if(! http::token_list{res.fields["Upgrade"]}.exists("websocket"))
return fail(); return false;
if(! res.fields.exists("Sec-WebSocket-Accept")) if(! res.fields.exists("Sec-WebSocket-Accept"))
return fail(); return false;
detail::sec_ws_accept_type accept; detail::sec_ws_accept_type accept;
detail::make_sec_ws_accept(accept, key); detail::make_sec_ws_accept(accept, key);
if(accept.compare( if(accept.compare(
res.fields["Sec-WebSocket-Accept"]) != 0) res.fields["Sec-WebSocket-Accept"]) != 0)
return fail(); return false;
return true;
}();
if(! success)
{
ec = error::handshake_failed;
return;
}
detail::pmd_offer offer; detail::pmd_offer offer;
pmd_read(offer, res.fields); pmd_read(offer, res.fields);
// VFALCO see if offer satisfies pmd_config_, // VFALCO see if offer satisfies pmd_config_,

View File

@ -37,14 +37,6 @@ public:
check("websocket", error::closed); check("websocket", error::closed);
check("websocket", error::failed); check("websocket", error::failed);
check("websocket", error::handshake_failed); check("websocket", error::handshake_failed);
check("websocket", error::keep_alive);
check("websocket", error::response_malformed);
check("websocket", error::response_failed);
check("websocket", error::response_denied);
check("websocket", error::request_malformed);
check("websocket", error::request_invalid);
check("websocket", error::request_denied);
check("websocket", error::general);
} }
}; };

View File

@ -1107,7 +1107,7 @@ public:
} }
catch(system_error const& se) catch(system_error const& se)
{ {
BEAST_EXPECT(se.code() == error::response_failed); BEAST_EXPECT(se.code() == error::handshake_failed);
} }
}; };
// wrong HTTP version // wrong HTTP version