OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // WebSocketHandshake*Handler handles WebSocket handshake request message | |
6 // from WebKit renderer process, and WebSocket handshake response message | |
7 // from WebSocket server. | |
8 // It modifies messages for the following reason: | |
9 // - We don't trust WebKit renderer process, so we'll not expose HttpOnly | |
10 // cookies to the renderer process, so handles HttpOnly cookies in | |
11 // browser process. | |
12 // | |
13 #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ | 5 #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |
14 #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ | 6 #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |
15 | 7 |
16 #include <string> | 8 #include <string> |
17 #include <vector> | |
18 | |
19 #include "net/base/net_export.h" | |
20 #include "net/http/http_request_info.h" | |
21 #include "net/http/http_response_info.h" | |
22 #include "net/spdy/spdy_header_block.h" | |
23 | 9 |
24 namespace net { | 10 namespace net { |
25 | 11 |
| 12 // Given a WebSocket handshake challenge, compute the correct response. |
| 13 // TODO(ricea): There should probably be a test for this. |
26 void ComputeSecWebSocketAccept(const std::string& key, | 14 void ComputeSecWebSocketAccept(const std::string& key, |
27 std::string* accept); | 15 std::string* accept); |
28 | 16 |
29 class NET_EXPORT_PRIVATE WebSocketHandshakeRequestHandler { | |
30 public: | |
31 WebSocketHandshakeRequestHandler(); | |
32 ~WebSocketHandshakeRequestHandler() {} | |
33 | |
34 // Parses WebSocket handshake request from renderer process. | |
35 // It assumes a WebSocket handshake request message is given at once, and | |
36 // no other data is added to the request message. | |
37 bool ParseRequest(const char* data, int length); | |
38 | |
39 size_t original_length() const; | |
40 | |
41 // Appends the header value pair for |name| and |value|, if |name| doesn't | |
42 // exist. | |
43 void AppendHeaderIfMissing(const std::string& name, | |
44 const std::string& value); | |
45 // Removes the headers that matches (case insensitive). | |
46 void RemoveHeaders(const char* const headers_to_remove[], | |
47 size_t headers_to_remove_len); | |
48 | |
49 // Gets request info to open WebSocket connection and fills challenge data in | |
50 // |challenge|. | |
51 HttpRequestInfo GetRequestInfo(const GURL& url, std::string* challenge); | |
52 // Gets request as SpdyHeaderBlock. | |
53 // Also, fills challenge data in |challenge|. | |
54 bool GetRequestHeaderBlock(const GURL& url, | |
55 SpdyHeaderBlock* headers, | |
56 std::string* challenge, | |
57 int spdy_protocol_version); | |
58 // Gets WebSocket handshake raw request message to open WebSocket | |
59 // connection. | |
60 std::string GetRawRequest(); | |
61 // Calling raw_length is valid only after GetRawRequest() call. | |
62 size_t raw_length() const; | |
63 | |
64 private: | |
65 std::string request_line_; | |
66 std::string headers_; | |
67 int original_length_; | |
68 int raw_length_; | |
69 | |
70 DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeRequestHandler); | |
71 }; | |
72 | |
73 class NET_EXPORT_PRIVATE WebSocketHandshakeResponseHandler { | |
74 public: | |
75 WebSocketHandshakeResponseHandler(); | |
76 ~WebSocketHandshakeResponseHandler(); | |
77 | |
78 // Parses WebSocket handshake response from WebSocket server. | |
79 // Returns number of bytes in |data| used for WebSocket handshake response | |
80 // message. If it already got whole WebSocket handshake response message, | |
81 // returns zero. In other words, [data + returned value, data + length) will | |
82 // be WebSocket frame data after handshake response message. | |
83 // TODO(ukai): fail fast when response gives wrong status code. | |
84 size_t ParseRawResponse(const char* data, int length); | |
85 // Returns true if it already parses full handshake response message. | |
86 bool HasResponse() const; | |
87 // Parses WebSocket handshake response info given as HttpResponseInfo. | |
88 bool ParseResponseInfo(const HttpResponseInfo& response_info, | |
89 const std::string& challenge); | |
90 // Parses WebSocket handshake response as SpdyHeaderBlock. | |
91 bool ParseResponseHeaderBlock(const SpdyHeaderBlock& headers, | |
92 const std::string& challenge, | |
93 int spdy_protocol_version); | |
94 | |
95 // Gets the headers value. | |
96 void GetHeaders(const char* const headers_to_get[], | |
97 size_t headers_to_get_len, | |
98 std::vector<std::string>* values); | |
99 // Removes the headers that matches (case insensitive). | |
100 void RemoveHeaders(const char* const headers_to_remove[], | |
101 size_t headers_to_remove_len); | |
102 | |
103 // Gets raw WebSocket handshake response received from WebSocket server. | |
104 std::string GetRawResponse() const; | |
105 | |
106 // Gets WebSocket handshake response message sent to renderer process. | |
107 std::string GetResponse(); | |
108 | |
109 private: | |
110 // Original bytes input by using ParseRawResponse(). | |
111 std::string original_; | |
112 // Number of bytes actually used for the handshake response in |original_|. | |
113 int original_header_length_; | |
114 | |
115 std::string status_line_; | |
116 std::string headers_; | |
117 std::string header_separator_; | |
118 | |
119 DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeResponseHandler); | |
120 }; | |
121 | |
122 } // namespace net | 17 } // namespace net |
123 | 18 |
124 #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ | 19 #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_ |
OLD | NEW |