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