Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1443)

Unified Diff: net/websockets/websocket_basic_handshake_stream.cc

Issue 1047623002: Support parsing a Sec-WebSocket-Extensions header with multiple elements (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clear extensions_ if errored Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/websockets/websocket_basic_handshake_stream.cc
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index ecddd50fcfc850c88df9cd69a953773c971b1066..9c939a5e5bc5e541e3bb8a672ad23192a2ac4455 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -303,47 +303,51 @@ bool ValidatePerMessageDeflateExtension(const WebSocketExtension& extension,
}
bool ValidateExtensions(const HttpResponseHeaders* headers,
- const std::vector<std::string>& requested_extensions,
- std::string* extensions,
+ std::string* accepted_extensions_descriptor,
std::string* failure_message,
WebSocketExtensionParams* params) {
void* state = nullptr;
- std::string value;
- std::vector<std::string> accepted_extensions;
+ std::string header_value;
+ std::vector<std::string> header_values;
// TODO(ricea): If adding support for additional extensions, generalise this
// code.
bool seen_permessage_deflate = false;
- while (headers->EnumerateHeader(
- &state, websockets::kSecWebSocketExtensions, &value)) {
+ while (headers->EnumerateHeader(&state, websockets::kSecWebSocketExtensions,
+ &header_value)) {
WebSocketExtensionParser parser;
- parser.Parse(value);
+ parser.Parse(header_value);
if (parser.has_error()) {
// TODO(yhirano) Set appropriate failure message.
*failure_message =
"'Sec-WebSocket-Extensions' header value is "
"rejected by the parser: " +
- value;
+ header_value;
return false;
}
- if (parser.extension().name() == "permessage-deflate") {
- if (seen_permessage_deflate) {
- *failure_message = "Received duplicate permessage-deflate response";
+
+ const std::vector<WebSocketExtension>& extensions = parser.extensions();
+ for (size_t i = 0; i < extensions.size(); ++i) {
eroman 2015/03/31 21:11:12 optional: "for-in" loop
tyoshino (SeeGerritForStatus) 2015/04/01 04:57:57 Done.
+ const WebSocketExtension& extension = extensions[i];
+ if (extension.name() == "permessage-deflate") {
+ if (seen_permessage_deflate) {
+ *failure_message = "Received duplicate permessage-deflate response";
+ return false;
+ }
+ seen_permessage_deflate = true;
+
+ if (!ValidatePerMessageDeflateExtension(extension, failure_message,
+ params))
eroman 2015/03/31 21:11:12 Add curly braces since the if occupies more than 1
tyoshino (SeeGerritForStatus) 2015/04/01 04:57:57 Done.
+ return false;
+ header_values.push_back(header_value);
+ } else {
+ *failure_message = "Found an unsupported extension '" +
+ extension.name() +
+ "' in 'Sec-WebSocket-Extensions' header";
return false;
}
- seen_permessage_deflate = true;
- if (!ValidatePerMessageDeflateExtension(
- parser.extension(), failure_message, params))
- return false;
- } else {
- *failure_message =
- "Found an unsupported extension '" +
- parser.extension().name() +
- "' in 'Sec-WebSocket-Extensions' header";
- return false;
}
- accepted_extensions.push_back(value);
}
- *extensions = JoinString(accepted_extensions, ", ");
+ *accepted_extensions_descriptor = JoinString(header_values, ", ");
return true;
}
@@ -636,7 +640,6 @@ int WebSocketBasicHandshakeStream::ValidateUpgradeResponse(
&sub_protocol_,
&failure_message) &&
ValidateExtensions(headers,
- requested_extensions_,
&extensions_,
&failure_message,
extension_params_.get())) {

Powered by Google App Engine
This is Rietveld 408576698