OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/websockets/websocket_basic_handshake_stream.h" | 5 #include "net/websockets/websocket_basic_handshake_stream.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
235 typedef std::vector<WebSocketExtension::Parameter> ParameterVector; | 235 typedef std::vector<WebSocketExtension::Parameter> ParameterVector; |
236 | 236 |
237 DCHECK_EQ("permessage-deflate", extension.name()); | 237 DCHECK_EQ("permessage-deflate", extension.name()); |
238 const ParameterVector& parameters = extension.parameters(); | 238 const ParameterVector& parameters = extension.parameters(); |
239 std::set<std::string> seen_names; | 239 std::set<std::string> seen_names; |
240 for (ParameterVector::const_iterator it = parameters.begin(); | 240 for (ParameterVector::const_iterator it = parameters.begin(); |
241 it != parameters.end(); ++it) { | 241 it != parameters.end(); ++it) { |
242 const std::string& name = it->name(); | 242 const std::string& name = it->name(); |
243 if (seen_names.count(name) != 0) { | 243 if (seen_names.count(name) != 0) { |
244 *failure_message = | 244 *failure_message = |
245 "Received duplicate permessage-deflate extension parameter " + name; | 245 "Error in permessage-deflate: " |
Adam Rice
2014/02/10 10:16:14
There are enough of these that it is probably wort
yhirano
2014/02/10 12:17:33
Done.
| |
246 "Received duplicate permessage-deflate extension parameter " + | |
247 name; | |
246 return false; | 248 return false; |
247 } | 249 } |
248 seen_names.insert(name); | 250 seen_names.insert(name); |
249 const std::string client_or_server(name, 0, kPrefixLen); | 251 const std::string client_or_server(name, 0, kPrefixLen); |
250 const bool is_client = (client_or_server == kClientPrefix); | 252 const bool is_client = (client_or_server == kClientPrefix); |
251 if (!is_client && client_or_server != kServerPrefix) { | 253 if (!is_client && client_or_server != kServerPrefix) { |
252 *failure_message = | 254 *failure_message = |
255 "Error in permessage-deflate: " | |
253 "Received an unexpected permessage-deflate extension parameter"; | 256 "Received an unexpected permessage-deflate extension parameter"; |
254 return false; | 257 return false; |
255 } | 258 } |
256 const std::string rest(name, kPrefixLen); | 259 const std::string rest(name, kPrefixLen); |
257 if (rest == kNoContextTakeover) { | 260 if (rest == kNoContextTakeover) { |
258 if (it->HasValue()) { | 261 if (it->HasValue()) { |
259 *failure_message = "Received invalid " + name + " parameter"; | 262 *failure_message = "Error in permessage-deflate: Received invalid " + |
263 name + " parameter"; | |
260 return false; | 264 return false; |
261 } | 265 } |
262 if (is_client) | 266 if (is_client) |
263 params->deflate_mode = WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT; | 267 params->deflate_mode = WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT; |
264 } else if (rest == kMaxWindowBits) { | 268 } else if (rest == kMaxWindowBits) { |
265 if (!it->HasValue()) { | 269 if (!it->HasValue()) { |
266 *failure_message = name + " must have value"; | 270 *failure_message = |
271 "Error in permessage-deflate: " + name + " must have value"; | |
267 return false; | 272 return false; |
268 } | 273 } |
269 int bits = 0; | 274 int bits = 0; |
270 if (!base::StringToInt(it->value(), &bits) || bits < 8 || bits > 15 || | 275 if (!base::StringToInt(it->value(), &bits) || bits < 8 || bits > 15 || |
271 it->value()[0] == '0' || | 276 it->value()[0] == '0' || |
272 it->value().find_first_not_of("0123456789") != std::string::npos) { | 277 it->value().find_first_not_of("0123456789") != std::string::npos) { |
273 *failure_message = "Received invalid " + name + " parameter"; | 278 *failure_message = "Error in permessage-deflate: Received invalid " + |
279 name + " parameter"; | |
274 return false; | 280 return false; |
275 } | 281 } |
276 if (is_client) | 282 if (is_client) |
277 params->client_window_bits = bits; | 283 params->client_window_bits = bits; |
278 } else { | 284 } else { |
279 *failure_message = | 285 *failure_message = |
286 "Error in permessage-deflate: " | |
280 "Received an unexpected permessage-deflate extension parameter"; | 287 "Received an unexpected permessage-deflate extension parameter"; |
281 return false; | 288 return false; |
282 } | 289 } |
283 } | 290 } |
284 params->deflate_enabled = true; | 291 params->deflate_enabled = true; |
285 return true; | 292 return true; |
286 } | 293 } |
287 | 294 |
288 bool ValidateExtensions(const HttpResponseHeaders* headers, | 295 bool ValidateExtensions(const HttpResponseHeaders* headers, |
289 const std::vector<std::string>& requested_extensions, | 296 const std::vector<std::string>& requested_extensions, |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
596 &extensions_, | 603 &extensions_, |
597 &failure_message_, | 604 &failure_message_, |
598 extension_params_.get())) { | 605 extension_params_.get())) { |
599 return OK; | 606 return OK; |
600 } | 607 } |
601 failure_message_ = "Error during WebSocket handshake: " + failure_message_; | 608 failure_message_ = "Error during WebSocket handshake: " + failure_message_; |
602 return ERR_INVALID_RESPONSE; | 609 return ERR_INVALID_RESPONSE; |
603 } | 610 } |
604 | 611 |
605 } // namespace net | 612 } // namespace net |
OLD | NEW |