parent
779514704e
commit
fd43b07c10
@ -0,0 +1,290 @@ |
||||
use crate::extensions::compression::deflate::{ |
||||
on_receive_request, DeflateConfigBuilder, DeflateExtensionError, |
||||
}; |
||||
use http::header::SEC_WEBSOCKET_EXTENSIONS; |
||||
use http::{HeaderValue, Request, Response}; |
||||
|
||||
mod server { |
||||
use super::*; |
||||
|
||||
#[test] |
||||
fn config_unchanged_on_err() { |
||||
let s = "permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover; server_max_window_bits=\"80000\""; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let initial_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let mut parsed_config = initial_config.clone(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Err(DeflateExtensionError::InvalidMaxWindowBits)); |
||||
assert_eq!(initial_config, parsed_config); |
||||
} |
||||
|
||||
#[test] |
||||
fn missing_client_window_size() { |
||||
let s = "permessage-deflate; client_max_window_bits"; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let mut initial_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut initial_config); |
||||
|
||||
assert!(r.is_ok()); |
||||
let parsed_header = response |
||||
.headers() |
||||
.get(SEC_WEBSOCKET_EXTENSIONS) |
||||
.expect("Missing header") |
||||
.to_str() |
||||
.expect("Failed to parse header"); |
||||
|
||||
assert_eq!( |
||||
parsed_header, |
||||
"permessage-deflate; client_max_window_bits=11; server_max_window_bits=10" |
||||
); |
||||
} |
||||
|
||||
#[test] |
||||
fn missing_server_window_size() { |
||||
let s = "permessage-deflate; server_max_window_bits"; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let initial_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let mut parsed_config = initial_config.clone(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Err(DeflateExtensionError::InvalidMaxWindowBits)); |
||||
assert_eq!(initial_config, parsed_config); |
||||
} |
||||
|
||||
#[test] |
||||
fn config_unchanged_on_mismatch() { |
||||
let s = "permessage-deflate; unknown_parameter=\"invalid\"; client_no_context_takeover; server_no_context_takeover"; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let initial_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(8) |
||||
.build(); |
||||
|
||||
let mut parsed_config = initial_config.clone(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!( |
||||
r, |
||||
Err(DeflateExtensionError::NegotiationError( |
||||
"Unknown permessage-deflate parameter: unknown_parameter=\"invalid\"".into() |
||||
)) |
||||
); |
||||
assert_eq!(initial_config, parsed_config); |
||||
} |
||||
|
||||
#[test] |
||||
fn parses_named_parameters() { |
||||
let s = "permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover; server_max_window_bits=\"8\""; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let mut parsed_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Ok(true)); |
||||
|
||||
let mut expected_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(8) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
expected_config.set_compress_reset(true); |
||||
expected_config.set_decompress_reset(true); |
||||
|
||||
assert_eq!(parsed_config, expected_config); |
||||
|
||||
let parsed_header = response |
||||
.headers() |
||||
.get(SEC_WEBSOCKET_EXTENSIONS) |
||||
.expect("Missing header") |
||||
.to_str() |
||||
.expect("Failed to parse header"); |
||||
|
||||
assert_eq!(parsed_header, "permessage-deflate; client_no_context_takeover; client_max_window_bits=11; server_no_context_takeover; server_max_window_bits=8"); |
||||
} |
||||
|
||||
#[test] |
||||
fn splits() { |
||||
let s = "not-permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover; server_max_window_bits=8, no-permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover, permessage-deflate; client_no_context_takeover; client_max_window_bits"; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let mut parsed_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Ok(true)); |
||||
|
||||
let mut expected_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
expected_config.set_decompress_reset(true); |
||||
|
||||
assert_eq!(parsed_config, expected_config); |
||||
|
||||
let parsed_header = response |
||||
.headers() |
||||
.get(SEC_WEBSOCKET_EXTENSIONS) |
||||
.expect("Missing header") |
||||
.to_str() |
||||
.expect("Failed to parse header"); |
||||
|
||||
assert_eq!(parsed_header, "permessage-deflate; client_no_context_takeover; client_max_window_bits=11; server_max_window_bits=10"); |
||||
} |
||||
|
||||
#[test] |
||||
fn splits_on_new_line() { |
||||
let s = "not-permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover; server_max_window_bits=8,\\n\\r\\t \\ no-permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover, permessage-deflate; client_no_context_takeover; client_max_window_bits"; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let mut parsed_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Ok(true)); |
||||
|
||||
let mut expected_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
expected_config.set_decompress_reset(true); |
||||
|
||||
assert_eq!(parsed_config, expected_config); |
||||
|
||||
let parsed_header = response |
||||
.headers() |
||||
.get(SEC_WEBSOCKET_EXTENSIONS) |
||||
.expect("Missing header") |
||||
.to_str() |
||||
.expect("Failed to parse header"); |
||||
|
||||
assert_eq!(parsed_header, "permessage-deflate; client_no_context_takeover; client_max_window_bits=11; server_max_window_bits=10"); |
||||
} |
||||
} |
||||
|
||||
mod client { |
||||
use super::*; |
||||
use crate::extensions::compression::deflate::on_response; |
||||
|
||||
#[test] |
||||
fn splits_on_new_line() { |
||||
let s = "permessage-deflate; client_no_context_takeover; client_max_window_bits=8; server_max_window_bits=10"; |
||||
|
||||
let mut response = Response::new(()); |
||||
response |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut parsed_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_response(&mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Ok(true)); |
||||
|
||||
let mut expected_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(8) |
||||
.build(); |
||||
expected_config.set_compress_reset(true); |
||||
|
||||
assert_eq!(parsed_config, expected_config); |
||||
} |
||||
|
||||
#[test] |
||||
fn parses_named_parameters() { |
||||
let s = "permessage-deflate; client_no_context_takeover; client_max_window_bits; server_no_context_takeover; server_max_window_bits=\"8\""; |
||||
let mut request = Request::new(()); |
||||
request |
||||
.headers_mut() |
||||
.insert(SEC_WEBSOCKET_EXTENSIONS, HeaderValue::from_static(s)); |
||||
|
||||
let mut response = Response::new(()); |
||||
let mut parsed_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(10) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
let r = on_receive_request(&request, &mut response, &mut parsed_config); |
||||
|
||||
assert_eq!(r, Ok(true)); |
||||
|
||||
let mut expected_config = DeflateConfigBuilder::default() |
||||
.server_max_window_bits(8) |
||||
.client_max_window_bits(11) |
||||
.build(); |
||||
|
||||
expected_config.set_compress_reset(true); |
||||
expected_config.set_decompress_reset(true); |
||||
|
||||
assert_eq!(parsed_config, expected_config); |
||||
|
||||
let parsed_header = response |
||||
.headers() |
||||
.get(SEC_WEBSOCKET_EXTENSIONS) |
||||
.expect("Missing header") |
||||
.to_str() |
||||
.expect("Failed to parse header"); |
||||
|
||||
assert_eq!(parsed_header, "permessage-deflate; client_no_context_takeover; client_max_window_bits=11; server_no_context_takeover; server_max_window_bits=8"); |
||||
} |
||||
} |
@ -0,0 +1,2 @@ |
||||
#[cfg(feature = "deflate")] |
||||
mod deflate; |
Loading…
Reference in new issue