| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // WebSocketHandshake*Handler handles WebSocket handshake request message |
| // from WebKit renderer process, and WebSocket handshake response message |
| // from WebSocket server. |
| // It modifies messages for the following reason: |
| // - 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. |
| // |
| #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |
| #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "net/base/net_export.h" |
| #include "net/http/http_request_info.h" |
| #include "net/http/http_response_info.h" |
| #include "net/spdy/spdy_header_block.h" |
| |
| namespace net { |
| |
| void ComputeSecWebSocketAccept(const std::string& key, |
| std::string* accept); |
| |
| class NET_EXPORT_PRIVATE WebSocketHandshakeRequestHandler { |
| public: |
| WebSocketHandshakeRequestHandler(); |
| ~WebSocketHandshakeRequestHandler() {} |
| |
| // Parses WebSocket handshake request from renderer process. |
| // It assumes a WebSocket handshake request message is given at once, and |
| // no other data is added to the request message. |
| bool ParseRequest(const char* data, int length); |
| |
| size_t original_length() const; |
| |
| // Appends the header value pair for |name| and |value|, if |name| doesn't |
| // exist. |
| void AppendHeaderIfMissing(const std::string& name, |
| const std::string& value); |
| // Removes the headers that matches (case insensitive). |
| void RemoveHeaders(const char* const headers_to_remove[], |
| size_t headers_to_remove_len); |
| |
| // Gets request info to open WebSocket connection and fills challenge data in |
| // |challenge|. |
| HttpRequestInfo GetRequestInfo(const GURL& url, std::string* challenge); |
| // Gets request as SpdyHeaderBlock. |
| // Also, fills challenge data in |challenge|. |
| bool GetRequestHeaderBlock(const GURL& url, |
| SpdyHeaderBlock* headers, |
| std::string* challenge, |
| int spdy_protocol_version); |
| // Gets WebSocket handshake raw request message to open WebSocket |
| // connection. |
| std::string GetRawRequest(); |
| // Calling raw_length is valid only after GetRawRequest() call. |
| size_t raw_length() const; |
| |
| private: |
| std::string request_line_; |
| std::string headers_; |
| int original_length_; |
| int raw_length_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeRequestHandler); |
| }; |
| |
| class NET_EXPORT_PRIVATE WebSocketHandshakeResponseHandler { |
| public: |
| WebSocketHandshakeResponseHandler(); |
| ~WebSocketHandshakeResponseHandler(); |
| |
| // Parses WebSocket handshake response from WebSocket server. |
| // Returns number of bytes in |data| used for WebSocket handshake response |
| // message. If it already got whole WebSocket handshake response message, |
| // returns zero. In other words, [data + returned value, data + length) will |
| // be WebSocket frame data after handshake response message. |
| // TODO(ukai): fail fast when response gives wrong status code. |
| size_t ParseRawResponse(const char* data, int length); |
| // Returns true if it already parses full handshake response message. |
| bool HasResponse() const; |
| // Parses WebSocket handshake response info given as HttpResponseInfo. |
| bool ParseResponseInfo(const HttpResponseInfo& response_info, |
| const std::string& challenge); |
| // Parses WebSocket handshake response as SpdyHeaderBlock. |
| bool ParseResponseHeaderBlock(const SpdyHeaderBlock& headers, |
| const std::string& challenge, |
| int spdy_protocol_version); |
| |
| // Gets the headers value. |
| void GetHeaders(const char* const headers_to_get[], |
| size_t headers_to_get_len, |
| std::vector<std::string>* values); |
| // Removes the headers that matches (case insensitive). |
| void RemoveHeaders(const char* const headers_to_remove[], |
| size_t headers_to_remove_len); |
| |
| // Gets raw WebSocket handshake response received from WebSocket server. |
| std::string GetRawResponse() const; |
| |
| // Gets WebSocket handshake response message sent to renderer process. |
| std::string GetResponse(); |
| |
| private: |
| // Original bytes input by using ParseRawResponse(). |
| std::string original_; |
| // Number of bytes actually used for the handshake response in |original_|. |
| int original_header_length_; |
| |
| std::string status_line_; |
| std::string headers_; |
| std::string header_separator_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeResponseHandler); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |