Splits client and server deflate config

pull/144/head
SirCipher 5 years ago
parent 31d05fbd96
commit e0cadce7af
  1. 2
      autobahn/fuzzingclient.json
  2. 23
      src/extensions/compression/deflate.rs
  3. 13
      src/extensions/compression/mod.rs
  4. 2
      src/protocol/mod.rs

@ -6,7 +6,7 @@
"url": "ws://127.0.0.1:9002" "url": "ws://127.0.0.1:9002"
} }
], ],
"cases": ["13.7.11"], "cases": ["*"],
"exclude-cases": [], "exclude-cases": [],
"exclude-agent-cases": {} "exclude-agent-cases": {}
} }

@ -256,8 +256,8 @@ pub struct DeflateExt {
} }
impl DeflateExt { impl DeflateExt {
/// Creates a `DeflateExt` instance using the provided configuration. /// Creates a `DeflateExt` instance for a client using the provided configuration.
pub fn new(config: DeflateConfig) -> DeflateExt { pub fn client(config: DeflateConfig) -> DeflateExt {
DeflateExt { DeflateExt {
config, config,
fragment_buffer: FragmentBuffer::new(config.max_message_size), fragment_buffer: FragmentBuffer::new(config.max_message_size),
@ -266,9 +266,20 @@ impl DeflateExt {
uncompressed_extension: UncompressedExt::new(config.max_message_size()), uncompressed_extension: UncompressedExt::new(config.max_message_size()),
} }
} }
/// Creates a `DeflateExt` instance for a server using the provided configuration.
pub fn server(config: DeflateConfig) -> DeflateExt {
DeflateExt {
config,
fragment_buffer: FragmentBuffer::new(config.max_message_size),
inflator: Inflator::new(config.client_max_window_bits),
deflator: Deflator::new(config.compression_level, config.server_max_window_bits),
uncompressed_extension: UncompressedExt::new(config.max_message_size()),
}
}
} }
fn parse_window_parameter<'a>( fn parse_window_parameter(
window_param: &str, window_param: &str,
max_window_bits: u8, max_window_bits: u8,
) -> Result<Option<u8>, DeflateExtensionError> { ) -> Result<Option<u8>, DeflateExtensionError> {
@ -674,12 +685,6 @@ impl From<InvalidHeaderValue> for DeflateExtensionError {
} }
} }
impl Default for DeflateExt {
fn default() -> Self {
DeflateExt::new(Default::default())
}
}
impl WebSocketExtension for DeflateExt { impl WebSocketExtension for DeflateExt {
fn on_send_frame(&mut self, mut frame: Frame) -> Result<Frame, crate::Error> { fn on_send_frame(&mut self, mut frame: Frame) -> Result<Frame, crate::Error> {
if let OpCode::Data(_) = frame.header().opcode { if let OpCode::Data(_) = frame.header().opcode {

@ -9,7 +9,7 @@ use crate::extensions::compression::uncompressed::UncompressedExt;
use crate::extensions::WebSocketExtension; use crate::extensions::WebSocketExtension;
use crate::protocol::frame::coding::Data; use crate::protocol::frame::coding::Data;
use crate::protocol::frame::{ExtensionHeaders, Frame}; use crate::protocol::frame::{ExtensionHeaders, Frame};
use crate::protocol::WebSocketConfig; use crate::protocol::{Role, WebSocketConfig};
use crate::Message; use crate::Message;
use http::{Request, Response}; use http::{Request, Response};
use std::borrow::Cow; use std::borrow::Cow;
@ -43,15 +43,20 @@ pub enum CompressionSwitcher {
} }
impl CompressionSwitcher { impl CompressionSwitcher {
/// Builds a new `CompressionSwitcher` from the provided compression level. /// Builds a new `CompressionSwitcher` from the provided compression level and role.
pub fn from_config(config: WsCompression) -> CompressionSwitcher { pub fn from_config(config: WsCompression, _role: Role) -> CompressionSwitcher {
match config { match config {
WsCompression::None(size) => { WsCompression::None(size) => {
CompressionSwitcher::Uncompressed(UncompressedExt::new(size)) CompressionSwitcher::Uncompressed(UncompressedExt::new(size))
} }
#[cfg(feature = "deflate")] #[cfg(feature = "deflate")]
WsCompression::Deflate(config) => { WsCompression::Deflate(config) => {
CompressionSwitcher::Compressed(DeflateExt::new(config)) let ext = match _role {
Role::Client => DeflateExt::client(config),
Role::Server => DeflateExt::server(config),
};
CompressionSwitcher::Compressed(ext)
} }
} }
} }

@ -244,7 +244,7 @@ impl WebSocketContext {
/// Create a WebSocket context that manages a post-handshake stream. /// Create a WebSocket context that manages a post-handshake stream.
pub fn new(role: Role, config: Option<WebSocketConfig>) -> Self { pub fn new(role: Role, config: Option<WebSocketConfig>) -> Self {
let config = config.unwrap_or_else(Default::default); let config = config.unwrap_or_else(Default::default);
let decoder = CompressionSwitcher::from_config(config.compression); let decoder = CompressionSwitcher::from_config(config.compression, role);
WebSocketContext { WebSocketContext {
role, role,

Loading…
Cancel
Save