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

Unified Diff: net/websockets/websocket_handshake_handler.h

Issue 6823075: Accept new WebSocket handshake format (hybi-04 and later). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Replace DCHECKs with DVLOG. Created 9 years, 7 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 | « no previous file | net/websockets/websocket_handshake_handler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/websockets/websocket_handshake_handler.h
diff --git a/net/websockets/websocket_handshake_handler.h b/net/websockets/websocket_handshake_handler.h
index 855d12f349daeebc7b98cefadb77a2f77145cade..b96ee872f0d7566a13db668a3dfddf23cb31200e 100644
--- a/net/websockets/websocket_handshake_handler.h
+++ b/net/websockets/websocket_handshake_handler.h
@@ -9,6 +9,21 @@
// - We don't trust WebKit renderer process, so we'll not expose HttpOnly
// cookies to the renderer process, so handles HttpOnly cookies in
// browser process.
+//
+// The classes below support two styles of handshake: handshake based
+// on hixie-76 draft and one based on hybi-04 draft. The critical difference
+// between these two is how they pass challenge and response values. Hixie-76
+// based handshake appends a few bytes of binary data after header fields of
+// handshake request and response. These data are called "key3" (for request)
+// or "response key" (for response). On the other hand, handshake based on
+// hybi-04 and later drafts put challenge and response values into handshake
+// header fields, thus we do not need to send or receive extra bytes after
+// handshake headers.
+//
+// While we are working on updating WebSocket implementation in WebKit to
+// conform to the latest procotol draft, we need to accept both styles of
+// handshake. After we land the protocol changes in WebKit, we will be able to
+// drop codes handling old-style handshake.
#ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
#define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
@@ -45,10 +60,12 @@ class WebSocketHandshakeRequestHandler {
size_t headers_to_remove_len);
// Gets request info to open WebSocket connection.
- // Also, fill challange data in |challenge|.
+ // Fills challange data (concatenation of key1, 2 and 3 for hybi-03 and
+ // earlier, or Sec-WebSocket-Key header value for hybi-04 and later)
+ // in |challenge|.
HttpRequestInfo GetRequestInfo(const GURL& url, std::string* challenge);
// Gets request as SpdyHeaderBlock.
- // Also, fill challenge data in |challenge|.
+ // Also, fills challenge data in |challenge|.
bool GetRequestHeaderBlock(const GURL& url,
spdy::SpdyHeaderBlock* headers,
std::string* challenge);
@@ -58,12 +75,19 @@ class WebSocketHandshakeRequestHandler {
// Calling raw_length is valid only after GetRawRquest() call.
size_t raw_length() const;
+ // Returns the value of Sec-WebSocket-Version or Sec-WebSocket-Draft header
+ // (the latter is an old name of the former). Returns 0 if both headers were
+ // absent, which means the handshake was based on hybi-00 (= hixie-76).
+ // Should only be called after the handshake has been parsed.
+ int protocol_version() const;
+
private:
std::string status_line_;
std::string headers_;
std::string key3_;
int original_length_;
int raw_length_;
+ int protocol_version_; // "-1" means we haven't parsed the handshake yet.
DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeRequestHandler);
};
@@ -73,6 +97,11 @@ class WebSocketHandshakeResponseHandler {
WebSocketHandshakeResponseHandler();
~WebSocketHandshakeResponseHandler();
+ // Set WebSocket protocol version before parsing the response.
+ // Default is 0 (hybi-00, which is same as hixie-76).
+ int protocol_version() const;
+ void set_protocol_version(int protocol_version);
+
// Parses WebSocket handshake response from WebSocket server.
// Returns number of bytes in |data| used for WebSocket handshake response
// message, including response key. If it already got whole WebSocket
@@ -105,12 +134,18 @@ class WebSocketHandshakeResponseHandler {
std::string GetResponse();
private:
+ // Returns the length of response key. This function will return 0
+ // if the specified WebSocket protocol version does not require
+ // sending response key.
+ size_t GetResponseKeySize() const;
+
std::string original_;
int original_header_length_;
std::string status_line_;
std::string headers_;
std::string header_separator_;
std::string key_;
+ int protocol_version_;
DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeResponseHandler);
};
« no previous file with comments | « no previous file | net/websockets/websocket_handshake_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698