Chromium Code Reviews| 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..5645135640e34c52a45dba880b952e7269ed289c 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're multiple permessage-deflate extensions or there is any unknown |
|
eroman
2015/03/31 21:11:12
there're --> there are
there is any unknown --> th
tyoshino (SeeGerritForStatus)
2015/04/01 04:57:57
Done.
|
| + // extensions. |
| + for (size_t i = 0; i < extensions.size(); ++i) { |
|
eroman
2015/03/31 21:11:12
nit: You use a traditional for loop here, however
tyoshino (SeeGerritForStatus)
2015/04/01 04:57:57
Done.
|
| + if (extensions[i].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 = |
| + extensions[i].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) { |