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

Unified Diff: net/server/web_socket_encoder.cc

Issue 1047623002: Support parsing a Sec-WebSocket-Extensions header with multiple elements (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed #12 Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/server/web_socket_encoder.h ('k') | net/websockets/websocket_basic_handshake_stream.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/server/web_socket_encoder.cc
diff --git a/net/server/web_socket_encoder.cc b/net/server/web_socket_encoder.cc
index 0b4a765e9d8833ae0db4892bd75286efb1806b8f..8e1681c8a7233d3878fb0180fc16e5d88e4f3384 100644
--- a/net/server/web_socket_encoder.cc
+++ b/net/server/web_socket_encoder.cc
@@ -233,7 +233,7 @@ WebSocketEncoder* WebSocketEncoder::CreateClient(
}
// static
-void WebSocketEncoder::ParseExtensions(const std::string& extensions,
+void WebSocketEncoder::ParseExtensions(const std::string& header_value,
bool* deflate,
bool* has_client_window_bits,
int* client_window_bits,
@@ -247,40 +247,51 @@ void WebSocketEncoder::ParseExtensions(const std::string& extensions,
*client_no_context_takeover = false;
*server_no_context_takeover = false;
- if (extensions.empty())
+ if (header_value.empty())
return;
- // TODO(dgozman): split extensions header if another extension is introduced.
WebSocketExtensionParser parser;
- parser.Parse(extensions);
+ parser.Parse(header_value);
if (parser.has_error())
return;
- if (parser.extension().name() != "permessage-deflate")
- return;
+ const std::vector<WebSocketExtension>& extensions = parser.extensions();
+ // TODO(tyoshino): Fail if this method is used for parsing a response and
+ // there are multiple permessage-deflate extensions or there are any unknown
+ // extensions.
+ for (const auto& extension : extensions) {
+ if (extension.name() != "permessage-deflate") {
+ continue;
+ }
- const std::vector<WebSocketExtension::Parameter>& parameters =
- parser.extension().parameters();
- for (const auto& param : parameters) {
- const std::string& name = param.name();
- if (name == "client_max_window_bits") {
- *has_client_window_bits = true;
- if (param.HasValue()) {
+ const std::vector<WebSocketExtension::Parameter>& parameters =
+ extension.parameters();
+ for (const auto& param : parameters) {
+ const std::string& name = param.name();
+ // TODO(tyoshino): Fail the connection when an invalid value is given.
+ if (name == "client_max_window_bits") {
+ *has_client_window_bits = true;
+ if (param.HasValue()) {
+ int bits = 0;
+ if (base::StringToInt(param.value(), &bits) && bits >= 8 &&
+ bits <= 15) {
+ *client_window_bits = bits;
+ }
+ }
+ }
+ if (name == "server_max_window_bits" && param.HasValue()) {
int bits = 0;
if (base::StringToInt(param.value(), &bits) && bits >= 8 && bits <= 15)
- *client_window_bits = bits;
+ *server_window_bits = bits;
}
+ if (name == "client_no_context_takeover")
+ *client_no_context_takeover = true;
+ if (name == "server_no_context_takeover")
+ *server_no_context_takeover = true;
}
- if (name == "server_max_window_bits" && param.HasValue()) {
- int bits = 0;
- if (base::StringToInt(param.value(), &bits) && bits >= 8 && bits <= 15)
- *server_window_bits = bits;
- }
- if (name == "client_no_context_takeover")
- *client_no_context_takeover = true;
- if (name == "server_no_context_takeover")
- *server_no_context_takeover = true;
+ *deflate = true;
+
+ break;
}
- *deflate = true;
}
WebSocketEncoder::WebSocketEncoder(bool is_server) : is_server_(is_server) {
« no previous file with comments | « net/server/web_socket_encoder.h ('k') | net/websockets/websocket_basic_handshake_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698