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); |
}; |