• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
12 //
13 #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
14 #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
15 
16 #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 
24 namespace net {
25 
26 void ComputeSecWebSocketAccept(const std::string& key,
27                                std::string* accept);
28 
29 class NET_EXPORT_PRIVATE WebSocketHandshakeRequestHandler {
30  public:
31   WebSocketHandshakeRequestHandler();
~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
123 
124 #endif  // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
125