diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c024a6..88ca54e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ # Next +- Fixes: + - `header` matcher now accepts a single header value containing commas (e.g. an RFC 2822 date such as `Sun, 01 Jan 2023 00:00:00 GMT`). Previously the received value was always split on `,`, which caused such matchers to fail. + # `0.5.8` - Features: diff --git a/src/matchers.rs b/src/matchers.rs index b9650dc..8bfcf68 100644 --- a/src/matchers.rs +++ b/src/matchers.rs @@ -396,9 +396,13 @@ impl HeaderExactMatcher { impl Match for HeaderExactMatcher { fn matches(&self, request: &Request) -> bool { - let values = request - .headers - .get_all(&self.0) + let raw_values: Vec<&HeaderValue> = request.headers.get_all(&self.0).iter().collect(); + if raw_values.len() == self.1.len() + && raw_values.iter().zip(self.1.iter()).all(|(a, b)| *a == b) + { + return true; + } + let split_values = raw_values .iter() .filter_map(|v| v.to_str().ok()) .flat_map(|v| { @@ -407,7 +411,7 @@ impl Match for HeaderExactMatcher { .filter_map(|v| HeaderValue::from_str(v).ok()) }) .collect::>(); - values == self.1 // order matters + split_values == self.1 } } diff --git a/tests/request_header_matching.rs b/tests/request_header_matching.rs index 37472c0..cbd77bd 100644 --- a/tests/request_header_matching.rs +++ b/tests/request_header_matching.rs @@ -158,6 +158,28 @@ async fn should_not_match_multi_request_header_upon_incomplete_values() { assert_eq!(should_fail_incomplete_values.status(), 404); } +#[async_std::test] +async fn should_match_single_header_value_containing_comma() { + // Arrange + let mock_server = MockServer::start().await; + let mock = Mock::given(method("GET")) + .and(header("x-ms-date", "Sun, 01 Jan 2023 00:00:00 GMT")) + .respond_with(ResponseTemplate::new(200)); + mock_server.register(mock).await; + + // Act + let client = reqwest::Client::new(); + let should_match = client + .get(mock_server.uri()) + .header("x-ms-date", "Sun, 01 Jan 2023 00:00:00 GMT") + .send() + .await + .unwrap(); + + // Assert + assert_eq!(should_match.status(), 200); +} + #[async_std::test] async fn should_match_regex_single_header_value() { // Arrange