• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors
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_ENCODER_H_
6 #define NET_SERVER_WEB_SOCKET_ENCODER_H_
7 
8 #include <memory>
9 #include <string>
10 #include <vector>
11 
12 #include "base/strings/string_piece.h"
13 #include "net/server/web_socket.h"
14 #include "net/websockets/websocket_deflater.h"
15 #include "net/websockets/websocket_inflater.h"
16 
17 namespace net {
18 
19 class WebSocketDeflateParameters;
20 
21 class WebSocketEncoder final {
22  public:
23   static const char kClientExtensions[];
24 
25   WebSocketEncoder(const WebSocketEncoder&) = delete;
26   WebSocketEncoder& operator=(const WebSocketEncoder&) = delete;
27 
28   ~WebSocketEncoder();
29 
30   // Creates and returns an encoder for a server without extensions.
31   static std::unique_ptr<WebSocketEncoder> CreateServer();
32   // Creates and returns an encoder.
33   // |extensions| is the value of a Sec-WebSocket-Extensions header.
34   // Returns nullptr when there is an error.
35   static std::unique_ptr<WebSocketEncoder> CreateServer(
36       const std::string& extensions,
37       WebSocketDeflateParameters* params);
38   static std::unique_ptr<WebSocketEncoder> CreateClient(
39       const std::string& response_extensions);
40 
41   WebSocket::ParseResult DecodeFrame(base::StringPiece frame,
42                                      int* bytes_consumed,
43                                      std::string* output);
44   void EncodeTextFrame(base::StringPiece frame,
45                        int masking_key,
46                        std::string* output);
47   void EncodePongFrame(base::StringPiece frame,
48                        int masking_key,
49                        std::string* output);
50 
deflate_enabled()51   bool deflate_enabled() const { return !!deflater_; }
52 
53  private:
54   enum Type {
55     FOR_SERVER,
56     FOR_CLIENT,
57   };
58 
59   WebSocketEncoder(Type type,
60                    std::unique_ptr<WebSocketDeflater> deflater,
61                    std::unique_ptr<WebSocketInflater> inflater);
62 
63   std::vector<std::string> continuation_message_frames_;
64   bool is_current_message_compressed_ = false;
65 
66   bool Inflate(std::string* message);
67   bool Deflate(base::StringPiece message, std::string* output);
68 
69   Type type_;
70   std::unique_ptr<WebSocketDeflater> deflater_;
71   std::unique_ptr<WebSocketInflater> inflater_;
72 };
73 
74 }  // namespace net
75 
76 #endif  // NET_SERVER_WEB_SOCKET_ENCODER_H_
77