xref: /aosp_15_r20/external/cronet/net/server/web_socket_encoder.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SERVER_WEB_SOCKET_ENCODER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SERVER_WEB_SOCKET_ENCODER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker #include <string_view>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "net/server/web_socket.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_deflater.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_inflater.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace net {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker class WebSocketDeflateParameters;
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class WebSocketEncoder final {
22*6777b538SAndroid Build Coastguard Worker  public:
23*6777b538SAndroid Build Coastguard Worker   static const char kClientExtensions[];
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   WebSocketEncoder(const WebSocketEncoder&) = delete;
26*6777b538SAndroid Build Coastguard Worker   WebSocketEncoder& operator=(const WebSocketEncoder&) = delete;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   ~WebSocketEncoder();
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   // Creates and returns an encoder for a server without extensions.
31*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<WebSocketEncoder> CreateServer();
32*6777b538SAndroid Build Coastguard Worker   // Creates and returns an encoder.
33*6777b538SAndroid Build Coastguard Worker   // |extensions| is the value of a Sec-WebSocket-Extensions header.
34*6777b538SAndroid Build Coastguard Worker   // Returns nullptr when there is an error.
35*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<WebSocketEncoder> CreateServer(
36*6777b538SAndroid Build Coastguard Worker       const std::string& extensions,
37*6777b538SAndroid Build Coastguard Worker       WebSocketDeflateParameters* params);
38*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<WebSocketEncoder> CreateClient(
39*6777b538SAndroid Build Coastguard Worker       const std::string& response_extensions);
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   WebSocket::ParseResult DecodeFrame(std::string_view frame,
42*6777b538SAndroid Build Coastguard Worker                                      int* bytes_consumed,
43*6777b538SAndroid Build Coastguard Worker                                      std::string* output);
44*6777b538SAndroid Build Coastguard Worker   void EncodeTextFrame(std::string_view frame,
45*6777b538SAndroid Build Coastguard Worker                        int masking_key,
46*6777b538SAndroid Build Coastguard Worker                        std::string* output);
47*6777b538SAndroid Build Coastguard Worker   void EncodePongFrame(std::string_view frame,
48*6777b538SAndroid Build Coastguard Worker                        int masking_key,
49*6777b538SAndroid Build Coastguard Worker                        std::string* output);
50*6777b538SAndroid Build Coastguard Worker   void EncodeCloseFrame(std::string_view frame,
51*6777b538SAndroid Build Coastguard Worker                         int masking_key,
52*6777b538SAndroid Build Coastguard Worker                         std::string* output);
53*6777b538SAndroid Build Coastguard Worker 
deflate_enabled()54*6777b538SAndroid Build Coastguard Worker   bool deflate_enabled() const { return !!deflater_; }
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker  private:
57*6777b538SAndroid Build Coastguard Worker   enum Type {
58*6777b538SAndroid Build Coastguard Worker     FOR_SERVER,
59*6777b538SAndroid Build Coastguard Worker     FOR_CLIENT,
60*6777b538SAndroid Build Coastguard Worker   };
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   WebSocketEncoder(Type type,
63*6777b538SAndroid Build Coastguard Worker                    std::unique_ptr<WebSocketDeflater> deflater,
64*6777b538SAndroid Build Coastguard Worker                    std::unique_ptr<WebSocketInflater> inflater);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> continuation_message_frames_;
67*6777b538SAndroid Build Coastguard Worker   bool is_current_message_compressed_ = false;
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   bool Inflate(std::string* message);
70*6777b538SAndroid Build Coastguard Worker   bool Deflate(std::string_view message, std::string* output);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   Type type_;
73*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<WebSocketDeflater> deflater_;
74*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<WebSocketInflater> inflater_;
75*6777b538SAndroid Build Coastguard Worker };
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker }  // namespace net
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker #endif  // NET_SERVER_WEB_SOCKET_ENCODER_H_
80