diff --git a/CHANGELOG.md b/CHANGELOG.md index ac4fc4b9..23f1612e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ * More flat_streambuf tests * WebSocket doc work +API Changes: + +* Refactor WebSocket error codes (API Change) + -------------------------------------------------------------------------------- 1.0.0-b37 diff --git a/include/beast/websocket/error.hpp b/include/beast/websocket/error.hpp index 8189a1c2..e36a37fa 100644 --- a/include/beast/websocket/error.hpp +++ b/include/beast/websocket/error.hpp @@ -23,32 +23,8 @@ enum class error /// WebSocket connection failed, protocol violation failed, - /// Upgrade request failed, connection is closed - 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 + /// Upgrade handshake failed + handshake_failed }; } // websocket diff --git a/include/beast/websocket/impl/error.ipp b/include/beast/websocket/impl/error.ipp index a31d2020..b442856d 100644 --- a/include/beast/websocket/impl/error.ipp +++ b/include/beast/websocket/impl/error.ipp @@ -39,14 +39,7 @@ public: case error::closed: return "WebSocket connection closed normally"; case error::failed: return "WebSocket connection failed due to a protocol violation"; 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: return "websocket error"; } diff --git a/include/beast/websocket/impl/stream.ipp b/include/beast/websocket/impl/stream.ipp index 618a9a4a..3470c5db 100644 --- a/include/beast/websocket/impl/stream.ipp +++ b/include/beast/websocket/impl/stream.ipp @@ -289,23 +289,30 @@ stream:: do_response(http::response_header const& res, detail::sec_ws_key_type const& key, error_code& ec) { - // VFALCO Review these error codes - auto fail = [&]{ ec = error::response_failed; }; - if(res.version < 11) - return fail(); - if(res.status != 101) - return fail(); - if(! is_upgrade(res)) - return fail(); - if(! http::token_list{res.fields["Upgrade"]}.exists("websocket")) - return fail(); - if(! res.fields.exists("Sec-WebSocket-Accept")) - return fail(); - detail::sec_ws_accept_type accept; - detail::make_sec_ws_accept(accept, key); - if(accept.compare( - res.fields["Sec-WebSocket-Accept"]) != 0) - return fail(); + bool const success = [&]() + { + if(res.version < 11) + return false; + if(res.status != 101) + return false; + if(! is_upgrade(res)) + return false; + if(! http::token_list{res.fields["Upgrade"]}.exists("websocket")) + return false; + if(! res.fields.exists("Sec-WebSocket-Accept")) + return false; + detail::sec_ws_accept_type accept; + detail::make_sec_ws_accept(accept, key); + if(accept.compare( + res.fields["Sec-WebSocket-Accept"]) != 0) + return false; + return true; + }(); + if(! success) + { + ec = error::handshake_failed; + return; + } detail::pmd_offer offer; pmd_read(offer, res.fields); // VFALCO see if offer satisfies pmd_config_, diff --git a/test/websocket/error.cpp b/test/websocket/error.cpp index 9c02468c..6f7f4947 100644 --- a/test/websocket/error.cpp +++ b/test/websocket/error.cpp @@ -37,14 +37,6 @@ public: check("websocket", error::closed); check("websocket", error::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); } }; diff --git a/test/websocket/stream.cpp b/test/websocket/stream.cpp index f9fa9037..2bdbf33c 100644 --- a/test/websocket/stream.cpp +++ b/test/websocket/stream.cpp @@ -1107,7 +1107,7 @@ public: } catch(system_error const& se) { - BEAST_EXPECT(se.code() == error::response_failed); + BEAST_EXPECT(se.code() == error::handshake_failed); } }; // wrong HTTP version