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

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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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