Chromium Code Reviews| 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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 return DeflateError( | 296 return DeflateError( |
| 297 failure_message, | 297 failure_message, |
| 298 "Received an unexpected permessage-deflate extension parameter"); | 298 "Received an unexpected permessage-deflate extension parameter"); |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 params->deflate_enabled = true; | 301 params->deflate_enabled = true; |
| 302 return true; | 302 return true; |
| 303 } | 303 } |
| 304 | 304 |
| 305 bool ValidateExtensions(const HttpResponseHeaders* headers, | 305 bool ValidateExtensions(const HttpResponseHeaders* headers, |
| 306 const std::vector<std::string>& requested_extensions, | 306 std::string* concatenated_header_value, |
|
yhirano
2015/03/30 11:02:03
Why did you change the name to concatenated_header
tyoshino (SeeGerritForStatus)
2015/03/31 06:17:44
I want to
- emphasize that this variable holds a d
| |
| 307 std::string* extensions, | |
| 308 std::string* failure_message, | 307 std::string* failure_message, |
| 309 WebSocketExtensionParams* params) { | 308 WebSocketExtensionParams* params) { |
| 310 void* state = nullptr; | 309 void* state = nullptr; |
| 311 std::string value; | 310 std::string header_value; |
| 312 std::vector<std::string> accepted_extensions; | 311 std::vector<std::string> header_values; |
| 313 // TODO(ricea): If adding support for additional extensions, generalise this | 312 // TODO(ricea): If adding support for additional extensions, generalise this |
| 314 // code. | 313 // code. |
| 315 bool seen_permessage_deflate = false; | 314 bool seen_permessage_deflate = false; |
| 316 while (headers->EnumerateHeader( | 315 while (headers->EnumerateHeader(&state, websockets::kSecWebSocketExtensions, |
| 317 &state, websockets::kSecWebSocketExtensions, &value)) { | 316 &header_value)) { |
| 318 WebSocketExtensionParser parser; | 317 WebSocketExtensionParser parser; |
| 319 parser.Parse(value); | 318 parser.Parse(header_value); |
| 320 if (parser.has_error()) { | 319 if (parser.has_error()) { |
| 321 // TODO(yhirano) Set appropriate failure message. | 320 // TODO(yhirano) Set appropriate failure message. |
| 322 *failure_message = | 321 *failure_message = |
| 323 "'Sec-WebSocket-Extensions' header value is " | 322 "'Sec-WebSocket-Extensions' header value is " |
| 324 "rejected by the parser: " + | 323 "rejected by the parser: " + |
| 325 value; | 324 header_value; |
| 326 return false; | 325 return false; |
| 327 } | 326 } |
| 328 if (parser.extension().name() == "permessage-deflate") { | 327 |
| 329 if (seen_permessage_deflate) { | 328 const std::vector<WebSocketExtension>& extensions = parser.extensions(); |
| 330 *failure_message = "Received duplicate permessage-deflate response"; | 329 for (size_t i = 0; i < extensions.size(); ++i) { |
| 330 const WebSocketExtension& extension = extensions[i]; | |
| 331 if (extension.name() == "permessage-deflate") { | |
| 332 if (seen_permessage_deflate) { | |
| 333 *failure_message = "Received duplicate permessage-deflate response"; | |
| 334 return false; | |
| 335 } | |
| 336 seen_permessage_deflate = true; | |
| 337 | |
| 338 if (!ValidatePerMessageDeflateExtension(extension, failure_message, | |
| 339 params)) | |
| 340 return false; | |
| 341 header_values.push_back(header_value); | |
| 342 } else { | |
| 343 *failure_message = "Found an unsupported extension '" + | |
| 344 extension.name() + | |
| 345 "' in 'Sec-WebSocket-Extensions' header"; | |
| 331 return false; | 346 return false; |
| 332 } | 347 } |
| 333 seen_permessage_deflate = true; | |
| 334 if (!ValidatePerMessageDeflateExtension( | |
| 335 parser.extension(), failure_message, params)) | |
| 336 return false; | |
| 337 } else { | |
| 338 *failure_message = | |
| 339 "Found an unsupported extension '" + | |
| 340 parser.extension().name() + | |
| 341 "' in 'Sec-WebSocket-Extensions' header"; | |
| 342 return false; | |
| 343 } | 348 } |
| 344 accepted_extensions.push_back(value); | |
| 345 } | 349 } |
| 346 *extensions = JoinString(accepted_extensions, ", "); | 350 *concatenated_header_value = JoinString(header_values, ", "); |
| 347 return true; | 351 return true; |
| 348 } | 352 } |
| 349 | 353 |
| 350 } // namespace | 354 } // namespace |
| 351 | 355 |
| 352 WebSocketBasicHandshakeStream::WebSocketBasicHandshakeStream( | 356 WebSocketBasicHandshakeStream::WebSocketBasicHandshakeStream( |
| 353 scoped_ptr<ClientSocketHandle> connection, | 357 scoped_ptr<ClientSocketHandle> connection, |
| 354 WebSocketStream::ConnectDelegate* connect_delegate, | 358 WebSocketStream::ConnectDelegate* connect_delegate, |
| 355 bool using_proxy, | 359 bool using_proxy, |
| 356 std::vector<std::string> requested_sub_protocols, | 360 std::vector<std::string> requested_sub_protocols, |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 std::string failure_message; | 633 std::string failure_message; |
| 630 if (ValidateUpgrade(headers, &failure_message) && | 634 if (ValidateUpgrade(headers, &failure_message) && |
| 631 ValidateSecWebSocketAccept( | 635 ValidateSecWebSocketAccept( |
| 632 headers, handshake_challenge_response_, &failure_message) && | 636 headers, handshake_challenge_response_, &failure_message) && |
| 633 ValidateConnection(headers, &failure_message) && | 637 ValidateConnection(headers, &failure_message) && |
| 634 ValidateSubProtocol(headers, | 638 ValidateSubProtocol(headers, |
| 635 requested_sub_protocols_, | 639 requested_sub_protocols_, |
| 636 &sub_protocol_, | 640 &sub_protocol_, |
| 637 &failure_message) && | 641 &failure_message) && |
| 638 ValidateExtensions(headers, | 642 ValidateExtensions(headers, |
| 639 requested_extensions_, | |
| 640 &extensions_, | 643 &extensions_, |
| 641 &failure_message, | 644 &failure_message, |
| 642 extension_params_.get())) { | 645 extension_params_.get())) { |
| 643 return OK; | 646 return OK; |
| 644 } | 647 } |
| 645 set_failure_message("Error during WebSocket handshake: " + failure_message); | 648 set_failure_message("Error during WebSocket handshake: " + failure_message); |
| 646 return ERR_INVALID_RESPONSE; | 649 return ERR_INVALID_RESPONSE; |
| 647 } | 650 } |
| 648 | 651 |
| 649 void WebSocketBasicHandshakeStream::set_failure_message( | 652 void WebSocketBasicHandshakeStream::set_failure_message( |
| 650 const std::string& failure_message) { | 653 const std::string& failure_message) { |
| 651 *failure_message_ = failure_message; | 654 *failure_message_ = failure_message; |
| 652 } | 655 } |
| 653 | 656 |
| 654 } // namespace net | 657 } // namespace net |
| OLD | NEW |