Index: net/server/web_socket_encoder.cc |
diff --git a/net/server/web_socket_encoder.cc b/net/server/web_socket_encoder.cc |
index 0b4a765e9d8833ae0db4892bd75286efb1806b8f..8e1681c8a7233d3878fb0180fc16e5d88e4f3384 100644 |
--- a/net/server/web_socket_encoder.cc |
+++ b/net/server/web_socket_encoder.cc |
@@ -233,7 +233,7 @@ WebSocketEncoder* WebSocketEncoder::CreateClient( |
} |
// static |
-void WebSocketEncoder::ParseExtensions(const std::string& extensions, |
+void WebSocketEncoder::ParseExtensions(const std::string& header_value, |
bool* deflate, |
bool* has_client_window_bits, |
int* client_window_bits, |
@@ -247,40 +247,51 @@ void WebSocketEncoder::ParseExtensions(const std::string& extensions, |
*client_no_context_takeover = false; |
*server_no_context_takeover = false; |
- if (extensions.empty()) |
+ if (header_value.empty()) |
return; |
- // TODO(dgozman): split extensions header if another extension is introduced. |
WebSocketExtensionParser parser; |
- parser.Parse(extensions); |
+ parser.Parse(header_value); |
if (parser.has_error()) |
return; |
- if (parser.extension().name() != "permessage-deflate") |
- return; |
+ const std::vector<WebSocketExtension>& extensions = parser.extensions(); |
+ // TODO(tyoshino): Fail if this method is used for parsing a response and |
+ // there are multiple permessage-deflate extensions or there are any unknown |
+ // extensions. |
+ for (const auto& extension : extensions) { |
+ if (extension.name() != "permessage-deflate") { |
+ continue; |
+ } |
- const std::vector<WebSocketExtension::Parameter>& parameters = |
- parser.extension().parameters(); |
- for (const auto& param : parameters) { |
- const std::string& name = param.name(); |
- if (name == "client_max_window_bits") { |
- *has_client_window_bits = true; |
- if (param.HasValue()) { |
+ const std::vector<WebSocketExtension::Parameter>& parameters = |
+ extension.parameters(); |
+ for (const auto& param : parameters) { |
+ const std::string& name = param.name(); |
+ // TODO(tyoshino): Fail the connection when an invalid value is given. |
+ if (name == "client_max_window_bits") { |
+ *has_client_window_bits = true; |
+ if (param.HasValue()) { |
+ int bits = 0; |
+ if (base::StringToInt(param.value(), &bits) && bits >= 8 && |
+ bits <= 15) { |
+ *client_window_bits = bits; |
+ } |
+ } |
+ } |
+ if (name == "server_max_window_bits" && param.HasValue()) { |
int bits = 0; |
if (base::StringToInt(param.value(), &bits) && bits >= 8 && bits <= 15) |
- *client_window_bits = bits; |
+ *server_window_bits = bits; |
} |
+ if (name == "client_no_context_takeover") |
+ *client_no_context_takeover = true; |
+ if (name == "server_no_context_takeover") |
+ *server_no_context_takeover = true; |
} |
- if (name == "server_max_window_bits" && param.HasValue()) { |
- int bits = 0; |
- if (base::StringToInt(param.value(), &bits) && bits >= 8 && bits <= 15) |
- *server_window_bits = bits; |
- } |
- if (name == "client_no_context_takeover") |
- *client_no_context_takeover = true; |
- if (name == "server_no_context_takeover") |
- *server_no_context_takeover = true; |
+ *deflate = true; |
+ |
+ break; |
} |
- *deflate = true; |
} |
WebSocketEncoder::WebSocketEncoder(bool is_server) : is_server_(is_server) { |