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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 } else if (requested_sub_protocols.size() > 0 && count == 0) { | 215 } else if (requested_sub_protocols.size() > 0 && count == 0) { |
| 216 *failure_message = | 216 *failure_message = |
| 217 "Sent non-empty 'Sec-WebSocket-Protocol' header " | 217 "Sent non-empty 'Sec-WebSocket-Protocol' header " |
| 218 "but no response was received"; | 218 "but no response was received"; |
| 219 return false; | 219 return false; |
| 220 } | 220 } |
| 221 *sub_protocol = value; | 221 *sub_protocol = value; |
| 222 return true; | 222 return true; |
| 223 } | 223 } |
| 224 | 224 |
| 225 bool DeflateError(std::string* message, const char* piece) { | |
|
Adam Rice
2014/02/10 12:31:24
Please use base::StringPiece for the second argume
yhirano
2014/02/13 04:56:18
Done.
| |
| 226 *message = std::string("Error in permessage-deflate: ") + piece; | |
| 227 return false; | |
| 228 } | |
| 229 | |
| 230 bool DeflateError(std::string* message, const std::string& piece) { | |
| 231 return DeflateError(message, piece.c_str()); | |
| 232 } | |
| 233 | |
| 225 bool ValidatePerMessageDeflateExtension(const WebSocketExtension& extension, | 234 bool ValidatePerMessageDeflateExtension(const WebSocketExtension& extension, |
| 226 std::string* failure_message, | 235 std::string* failure_message, |
| 227 WebSocketExtensionParams* params) { | 236 WebSocketExtensionParams* params) { |
| 228 static const char kClientPrefix[] = "client_"; | 237 static const char kClientPrefix[] = "client_"; |
| 229 static const char kServerPrefix[] = "server_"; | 238 static const char kServerPrefix[] = "server_"; |
| 230 static const char kNoContextTakeover[] = "no_context_takeover"; | 239 static const char kNoContextTakeover[] = "no_context_takeover"; |
| 231 static const char kMaxWindowBits[] = "max_window_bits"; | 240 static const char kMaxWindowBits[] = "max_window_bits"; |
| 232 const size_t kPrefixLen = arraysize(kClientPrefix) - 1; | 241 const size_t kPrefixLen = arraysize(kClientPrefix) - 1; |
| 233 COMPILE_ASSERT(kPrefixLen == arraysize(kServerPrefix) - 1, | 242 COMPILE_ASSERT(kPrefixLen == arraysize(kServerPrefix) - 1, |
| 234 the_strings_server_and_client_must_be_the_same_length); | 243 the_strings_server_and_client_must_be_the_same_length); |
| 235 typedef std::vector<WebSocketExtension::Parameter> ParameterVector; | 244 typedef std::vector<WebSocketExtension::Parameter> ParameterVector; |
| 236 | 245 |
| 237 DCHECK_EQ("permessage-deflate", extension.name()); | 246 DCHECK_EQ("permessage-deflate", extension.name()); |
| 238 const ParameterVector& parameters = extension.parameters(); | 247 const ParameterVector& parameters = extension.parameters(); |
| 239 std::set<std::string> seen_names; | 248 std::set<std::string> seen_names; |
| 240 for (ParameterVector::const_iterator it = parameters.begin(); | 249 for (ParameterVector::const_iterator it = parameters.begin(); |
| 241 it != parameters.end(); ++it) { | 250 it != parameters.end(); ++it) { |
| 242 const std::string& name = it->name(); | 251 const std::string& name = it->name(); |
| 243 if (seen_names.count(name) != 0) { | 252 if (seen_names.count(name) != 0) { |
| 244 *failure_message = | 253 return DeflateError( |
| 245 "Received duplicate permessage-deflate extension parameter " + name; | 254 failure_message, |
| 246 return false; | 255 "Received duplicate permessage-deflate extension parameter " + name); |
| 247 } | 256 } |
| 248 seen_names.insert(name); | 257 seen_names.insert(name); |
| 249 const std::string client_or_server(name, 0, kPrefixLen); | 258 const std::string client_or_server(name, 0, kPrefixLen); |
| 250 const bool is_client = (client_or_server == kClientPrefix); | 259 const bool is_client = (client_or_server == kClientPrefix); |
| 251 if (!is_client && client_or_server != kServerPrefix) { | 260 if (!is_client && client_or_server != kServerPrefix) { |
| 252 *failure_message = | 261 return DeflateError( |
| 253 "Received an unexpected permessage-deflate extension parameter"; | 262 failure_message, |
| 254 return false; | 263 "Received an unexpected permessage-deflate extension parameter"); |
| 255 } | 264 } |
| 256 const std::string rest(name, kPrefixLen); | 265 const std::string rest(name, kPrefixLen); |
| 257 if (rest == kNoContextTakeover) { | 266 if (rest == kNoContextTakeover) { |
| 258 if (it->HasValue()) { | 267 if (it->HasValue()) { |
| 259 *failure_message = "Received invalid " + name + " parameter"; | 268 return DeflateError(failure_message, |
| 260 return false; | 269 "Received invalid " + name + " parameter"); |
| 261 } | 270 } |
| 262 if (is_client) | 271 if (is_client) |
| 263 params->deflate_mode = WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT; | 272 params->deflate_mode = WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT; |
| 264 } else if (rest == kMaxWindowBits) { | 273 } else if (rest == kMaxWindowBits) { |
| 265 if (!it->HasValue()) { | 274 if (!it->HasValue()) |
| 266 *failure_message = name + " must have value"; | 275 return DeflateError(failure_message, name + " must have value"); |
| 267 return false; | |
| 268 } | |
| 269 int bits = 0; | 276 int bits = 0; |
| 270 if (!base::StringToInt(it->value(), &bits) || bits < 8 || bits > 15 || | 277 if (!base::StringToInt(it->value(), &bits) || bits < 8 || bits > 15 || |
| 271 it->value()[0] == '0' || | 278 it->value()[0] == '0' || |
| 272 it->value().find_first_not_of("0123456789") != std::string::npos) { | 279 it->value().find_first_not_of("0123456789") != std::string::npos) { |
| 273 *failure_message = "Received invalid " + name + " parameter"; | 280 return DeflateError(failure_message, |
| 274 return false; | 281 "Received invalid " + name + " parameter"); |
| 275 } | 282 } |
| 276 if (is_client) | 283 if (is_client) |
| 277 params->client_window_bits = bits; | 284 params->client_window_bits = bits; |
| 278 } else { | 285 } else { |
| 279 *failure_message = | 286 return DeflateError( |
| 280 "Received an unexpected permessage-deflate extension parameter"; | 287 failure_message, |
| 281 return false; | 288 "Received an unexpected permessage-deflate extension parameter"); |
| 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, |
| 290 std::string* extensions, | 297 std::string* extensions, |
| 291 std::string* failure_message, | 298 std::string* failure_message, |
| (...skipping 304 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 |