mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 00:06:09 +03:00
141 lines
4.8 KiB
C
141 lines
4.8 KiB
C
|
// Copyright 2015 The Chromium Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
#ifndef NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
|
||
|
#define NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include <string>
|
||
|
|
||
|
#include "base/logging.h"
|
||
|
#include "net/base/net_export.h"
|
||
|
#include "net/websockets/websocket_deflater.h"
|
||
|
#include "net/websockets/websocket_extension.h"
|
||
|
|
||
|
namespace net {
|
||
|
|
||
|
// A WebSocketDeflateParameters represents permessage-deflate extension
|
||
|
// parameters. This class is used either for request and response.
|
||
|
class NET_EXPORT_PRIVATE WebSocketDeflateParameters {
|
||
|
public:
|
||
|
using ContextTakeOverMode = WebSocketDeflater::ContextTakeOverMode;
|
||
|
|
||
|
// Returns a WebSocketExtension instance containing the parameters stored in
|
||
|
// this object.
|
||
|
WebSocketExtension AsExtension() const;
|
||
|
|
||
|
// Returns true when succeeded.
|
||
|
// Returns false and stores the failure message to |failure_message|
|
||
|
// otherwise.
|
||
|
// Note that even if this function succeeds it is not guaranteed that the
|
||
|
// object is valid. To check it, call IsValidAsRequest or IsValidAsResponse.
|
||
|
bool Initialize(const WebSocketExtension& input,
|
||
|
std::string* failure_message);
|
||
|
|
||
|
// Returns true when |*this| and |response| are compatible.
|
||
|
// |*this| must be valid as a request and |response| must be valid as a
|
||
|
// response.
|
||
|
bool IsCompatibleWith(const WebSocketDeflateParameters& response) const;
|
||
|
|
||
|
bool IsValidAsRequest(std::string* failure_message) const;
|
||
|
bool IsValidAsResponse(std::string* failure_message) const;
|
||
|
bool IsValidAsRequest() const {
|
||
|
std::string message;
|
||
|
return IsValidAsRequest(&message);
|
||
|
}
|
||
|
bool IsValidAsResponse() const {
|
||
|
std::string message;
|
||
|
return IsValidAsResponse(&message);
|
||
|
}
|
||
|
|
||
|
ContextTakeOverMode server_context_take_over_mode() const {
|
||
|
return server_context_take_over_mode_;
|
||
|
}
|
||
|
ContextTakeOverMode client_context_take_over_mode() const {
|
||
|
return client_context_take_over_mode_;
|
||
|
}
|
||
|
bool is_server_max_window_bits_specified() const {
|
||
|
return server_max_window_bits_.is_specified;
|
||
|
}
|
||
|
int server_max_window_bits() const {
|
||
|
DCHECK(is_server_max_window_bits_specified());
|
||
|
return server_max_window_bits_.bits;
|
||
|
}
|
||
|
bool is_client_max_window_bits_specified() const {
|
||
|
return client_max_window_bits_.is_specified;
|
||
|
}
|
||
|
bool has_client_max_window_bits_value() const {
|
||
|
DCHECK(is_client_max_window_bits_specified());
|
||
|
return client_max_window_bits_.has_value;
|
||
|
}
|
||
|
int client_max_window_bits() const {
|
||
|
DCHECK(has_client_max_window_bits_value());
|
||
|
return client_max_window_bits_.bits;
|
||
|
}
|
||
|
void SetServerNoContextTakeOver() {
|
||
|
server_context_take_over_mode_ =
|
||
|
WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT;
|
||
|
}
|
||
|
void SetClientNoContextTakeOver() {
|
||
|
client_context_take_over_mode_ =
|
||
|
WebSocketDeflater::DO_NOT_TAKE_OVER_CONTEXT;
|
||
|
}
|
||
|
// |bits| must be valid as a max_window_bits value.
|
||
|
void SetServerMaxWindowBits(int bits) {
|
||
|
DCHECK(IsValidWindowBits(bits));
|
||
|
server_max_window_bits_ = WindowBits(bits, true, true);
|
||
|
}
|
||
|
void SetClientMaxWindowBits() {
|
||
|
client_max_window_bits_ = WindowBits(0, true, false);
|
||
|
}
|
||
|
// |bits| must be valid as a max_window_bits value.
|
||
|
void SetClientMaxWindowBits(int bits) {
|
||
|
DCHECK(IsValidWindowBits(bits));
|
||
|
client_max_window_bits_ = WindowBits(bits, true, true);
|
||
|
}
|
||
|
|
||
|
int PermissiveServerMaxWindowBits() const {
|
||
|
return server_max_window_bits_.PermissiveBits();
|
||
|
}
|
||
|
int PermissiveClientMaxWindowBits() const {
|
||
|
return client_max_window_bits_.PermissiveBits();
|
||
|
}
|
||
|
|
||
|
// Return true if |bits| is valid as a max_window_bits value.
|
||
|
static bool IsValidWindowBits(int bits) { return 8 <= bits && bits <= 15; }
|
||
|
|
||
|
private:
|
||
|
struct WindowBits {
|
||
|
WindowBits() : WindowBits(0, false, false) {}
|
||
|
WindowBits(int16_t bits, bool is_specified, bool has_value)
|
||
|
: bits(bits), is_specified(is_specified), has_value(has_value) {}
|
||
|
|
||
|
int PermissiveBits() const {
|
||
|
return (is_specified && has_value) ? bits : 15;
|
||
|
}
|
||
|
|
||
|
int16_t bits;
|
||
|
// True when "window bits" parameter appears in the parameters.
|
||
|
bool is_specified;
|
||
|
// True when "window bits" parameter has the value.
|
||
|
bool has_value;
|
||
|
};
|
||
|
|
||
|
// |server_context_take_over_mode| is set to DO_NOT_TAKE_OVER_CONTEXT if and
|
||
|
// only if |server_no_context_takeover| is set in the parameters.
|
||
|
ContextTakeOverMode server_context_take_over_mode_ =
|
||
|
WebSocketDeflater::TAKE_OVER_CONTEXT;
|
||
|
// |client_context_take_over_mode| is set to DO_NOT_TAKE_OVER_CONTEXT if and
|
||
|
// only if |client_no_context_takeover| is set in the parameters.
|
||
|
ContextTakeOverMode client_context_take_over_mode_ =
|
||
|
WebSocketDeflater::TAKE_OVER_CONTEXT;
|
||
|
WindowBits server_max_window_bits_;
|
||
|
WindowBits client_max_window_bits_;
|
||
|
};
|
||
|
|
||
|
} // namespace net
|
||
|
|
||
|
#endif // NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PARAMETERS_H_
|