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#ifndef CHROME_TEST_CHROMEDRIVER_NET_WEBSOCKET_H_
6#define CHROME_TEST_CHROMEDRIVER_NET_WEBSOCKET_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/memory/ref_counted.h"
13#include "base/threading/thread_checker.h"
14#include "net/base/completion_callback.h"
15#include "net/socket/tcp_client_socket.h"
16#include "net/websockets/websocket_frame_parser.h"
17#include "url/gurl.h"
18
19namespace net {
20class DrainableIOBuffer;
21class IOBufferWithSize;
22}
23
24class WebSocketListener;
25
26// A text-only, non-thread safe WebSocket. Must be created and used on a single
27// thread. Intended particularly for use with net::HttpServer.
28class WebSocket {
29 public:
30  // |url| must be an IP v4/v6 literal, not a host name.
31  WebSocket(const GURL& url, WebSocketListener* listener);
32  virtual ~WebSocket();
33
34  // Initializes the WebSocket connection. Invokes the given callback with
35  // a net::Error. May only be called once.
36  void Connect(const net::CompletionCallback& callback);
37
38  // Sends the given message and returns true on success.
39  bool Send(const std::string& message);
40
41 private:
42  enum State {
43    INITIALIZED,
44    CONNECTING,
45    OPEN,
46    CLOSED
47  };
48
49  void OnSocketConnect(int code);
50
51  void Write(const std::string& data);
52  void OnWrite(int code);
53  void ContinueWritingIfNecessary();
54
55  void Read();
56  void OnRead(int code);
57  void OnReadDuringHandshake(const char* data, int len);
58  void OnReadDuringOpen(const char* data, int len);
59
60  void InvokeConnectCallback(int code);
61  void Close(int code);
62
63  base::ThreadChecker thread_checker_;
64
65  GURL url_;
66  WebSocketListener* listener_;
67  State state_;
68  scoped_ptr<net::TCPClientSocket> socket_;
69
70  net::CompletionCallback connect_callback_;
71  std::string sec_key_;
72  std::string handshake_response_;
73
74  scoped_refptr<net::DrainableIOBuffer> write_buffer_;
75  std::string pending_write_;
76
77  scoped_refptr<net::IOBufferWithSize> read_buffer_;
78  net::WebSocketFrameParser parser_;
79  std::string next_message_;
80
81  DISALLOW_COPY_AND_ASSIGN(WebSocket);
82};
83
84// Listens for WebSocket messages and disconnects on the same thread as the
85// WebSocket.
86class WebSocketListener {
87 public:
88  virtual ~WebSocketListener() {}
89
90  // Called when a WebSocket message is received.
91  virtual void OnMessageReceived(const std::string& message) = 0;
92
93  // Called when the WebSocket connection closes. Will be called at most once.
94  // Will not be called if the connection was never established or if the close
95  // was initiated by the client.
96  virtual void OnClose() = 0;
97};
98
99#endif  // CHROME_TEST_CHROMEDRIVER_NET_WEBSOCKET_H_
100