1// Copyright (c) 2011 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#pragma once
16
17#include <string>
18#include <vector>
19
20#include "base/memory/ref_counted.h"
21#include "net/http/http_request_info.h"
22#include "net/http/http_response_info.h"
23#include "net/spdy/spdy_framer.h"
24
25namespace net {
26
27class WebSocketHandshakeRequestHandler {
28 public:
29  WebSocketHandshakeRequestHandler();
30  ~WebSocketHandshakeRequestHandler() {}
31
32  // Parses WebSocket handshake request from renderer process.
33  // It assumes a WebSocket handshake request message is given at once, and
34  // no other data is added to the request message.
35  bool ParseRequest(const char* data, int length);
36
37  size_t original_length() const;
38
39  // Appends the header value pair for |name| and |value|, if |name| doesn't
40  // exist.
41  void AppendHeaderIfMissing(const std::string& name,
42                             const std::string& value);
43  // Removes the headers that matches (case insensitive).
44  void RemoveHeaders(const char* const headers_to_remove[],
45                     size_t headers_to_remove_len);
46
47  // Gets request info to open WebSocket connection.
48  // Also, fill challange data in |challenge|.
49  HttpRequestInfo GetRequestInfo(const GURL& url, std::string* challenge);
50  // Gets request as SpdyHeaderBlock.
51  // Also, fill challenge data in |challenge|.
52  bool GetRequestHeaderBlock(const GURL& url,
53                             spdy::SpdyHeaderBlock* headers,
54                             std::string* challenge);
55  // Gets WebSocket handshake raw request message to open WebSocket
56  // connection.
57  std::string GetRawRequest();
58  // Calling raw_length is valid only after GetRawRquest() call.
59  size_t raw_length() const;
60
61 private:
62  std::string status_line_;
63  std::string headers_;
64  std::string key3_;
65  int original_length_;
66  int raw_length_;
67
68  DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeRequestHandler);
69};
70
71class WebSocketHandshakeResponseHandler {
72 public:
73  WebSocketHandshakeResponseHandler();
74  ~WebSocketHandshakeResponseHandler();
75
76  // Parses WebSocket handshake response from WebSocket server.
77  // Returns number of bytes in |data| used for WebSocket handshake response
78  // message, including response key.  If it already got whole WebSocket
79  // handshake response message, returns zero.  In other words,
80  // [data + returned value, data + length) will be WebSocket frame data
81  // after handshake response message.
82  // TODO(ukai): fail fast when response gives wrong status code.
83  size_t ParseRawResponse(const char* data, int length);
84  // Returns true if it already parses full handshake response message.
85  bool HasResponse() const;
86  // Parses WebSocket handshake response info given as HttpResponseInfo.
87  bool ParseResponseInfo(const HttpResponseInfo& response_info,
88                         const std::string& challenge);
89  // Parses WebSocket handshake response as SpdyHeaderBlock.
90  bool ParseResponseHeaderBlock(const spdy::SpdyHeaderBlock& headers,
91                                const std::string& challenge);
92
93  // Gets the headers value.
94  void GetHeaders(const char* const headers_to_get[],
95                  size_t headers_to_get_len,
96                  std::vector<std::string>* values);
97  // Removes the headers that matches (case insensitive).
98  void RemoveHeaders(const char* const headers_to_remove[],
99                     size_t headers_to_remove_len);
100
101  // Gets raw WebSocket handshake response received from WebSocket server.
102  std::string GetRawResponse() const;
103
104  // Gets WebSocket handshake response message sent to renderer process.
105  std::string GetResponse();
106
107 private:
108  std::string original_;
109  int original_header_length_;
110  std::string status_line_;
111  std::string headers_;
112  std::string header_separator_;
113  std::string key_;
114
115  DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeResponseHandler);
116};
117
118}  // namespace net
119
120#endif  // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_HANDLER_H_
121