mirror of
https://github.com/boostorg/beast.git
synced 2025-07-30 21:07:26 +02:00
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:
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
|
@ -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_,
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user