Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Side by Side Diff: net/websockets/websocket_basic_handshake_stream.cc

Issue 158663003: [WebSocket] Fix permessage-deflate handshake failure messages. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | net/websockets/websocket_stream_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | net/websockets/websocket_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698