Probably broke Win7 Tests (dbg)(6). http://build.chromium.org/p/chromium.win/builders...
[chromium-blink-merge.git] / net / websockets / websocket_handshake_handler.h
blob73af66d0aaa2716c96d2445ef00f6948fc7e420e
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
3 // found in the LICENSE file.
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.
13 #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
14 #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
16 #include <string>
17 #include <vector>
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"
24 namespace net {
26 void ComputeSecWebSocketAccept(const std::string& key,
27 std::string* accept);
29 class NET_EXPORT_PRIVATE WebSocketHandshakeRequestHandler {
30 public:
31 WebSocketHandshakeRequestHandler();
32 ~WebSocketHandshakeRequestHandler() {}
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);
39 size_t original_length() const;
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);
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;
64 private:
65 std::string request_line_;
66 std::string headers_;
67 int original_length_;
68 int raw_length_;
70 DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeRequestHandler);
73 class NET_EXPORT_PRIVATE WebSocketHandshakeResponseHandler {
74 public:
75 WebSocketHandshakeResponseHandler();
76 ~WebSocketHandshakeResponseHandler();
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);
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);
103 // Gets raw WebSocket handshake response received from WebSocket server.
104 std::string GetRawResponse() const;
106 // Gets WebSocket handshake response message sent to renderer process.
107 std::string GetResponse();
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_;
115 std::string status_line_;
116 std::string headers_;
117 std::string header_separator_;
119 DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeResponseHandler);
122 } // namespace net
124 #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_