xref: /aosp_15_r20/external/cronet/net/websockets/websocket_deflate_parameters.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 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_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_deflater.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_extension.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace net {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // A WebSocketDeflateParameters represents permessage-deflate extension
20*6777b538SAndroid Build Coastguard Worker // parameters. This class is used either for request and response.
21*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE WebSocketDeflateParameters {
22*6777b538SAndroid Build Coastguard Worker  public:
23*6777b538SAndroid Build Coastguard Worker   using ContextTakeOverMode = WebSocketDeflater::ContextTakeOverMode;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   // Returns a WebSocketExtension instance containing the parameters stored in
26*6777b538SAndroid Build Coastguard Worker   // this object.
27*6777b538SAndroid Build Coastguard Worker   WebSocketExtension AsExtension() const;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker   // Returns true when succeeded.
30*6777b538SAndroid Build Coastguard Worker   // Returns false and stores the failure message to |failure_message|
31*6777b538SAndroid Build Coastguard Worker   // otherwise.
32*6777b538SAndroid Build Coastguard Worker   // Note that even if this function succeeds it is not guaranteed that the
33*6777b538SAndroid Build Coastguard Worker   // object is valid. To check it, call IsValidAsRequest or IsValidAsResponse.
34*6777b538SAndroid Build Coastguard Worker   bool Initialize(const WebSocketExtension& input,
35*6777b538SAndroid Build Coastguard Worker                   std::string* failure_message);
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   // Returns true when |*this| and |response| are compatible.
38*6777b538SAndroid Build Coastguard Worker   // |*this| must be valid as a request and |response| must be valid as a
39*6777b538SAndroid Build Coastguard Worker   // response.
40*6777b538SAndroid Build Coastguard Worker   bool IsCompatibleWith(const WebSocketDeflateParameters& response) const;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   bool IsValidAsRequest(std::string* failure_message) const;
43*6777b538SAndroid Build Coastguard Worker   bool IsValidAsResponse(std::string* failure_message) const;
IsValidAsRequest()44*6777b538SAndroid Build Coastguard Worker   bool IsValidAsRequest() const {
45*6777b538SAndroid Build Coastguard Worker     std::string message;
46*6777b538SAndroid Build Coastguard Worker     return IsValidAsRequest(&message);
47*6777b538SAndroid Build Coastguard Worker   }
IsValidAsResponse()48*6777b538SAndroid Build Coastguard Worker   bool IsValidAsResponse() const {
49*6777b538SAndroid Build Coastguard Worker     std::string message;
50*6777b538SAndroid Build Coastguard Worker     return IsValidAsResponse(&message);
51*6777b538SAndroid Build Coastguard Worker   }
52*6777b538SAndroid Build Coastguard Worker 
server_context_take_over_mode()53*6777b538SAndroid Build Coastguard Worker   ContextTakeOverMode server_context_take_over_mode() const {
54*6777b538SAndroid Build Coastguard Worker     return server_context_take_over_mode_;
55*6777b538SAndroid Build Coastguard Worker   }
client_context_take_over_mode()56*6777b538SAndroid Build Coastguard Worker   ContextTakeOverMode client_context_take_over_mode() const {
57*6777b538SAndroid Build Coastguard Worker     return client_context_take_over_mode_;
58*6777b538SAndroid Build Coastguard Worker   }
is_server_max_window_bits_specified()59*6777b538SAndroid Build Coastguard Worker   bool is_server_max_window_bits_specified() const {
60*6777b538SAndroid Build Coastguard Worker     return server_max_window_bits_.is_specified;
61*6777b538SAndroid Build Coastguard Worker   }
server_max_window_bits()62*6777b538SAndroid Build Coastguard Worker   int server_max_window_bits() const {
63*6777b538SAndroid Build Coastguard Worker     DCHECK(is_server_max_window_bits_specified());
64*6777b538SAndroid Build Coastguard Worker     return server_max_window_bits_.bits;
65*6777b538SAndroid Build Coastguard Worker   }
is_client_max_window_bits_specified()66*6777b538SAndroid Build Coastguard Worker   bool is_client_max_window_bits_specified() const {
67*6777b538SAndroid Build Coastguard Worker     return client_max_window_bits_.is_specified;
68*6777b538SAndroid Build Coastguard Worker   }
has_client_max_window_bits_value()69*6777b538SAndroid Build Coastguard Worker   bool has_client_max_window_bits_value() const {
70*6777b538SAndroid Build Coastguard Worker     DCHECK(is_client_max_window_bits_specified());
71*6777b538SAndroid Build Coastguard Worker     return client_max_window_bits_.has_value;
72*6777b538SAndroid Build Coastguard Worker   }
client_max_window_bits()73*6777b538SAndroid Build Coastguard Worker   int client_max_window_bits() const {
74*6777b538SAndroid Build Coastguard Worker     DCHECK(has_client_max_window_bits_value());
75*6777b538SAndroid Build Coastguard Worker     return client_max_window_bits_.bits;
76*6777b538SAndroid Build Coastguard Worker   }
SetServerNoContextTakeOver()77*6777b538SAndroid Build Coastguard Worker   void SetServerNoContextTakeOver() {
78*6777b538SAndroid Build Coastguard Worker     server_context_take_over_mode_ =
79*6777b538SAndroid Build Coastguard Worker         WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT;
80*6777b538SAndroid Build Coastguard Worker   }
SetClientNoContextTakeOver()81*6777b538SAndroid Build Coastguard Worker   void SetClientNoContextTakeOver() {
82*6777b538SAndroid Build Coastguard Worker     client_context_take_over_mode_ =
83*6777b538SAndroid Build Coastguard Worker         WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT;
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker   // |bits| must be valid as a max_window_bits value.
SetServerMaxWindowBits(int bits)86*6777b538SAndroid Build Coastguard Worker   void SetServerMaxWindowBits(int bits) {
87*6777b538SAndroid Build Coastguard Worker     DCHECK(IsValidWindowBits(bits));
88*6777b538SAndroid Build Coastguard Worker     server_max_window_bits_ = WindowBits(bits, true, true);
89*6777b538SAndroid Build Coastguard Worker   }
SetClientMaxWindowBits()90*6777b538SAndroid Build Coastguard Worker   void SetClientMaxWindowBits() {
91*6777b538SAndroid Build Coastguard Worker     client_max_window_bits_ = WindowBits(0, true, false);
92*6777b538SAndroid Build Coastguard Worker   }
93*6777b538SAndroid Build Coastguard Worker   // |bits| must be valid as a max_window_bits value.
SetClientMaxWindowBits(int bits)94*6777b538SAndroid Build Coastguard Worker   void SetClientMaxWindowBits(int bits) {
95*6777b538SAndroid Build Coastguard Worker     DCHECK(IsValidWindowBits(bits));
96*6777b538SAndroid Build Coastguard Worker     client_max_window_bits_ = WindowBits(bits, true, true);
97*6777b538SAndroid Build Coastguard Worker   }
98*6777b538SAndroid Build Coastguard Worker 
PermissiveServerMaxWindowBits()99*6777b538SAndroid Build Coastguard Worker   int PermissiveServerMaxWindowBits() const {
100*6777b538SAndroid Build Coastguard Worker     return server_max_window_bits_.PermissiveBits();
101*6777b538SAndroid Build Coastguard Worker   }
PermissiveClientMaxWindowBits()102*6777b538SAndroid Build Coastguard Worker   int PermissiveClientMaxWindowBits() const {
103*6777b538SAndroid Build Coastguard Worker     return client_max_window_bits_.PermissiveBits();
104*6777b538SAndroid Build Coastguard Worker   }
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   // Return true if |bits| is valid as a max_window_bits value.
IsValidWindowBits(int bits)107*6777b538SAndroid Build Coastguard Worker   static bool IsValidWindowBits(int bits) { return 8 <= bits && bits <= 15; }
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker  private:
110*6777b538SAndroid Build Coastguard Worker   struct WindowBits {
WindowBitsWindowBits111*6777b538SAndroid Build Coastguard Worker     WindowBits() : WindowBits(0, false, false) {}
WindowBitsWindowBits112*6777b538SAndroid Build Coastguard Worker     WindowBits(int16_t bits, bool is_specified, bool has_value)
113*6777b538SAndroid Build Coastguard Worker         : bits(bits), is_specified(is_specified), has_value(has_value) {}
114*6777b538SAndroid Build Coastguard Worker 
PermissiveBitsWindowBits115*6777b538SAndroid Build Coastguard Worker     int PermissiveBits() const {
116*6777b538SAndroid Build Coastguard Worker       return (is_specified && has_value) ? bits : 15;
117*6777b538SAndroid Build Coastguard Worker     }
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker     int16_t bits;
120*6777b538SAndroid Build Coastguard Worker     // True when "window bits" parameter appears in the parameters.
121*6777b538SAndroid Build Coastguard Worker     bool is_specified;
122*6777b538SAndroid Build Coastguard Worker     // True when "window bits" parameter has the value.
123*6777b538SAndroid Build Coastguard Worker     bool has_value;
124*6777b538SAndroid Build Coastguard Worker   };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // |server_context_take_over_mode| is set to DO_NOT_TAKE_OVER_CONTEXT if and
127*6777b538SAndroid Build Coastguard Worker   // only if |server_no_context_takeover| is set in the parameters.
128*6777b538SAndroid Build Coastguard Worker   ContextTakeOverMode server_context_take_over_mode_ =
129*6777b538SAndroid Build Coastguard Worker       WebSocketDeflater::TAKE_OVER_CONTEXT;
130*6777b538SAndroid Build Coastguard Worker   // |client_context_take_over_mode| is set to DO_NOT_TAKE_OVER_CONTEXT if and
131*6777b538SAndroid Build Coastguard Worker   // only if |client_no_context_takeover| is set in the parameters.
132*6777b538SAndroid Build Coastguard Worker   ContextTakeOverMode client_context_take_over_mode_ =
133*6777b538SAndroid Build Coastguard Worker       WebSocketDeflater::TAKE_OVER_CONTEXT;
134*6777b538SAndroid Build Coastguard Worker   WindowBits server_max_window_bits_;
135*6777b538SAndroid Build Coastguard Worker   WindowBits client_max_window_bits_;
136*6777b538SAndroid Build Coastguard Worker };
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker }  // namespace net
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker #endif  // NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
141