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 NET_SERVER_WEB_SOCKET_H_
6#define NET_SERVER_WEB_SOCKET_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/strings/string_piece.h"
12
13namespace net {
14
15class HttpConnection;
16class HttpServer;
17class HttpServerRequestInfo;
18
19class WebSocket {
20 public:
21  enum ParseResult {
22    FRAME_OK,
23    FRAME_INCOMPLETE,
24    FRAME_CLOSE,
25    FRAME_ERROR
26  };
27
28  static WebSocket* CreateWebSocket(HttpServer* server,
29                                    HttpConnection* connection,
30                                    const HttpServerRequestInfo& request,
31                                    size_t* pos);
32
33  static ParseResult DecodeFrameHybi17(const base::StringPiece& frame,
34                                       bool client_frame,
35                                       int* bytes_consumed,
36                                       std::string* output);
37
38  static std::string EncodeFrameHybi17(const std::string& data,
39                                       int masking_key);
40
41  virtual void Accept(const HttpServerRequestInfo& request) = 0;
42  virtual ParseResult Read(std::string* message) = 0;
43  virtual void Send(const std::string& message) = 0;
44  virtual ~WebSocket() {}
45
46 protected:
47  WebSocket(HttpServer* server, HttpConnection* connection);
48
49  HttpServer* const server_;
50  HttpConnection* const connection_;
51
52 private:
53  DISALLOW_COPY_AND_ASSIGN(WebSocket);
54};
55
56}  // namespace net
57
58#endif  // NET_SERVER_WEB_SOCKET_H_
59