HttpHeaders are no longer a MultiValueMap
This change removes the `MultiValueMap` nature of `HttpHeaders`, since it inherits APIs that do not align well with underlying server implementations. Notably, methods that allows to iterate over the whole collection of headers are susceptible to artificially introduced duplicates when multiple casings are used for a given header, depending on the underlying implementation. This change includes a dedicated key set implementation to support iterator-based removal, and either keeps map method implementations that are relevant or introduces header-focused methods that have a similar responsibility (like `hasHeaderValues(String, List)` and `containsHeaderValue(String, String)`). In order to nudge users away from using an HttpHeaders as a Map, the `asSingleValueMap` view is deprecated. In order to offer an escape hatch to users that do make use of the `MultiValueMap` API, a similar `asMultiValueMap` view is introduced but is immediately marked as deprecated. This change also adds map-like but header-focused assertions to `HttpHeadersAssert`, since it cannot extend `AbstractMapAssert` anymore. Closes gh-33913
This commit is contained in:
@@ -35,7 +35,7 @@ class HttpEntityTests {
|
||||
String body = "foo";
|
||||
HttpEntity<String> entity = new HttpEntity<>(body);
|
||||
assertThat(entity.getBody()).isSameAs(body);
|
||||
assertThat(entity.getHeaders()).isEmpty();
|
||||
assertThat(entity.getHeaders().isEmpty()).as("isEmpty").isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -62,25 +62,25 @@ class HttpEntityTests {
|
||||
|
||||
@Test
|
||||
void testEquals() {
|
||||
MultiValueMap<String, String> map1 = new LinkedMultiValueMap<>();
|
||||
map1.set("Content-Type", "text/plain");
|
||||
HttpHeaders headers1 = new HttpHeaders();
|
||||
headers1.set("Content-Type", "text/plain");
|
||||
|
||||
MultiValueMap<String, String> map2 = new LinkedMultiValueMap<>();
|
||||
map2.set("Content-Type", "application/json");
|
||||
HttpHeaders headers2 = new HttpHeaders();
|
||||
headers2.set("Content-Type", "application/json");
|
||||
|
||||
assertThat(new HttpEntity<>().equals(new HttpEntity<>())).isTrue();
|
||||
assertThat(new HttpEntity<>(map1).equals(new HttpEntity<>())).isFalse();
|
||||
assertThat(new HttpEntity<>().equals(new HttpEntity<>(map2))).isFalse();
|
||||
assertThat(new HttpEntity<>(headers1).equals(new HttpEntity<>())).isFalse();
|
||||
assertThat(new HttpEntity<>().equals(new HttpEntity<>(headers2))).isFalse();
|
||||
|
||||
assertThat(new HttpEntity<>(map1).equals(new HttpEntity<>(map1))).isTrue();
|
||||
assertThat(new HttpEntity<>(map1).equals(new HttpEntity<>(map2))).isFalse();
|
||||
assertThat(new HttpEntity<>(headers1).equals(new HttpEntity<>(headers1))).isTrue();
|
||||
assertThat(new HttpEntity<>(headers1).equals(new HttpEntity<>(headers2))).isFalse();
|
||||
|
||||
assertThat(new HttpEntity<String>(null, null).equals(new HttpEntity<>(null, null))).isTrue();
|
||||
assertThat(new HttpEntity<>("foo", null).equals(new HttpEntity<>(null, null))).isFalse();
|
||||
assertThat(new HttpEntity<String>(null, null).equals(new HttpEntity<>("bar", null))).isFalse();
|
||||
assertThat(new HttpEntity<String>(null, (HttpHeaders) null).equals(new HttpEntity<>(null, (HttpHeaders) null))).isTrue();
|
||||
assertThat(new HttpEntity<>("foo", (HttpHeaders) null).equals(new HttpEntity<>(null, (HttpHeaders) null))).isFalse();
|
||||
assertThat(new HttpEntity<String>(null, (HttpHeaders) null).equals(new HttpEntity<>("bar", (HttpHeaders) null))).isFalse();
|
||||
|
||||
assertThat(new HttpEntity<>("foo", map1).equals(new HttpEntity<>("foo", map1))).isTrue();
|
||||
assertThat(new HttpEntity<>("foo", map1).equals(new HttpEntity<>("bar", map1))).isFalse();
|
||||
assertThat(new HttpEntity<>("foo", headers1).equals(new HttpEntity<>("foo", headers1))).isTrue();
|
||||
assertThat(new HttpEntity<>("foo", headers1).equals(new HttpEntity<>("bar", headers1))).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -645,7 +645,7 @@ class HttpHeadersTests {
|
||||
void keySetOperations() {
|
||||
headers.add("Alpha", "apple");
|
||||
headers.add("Bravo", "banana");
|
||||
Set<String> keySet = headers.keySet();
|
||||
Set<String> keySet = headers.headerNames();
|
||||
|
||||
// Please DO NOT simplify the following with AssertJ's fluent API.
|
||||
//
|
||||
@@ -677,17 +677,17 @@ class HttpHeadersTests {
|
||||
// remove()
|
||||
assertThat(keySet.remove("Alpha")).isTrue();
|
||||
assertThat(keySet).hasSize(1);
|
||||
assertThat(headers).hasSize(1);
|
||||
assertThat(headers.size()).isOne();
|
||||
assertThat(keySet.remove("Alpha")).isFalse();
|
||||
assertThat(keySet).hasSize(1);
|
||||
assertThat(headers).hasSize(1);
|
||||
assertThat(headers.size()).isOne();
|
||||
|
||||
// clear()
|
||||
keySet.clear();
|
||||
assertThat(keySet).isEmpty();
|
||||
assertThat(keySet).isEmpty();
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
|
||||
// Unsupported operations
|
||||
assertThatExceptionOfType(UnsupportedOperationException.class)
|
||||
@@ -705,10 +705,10 @@ class HttpHeadersTests {
|
||||
// --- Given ---
|
||||
headers.add("Alpha", "apple");
|
||||
headers.add("Bravo", "banana");
|
||||
assertThat(headers).containsOnlyKeys("Alpha", "Bravo");
|
||||
assertThat(headers.headerNames()).containsOnly("Alpha", "Bravo");
|
||||
|
||||
// --- When ---
|
||||
boolean removed = headers.keySet().remove("Alpha");
|
||||
boolean removed = headers.headerNames().remove("Alpha");
|
||||
|
||||
// --- Then ---
|
||||
|
||||
@@ -718,12 +718,12 @@ class HttpHeadersTests {
|
||||
// the behavior of the entire contract.
|
||||
|
||||
assertThat(removed).isTrue();
|
||||
assertThat(headers.keySet().remove("Alpha")).isFalse();
|
||||
assertThat(headers).hasSize(1);
|
||||
assertThat(headers.containsKey("Alpha")).as("Alpha should have been removed").isFalse();
|
||||
assertThat(headers.containsKey("Bravo")).as("Bravo should be present").isTrue();
|
||||
assertThat(headers.keySet()).containsOnly("Bravo");
|
||||
assertThat(headers.entrySet()).containsOnly(entry("Bravo", List.of("banana")));
|
||||
assertThat(headers.headerNames().remove("Alpha")).isFalse();
|
||||
assertThat(headers.size()).isOne();
|
||||
assertThat(headers.containsHeader("Alpha")).as("Alpha should have been removed").isFalse();
|
||||
assertThat(headers.containsHeader("Bravo")).as("Bravo should be present").isTrue();
|
||||
assertThat(headers.headerNames()).containsOnly("Bravo");
|
||||
assertThat(headers.headerSet()).containsOnly(entry("Bravo", List.of("banana")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -731,11 +731,11 @@ class HttpHeadersTests {
|
||||
String headerName = "MyHeader";
|
||||
String headerValue = "value";
|
||||
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
headers.add(headerName, headerValue);
|
||||
assertThat(headers.containsKey(headerName)).isTrue();
|
||||
headers.keySet().removeIf(key -> key.equals(headerName));
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers.containsHeader(headerName)).isTrue();
|
||||
headers.headerNames().removeIf(key -> key.equals(headerName));
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
headers.add(headerName, headerValue);
|
||||
assertThat(headers.get(headerName)).containsExactly(headerValue);
|
||||
}
|
||||
@@ -745,11 +745,11 @@ class HttpHeadersTests {
|
||||
String headerName = "MyHeader";
|
||||
String headerValue = "value";
|
||||
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
headers.add(headerName, headerValue);
|
||||
assertThat(headers.containsKey(headerName)).isTrue();
|
||||
headers.entrySet().removeIf(entry -> entry.getKey().equals(headerName));
|
||||
assertThat(headers).isEmpty();
|
||||
assertThat(headers.containsHeader(headerName)).isTrue();
|
||||
headers.headerSet().removeIf(entry -> entry.getKey().equals(headerName));
|
||||
assertThat(headers.isEmpty()).as("isEmpty").isTrue();
|
||||
headers.add(headerName, headerValue);
|
||||
assertThat(headers.get(headerName)).containsExactly(headerValue);
|
||||
}
|
||||
@@ -764,10 +764,10 @@ class HttpHeadersTests {
|
||||
|
||||
String[] expectedKeys = new String[] { "aardvark", "beaver", "cat", "dog", "elephant" };
|
||||
|
||||
assertThat(headers.entrySet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
assertThat(headers.headerSet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
|
||||
HttpHeaders readOnlyHttpHeaders = HttpHeaders.readOnlyHttpHeaders(headers);
|
||||
assertThat(readOnlyHttpHeaders.entrySet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
assertThat(readOnlyHttpHeaders.headerSet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -784,15 +784,15 @@ class HttpHeadersTests {
|
||||
|
||||
HttpHeaders forEachHeaders = new HttpHeaders();
|
||||
readOnlyHttpHeaders.forEach(forEachHeaders::putIfAbsent);
|
||||
assertThat(forEachHeaders.entrySet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
assertThat(forEachHeaders.headerSet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
|
||||
HttpHeaders putAllHeaders = new HttpHeaders();
|
||||
putAllHeaders.putAll(readOnlyHttpHeaders);
|
||||
assertThat(putAllHeaders.entrySet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
assertThat(putAllHeaders.headerSet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
|
||||
HttpHeaders addAllHeaders = new HttpHeaders();
|
||||
addAllHeaders.addAll(readOnlyHttpHeaders);
|
||||
assertThat(addAllHeaders.entrySet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
assertThat(addAllHeaders.headerSet()).extracting(Entry::getKey).containsExactly(expectedKeys);
|
||||
}
|
||||
|
||||
@Test // gh-25034
|
||||
|
||||
@@ -52,7 +52,7 @@ class RequestEntityTests {
|
||||
|
||||
assertThat(requestEntity).isNotNull();
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.GET);
|
||||
assertThat(requestEntity.getHeaders().containsKey(headerName)).isTrue();
|
||||
assertThat(requestEntity.getHeaders().containsHeader(headerName)).isTrue();
|
||||
assertThat(requestEntity.getHeaders().getFirst(headerName)).isEqualTo(headerValue);
|
||||
assertThat(requestEntity.getBody()).isEqualTo(entity);
|
||||
}
|
||||
@@ -100,7 +100,7 @@ class RequestEntityTests {
|
||||
|
||||
assertThat(requestEntity).isNotNull();
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.GET);
|
||||
assertThat(requestEntity.getHeaders().containsKey(HttpHeaders.ACCEPT)).isTrue();
|
||||
assertThat(requestEntity.getHeaders().containsHeader(HttpHeaders.ACCEPT)).isTrue();
|
||||
assertThat(requestEntity.getHeaders().getFirst(HttpHeaders.ACCEPT)).isEqualTo("image/gif, image/jpeg, image/png");
|
||||
assertThat(requestEntity.getBody()).isNull();
|
||||
}
|
||||
@@ -120,7 +120,7 @@ class RequestEntityTests {
|
||||
ifNoneMatch(ifNoneMatch).
|
||||
contentLength(contentLength).
|
||||
contentType(contentType).
|
||||
headers(headers -> assertThat(headers).hasSize(6)).
|
||||
headers(headers -> assertThat(headers.size()).isEqualTo(6)).
|
||||
build();
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
|
||||
@@ -44,7 +44,7 @@ class ResponseEntityTests {
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseEntity.getHeaders().containsKey(headerName)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().containsHeader(headerName)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().get(headerName)).containsExactly(headerValue1, headerValue2);
|
||||
assertThat(responseEntity.getBody()).isEqualTo(entity);
|
||||
}
|
||||
@@ -113,7 +113,7 @@ class ResponseEntityTests {
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.CREATED);
|
||||
assertThat(responseEntity.getHeaders().containsKey(HttpHeaders.LOCATION)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().containsHeader(HttpHeaders.LOCATION)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().getFirst(HttpHeaders.LOCATION)).isEqualTo(location.toString());
|
||||
assertThat(responseEntity.getBody()).isNull();
|
||||
|
||||
@@ -195,7 +195,7 @@ class ResponseEntityTests {
|
||||
location(location).
|
||||
contentLength(contentLength).
|
||||
contentType(contentType).
|
||||
headers(headers -> assertThat(headers).hasSize(5)).
|
||||
headers(headers -> assertThat(headers.size()).isEqualTo(5)).
|
||||
build();
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
@@ -236,7 +236,7 @@ class ResponseEntityTests {
|
||||
HttpHeaders responseHeaders = responseEntity.getHeaders();
|
||||
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseHeaders).hasSize(1);
|
||||
assertThat(responseHeaders.size()).isOne();
|
||||
assertThat(responseHeaders.get("X-CustomHeader")).hasSize(1);
|
||||
assertThat(responseHeaders.getFirst("X-CustomHeader")).isEqualTo("vale");
|
||||
|
||||
@@ -250,7 +250,7 @@ class ResponseEntityTests {
|
||||
ResponseEntity.ok().headers((HttpHeaders) null).build();
|
||||
|
||||
assertThat(responseEntityWithEmptyHeaders.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseEntityWithEmptyHeaders.getHeaders()).isEmpty();
|
||||
assertThat(responseEntityWithEmptyHeaders.getHeaders().isEmpty()).isTrue();
|
||||
assertThat(responseEntityWithNullHeaders.toString()).isEqualTo(responseEntityWithEmptyHeaders.toString());
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ class ResponseEntityTests {
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL)).isFalse();
|
||||
assertThat(responseEntity.getHeaders().containsHeader(HttpHeaders.CACHE_CONTROL)).isFalse();
|
||||
assertThat(responseEntity.getBody()).isEqualTo(entity);
|
||||
}
|
||||
|
||||
@@ -281,7 +281,7 @@ class ResponseEntityTests {
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().containsHeader(HttpHeaders.CACHE_CONTROL)).isTrue();
|
||||
assertThat(responseEntity.getBody()).isEqualTo(entity);
|
||||
String cacheControlHeader = responseEntity.getHeaders().getCacheControl();
|
||||
assertThat(cacheControlHeader).isEqualTo(
|
||||
@@ -299,7 +299,7 @@ class ResponseEntityTests {
|
||||
|
||||
assertThat(responseEntity).isNotNull();
|
||||
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||
assertThat(responseEntity.getHeaders().containsKey(HttpHeaders.CACHE_CONTROL)).isTrue();
|
||||
assertThat(responseEntity.getHeaders().containsHeader(HttpHeaders.CACHE_CONTROL)).isTrue();
|
||||
assertThat(responseEntity.getBody()).isEqualTo(entity);
|
||||
|
||||
String cacheControlHeader = responseEntity.getHeaders().getCacheControl();
|
||||
|
||||
@@ -98,9 +98,11 @@ abstract class AbstractHttpRequestFactoryTests extends AbstractMockWebServerTest
|
||||
|
||||
try (ClientHttpResponse response = request.execute()) {
|
||||
assertThat(response.getStatusCode()).as("Invalid status code").isEqualTo(HttpStatus.OK);
|
||||
assertThat(response.getHeaders()).as("Header not found").containsKey(headerName);
|
||||
assertThat(response.getHeaders()).as("Header value not found")
|
||||
.containsEntry(headerName, Arrays.asList(headerValue1, headerValue2));
|
||||
assertThat(response.getHeaders().containsHeader(headerName))
|
||||
.as("Header not found").isTrue();
|
||||
assertThat(response.getHeaders().hasHeaderValues(headerName, Arrays.asList(headerValue1, headerValue2)))
|
||||
.as("Header value not found")
|
||||
.isTrue();
|
||||
byte[] result = FileCopyUtils.copyToByteArray(response.getBody());
|
||||
assertThat(Arrays.equals(body, result)).as("Invalid body").isTrue();
|
||||
}
|
||||
|
||||
@@ -51,8 +51,8 @@ class BufferingClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryT
|
||||
assertThat(response.getStatusCode()).as("Invalid status code").isEqualTo(HttpStatus.OK);
|
||||
assertThat(response.getStatusCode()).as("Invalid status code").isEqualTo(HttpStatus.OK);
|
||||
|
||||
assertThat(response.getHeaders().containsKey(headerName)).as("Header not found").isTrue();
|
||||
assertThat(response.getHeaders().containsKey(headerName)).as("Header not found").isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(headerName)).as("Header not found").isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(headerName)).as("Header not found").isTrue();
|
||||
|
||||
assertThat(response.getHeaders().get(headerName)).as("Header value not found").isEqualTo(Arrays.asList(headerValue1, headerValue2));
|
||||
assertThat(response.getHeaders().get(headerName)).as("Header value not found").isEqualTo(Arrays.asList(headerValue1, headerValue2));
|
||||
|
||||
@@ -103,7 +103,7 @@ class DefaultPartHttpMessageReaderTests {
|
||||
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(part -> {
|
||||
assertThat(part.headers()).isEmpty();
|
||||
assertThat(part.headers().isEmpty()).isTrue();
|
||||
part.content().subscribe(DataBufferUtils::release);
|
||||
})
|
||||
.verifyComplete();
|
||||
@@ -266,7 +266,7 @@ class DefaultPartHttpMessageReaderTests {
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(part -> {
|
||||
assertThat(part.headers()).containsEntry("Føø", Collections.singletonList("Bår"));
|
||||
assertThat(part.headers().hasHeaderValues("Føø", Collections.singletonList("Bår"))).isTrue();
|
||||
testPart(part, null, "This is plain ASCII text.", latch);
|
||||
})
|
||||
.verifyComplete();
|
||||
|
||||
@@ -175,7 +175,7 @@ class MultipartHttpMessageWriterTests extends AbstractLeakCheckingTests {
|
||||
part = requestParts.getFirst("filePublisher");
|
||||
assertThat(part).isNotNull();
|
||||
assertThat(part.name()).isEqualTo("filePublisher");
|
||||
assertThat(part.headers()).containsEntry("foo", Collections.singletonList("bar"));
|
||||
assertThat(part.headers().hasHeaderValues("foo", Collections.singletonList("bar"))).isTrue();
|
||||
assertThat(((FilePart) part).filename()).isEqualTo("file.txt");
|
||||
value = decodeToString(part);
|
||||
assertThat(value).isEqualTo("AaBbCc");
|
||||
|
||||
@@ -42,7 +42,6 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.Collections.emptyMap;
|
||||
import static java.util.Collections.singletonMap;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.entry;
|
||||
import static org.springframework.core.ResolvableType.forClass;
|
||||
|
||||
/**
|
||||
@@ -72,7 +71,7 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = this.reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result)
|
||||
.assertNext(form(headers -> assertThat(headers).isEmpty(), "This is implicitly typed plain ASCII text.\r\nIt does NOT end with a linebreak."))
|
||||
.assertNext(form(headers -> assertThat(headers.isEmpty()).isTrue(), "This is implicitly typed plain ASCII text.\r\nIt does NOT end with a linebreak."))
|
||||
.assertNext(form(headers -> assertThat(headers.getContentType()).isEqualTo(TEXT_PLAIN_ASCII),
|
||||
"This is explicitly typed plain ASCII text.\r\nIt DOES end with a linebreak.\r\n"))
|
||||
.verifyComplete();
|
||||
@@ -85,7 +84,7 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = this.reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result)
|
||||
.assertNext(data(headers -> assertThat(headers).isEmpty(), bodyText("a"), true))
|
||||
.assertNext(data(headers -> assertThat(headers.isEmpty()).isTrue(), bodyText("a"), true))
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@@ -143,8 +142,8 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = this.reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result)
|
||||
.assertNext(form(headers -> assertThat(headers).contains(entry("Part", List.of("1"))), ""))
|
||||
.assertNext(data(headers -> assertThat(headers).contains(entry("Part", List.of("2"))), bodyText("a"), true))
|
||||
.assertNext(form(headers -> assertThat(headers.hasHeaderValues("Part", List.of("1"))).isTrue(), ""))
|
||||
.assertNext(data(headers -> assertThat(headers.hasHeaderValues("Part", List.of("2"))).isTrue(), bodyText("a"), true))
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@@ -156,7 +155,7 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = this.reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result, 3)
|
||||
.assertNext(form(headers -> assertThat(headers).isEmpty(),
|
||||
.assertNext(form(headers -> assertThat(headers.isEmpty()).isTrue(),
|
||||
"This is implicitly typed plain ASCII text.\r\nIt does NOT end with a linebreak."))
|
||||
.thenCancel()
|
||||
.verify();
|
||||
@@ -238,7 +237,7 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result)
|
||||
.assertNext(form(headers -> assertThat(headers).isEmpty(), "This is implicitly typed plain ASCII text.\r\nIt does NOT end with a linebreak."))
|
||||
.assertNext(form(headers -> assertThat(headers.isEmpty()).isTrue(), "This is implicitly typed plain ASCII text.\r\nIt does NOT end with a linebreak."))
|
||||
.expectError(DecodingException.class)
|
||||
.verify();
|
||||
}
|
||||
@@ -283,7 +282,7 @@ class PartEventHttpMessageReaderTests {
|
||||
Flux<PartEvent> result = this.reader.read(forClass(PartEvent.class), request, emptyMap());
|
||||
|
||||
StepVerifier.create(result)
|
||||
.assertNext(data(headers -> assertThat(headers).containsEntry("Føø", List.of("Bår")),
|
||||
.assertNext(data(headers -> assertThat(headers.hasHeaderValues("Føø", List.of("Bår"))).isTrue(),
|
||||
bodyText("This is plain ASCII text."), true))
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ class ServletServerHttpRequestTests {
|
||||
|
||||
HttpHeaders headers = request.getHeaders();
|
||||
assertThat(headers).as("No HttpHeaders returned").isNotNull();
|
||||
assertThat(headers.containsKey(headerName)).as("Invalid headers returned").isTrue();
|
||||
assertThat(headers.containsHeader(headerName)).as("Invalid headers returned").isTrue();
|
||||
List<String> headerValues = headers.get(headerName);
|
||||
assertThat(headerValues).as("No header values returned").isNotNull();
|
||||
assertThat(headerValues.size()).as("Invalid header values returned").isEqualTo(2);
|
||||
@@ -150,7 +150,7 @@ class ServletServerHttpRequestTests {
|
||||
|
||||
HttpHeaders headers = request.getHeaders();
|
||||
assertThat(headers).as("No HttpHeaders returned").isNotNull();
|
||||
assertThat(headers.containsKey(headerName)).as("Invalid headers returned").isTrue();
|
||||
assertThat(headers.containsHeader(headerName)).as("Invalid headers returned").isTrue();
|
||||
List<String> headerValues = headers.get(headerName);
|
||||
assertThat(headerValues.size()).as("Invalid header values returned").isEqualTo(2);
|
||||
assertThat(headerValues.contains(headerValue1)).as("Invalid header values returned").isTrue();
|
||||
@@ -162,7 +162,7 @@ class ServletServerHttpRequestTests {
|
||||
void getHeadersWithWildcardContentType() {
|
||||
mockRequest.setContentType("*/*");
|
||||
mockRequest.removeHeader("Content-Type");
|
||||
assertThat(request.getHeaders()).as("Invalid content-type should not raise exception").isEmpty();
|
||||
assertThat(request.getHeaders().isEmpty()).as("Invalid content-type should not raise exception").isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -99,7 +99,7 @@ class ServletServerHttpResponseTests {
|
||||
|
||||
assertThat(this.response.getHeaders().getFirst(headerName)).isEqualTo(headerValue);
|
||||
assertThat(this.response.getHeaders().get(headerName)).containsExactly(headerValue);
|
||||
assertThat(this.response.getHeaders()).containsKey(headerName);
|
||||
assertThat(this.response.getHeaders().containsHeader(headerName)).isTrue();
|
||||
assertThat(this.response.getHeaders().getAccessControlAllowOrigin()).isEqualTo(headerValue);
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ class HeadersAdaptersTests {
|
||||
assertThat(headers2.get("TestHeader")).as("TestHeader")
|
||||
.containsExactly("first", "second", "third");
|
||||
// Using the headerSet approach, we keep the first encountered casing of any given key
|
||||
assertThat(headers2.keySet()).as("first casing variant").containsExactlyInAnyOrder("TestHeader", "SecondHeader");
|
||||
assertThat(headers2.headerNames()).as("first casing variant").containsExactlyInAnyOrder("TestHeader", "SecondHeader");
|
||||
assertThat(headers2.toString()).as("similar toString, no 'with native headers' dump")
|
||||
.isEqualTo(headers.toString().substring(0, headers.toString().indexOf(']') + 1));
|
||||
}
|
||||
@@ -132,7 +132,7 @@ class HeadersAdaptersTests {
|
||||
assertThat(headers2.get("TestHeader")).as("TestHeader")
|
||||
.containsExactly("first", "second", "third");
|
||||
// Ordering and casing are not guaranteed using the entrySet+put approach
|
||||
assertThat(headers2).as("two keys")
|
||||
assertThat(headers2.asMultiValueMap()).as("two keys")
|
||||
.containsKey("testheader")
|
||||
.containsKey("secondheader")
|
||||
.hasSize(2);
|
||||
@@ -148,7 +148,10 @@ class HeadersAdaptersTests {
|
||||
assertThat(headers2.get("TestHeader")).as("TestHeader")
|
||||
.containsExactly("first", "second", "third");
|
||||
// Ordering and casing are not guaranteed using the putAll approach
|
||||
assertThat(headers2).as("two keys").containsOnlyKeys("testheader", "secondheader");
|
||||
assertThat(headers2.asMultiValueMap()).as("two keys")
|
||||
.containsKey("testheader")
|
||||
.containsKey("secondheader")
|
||||
.hasSize(2);
|
||||
assertThat(headers2.toString()).as("similar toString, no 'with native headers' dump")
|
||||
.isEqualToIgnoringCase(headers.toString().substring(0, headers.toString().indexOf(']') + 1));
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ class ServerHttpResponseTests {
|
||||
assertThat(response.statusCodeWritten).isFalse();
|
||||
assertThat(response.headersWritten).isFalse();
|
||||
assertThat(response.cookiesWritten).isFalse();
|
||||
assertThat(headers).doesNotContainKeys(HttpHeaders.CONTENT_TYPE, HttpHeaders.CONTENT_LENGTH,
|
||||
assertThat(headers.headerNames()).doesNotContain(HttpHeaders.CONTENT_TYPE, HttpHeaders.CONTENT_LENGTH,
|
||||
HttpHeaders.CONTENT_ENCODING);
|
||||
assertThat(response.body).isEmpty();
|
||||
}
|
||||
@@ -178,7 +178,7 @@ class ServerHttpResponseTests {
|
||||
assertThat(response.headersWritten).isFalse();
|
||||
assertThat(response.cookiesWritten).isFalse();
|
||||
assertThat(response.isCommitted()).isFalse();
|
||||
assertThat(response.getHeaders()).isEmpty();
|
||||
assertThat(response.getHeaders().isEmpty()).isTrue();
|
||||
|
||||
// Handle the error
|
||||
response.setStatusCode(HttpStatus.SERVICE_UNAVAILABLE);
|
||||
|
||||
@@ -104,7 +104,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Could not parse Content-Type.");
|
||||
assertDetailMessageCode(ex, "parseError", null);
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -117,7 +117,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Acceptable representations: [application/json, application/cbor].");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getSupportedMediaTypes()});
|
||||
|
||||
assertThat(ex.getHeaders()).hasSize(1);
|
||||
assertThat(ex.getHeaders().size()).isOne();
|
||||
assertThat(ex.getHeaders().getAccept()).isEqualTo(mediaTypes);
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Could not parse Accept header.");
|
||||
assertDetailMessageCode(ex, "parseError", null);
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -143,7 +143,7 @@ class ErrorResponseExceptionTests {
|
||||
assertStatus(ex, HttpStatus.SERVICE_UNAVAILABLE);
|
||||
assertDetail(ex, null);
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -156,7 +156,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Method 'PUT' is not supported.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getMethod(), ex.getSupportedHttpMethods()});
|
||||
|
||||
assertThat(ex.getHeaders()).hasSize(1);
|
||||
assertThat(ex.getHeaders().size()).isOne();
|
||||
assertThat(ex.getHeaders().getAllow()).containsExactly(HttpMethod.GET, HttpMethod.POST);
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required header 'Authorization' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getHeaderName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -181,7 +181,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required parameter 'query' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getParameterName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -194,7 +194,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required path parameter 'region' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getVariableName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -206,7 +206,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required path variable 'id' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getVariableName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -218,7 +218,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required cookie 'oreo' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getCookieName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -231,7 +231,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Invalid request parameters.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {List.of("\"foo=bar, bar=baz\"")});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -243,7 +243,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required part 'file' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getRequestPartName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -258,7 +258,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Invalid request content.");
|
||||
testHelper.assertMessages(ex, ex.getAllErrors());
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -306,7 +306,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Could not parse Content-Type.");
|
||||
assertDetailMessageCode(ex, "parseError", null);
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -319,7 +319,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Acceptable representations: [application/json, application/cbor].");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getSupportedMediaTypes()});
|
||||
|
||||
assertThat(ex.getHeaders()).hasSize(1);
|
||||
assertThat(ex.getHeaders().size()).isOne();
|
||||
assertThat(ex.getHeaders().getAccept()).isEqualTo(mediaTypes);
|
||||
}
|
||||
|
||||
@@ -333,7 +333,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Could not parse Accept header.");
|
||||
assertDetailMessageCode(ex, "parseError", null);
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -345,7 +345,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Failure");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getReason()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -358,7 +358,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Required header 'foo' is not present.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getLabel(), ex.getName()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -373,7 +373,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Invalid request parameters.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getConditions()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -388,7 +388,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Invalid request content.");
|
||||
testHelper.assertMessages(ex, ex.getAllErrors());
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -401,7 +401,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Supported methods: [GET, POST]");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getHttpMethod(), supportedMethods});
|
||||
|
||||
assertThat(ex.getHeaders()).hasSize(1);
|
||||
assertThat(ex.getHeaders().size()).isOne();
|
||||
assertThat(ex.getHeaders().getAllow()).containsExactly(HttpMethod.GET, HttpMethod.POST);
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ class ErrorResponseExceptionTests {
|
||||
assertDetail(ex, "Request method 'PUT' is not supported.");
|
||||
assertDetailMessageCode(ex, null, new Object[] {ex.getHttpMethod(), Collections.emptyList()});
|
||||
|
||||
assertThat(ex.getHeaders()).isEmpty();
|
||||
assertThat(ex.getHeaders().isEmpty()).isTrue();
|
||||
}
|
||||
|
||||
@Test // gh-30300
|
||||
|
||||
@@ -36,7 +36,7 @@ class ErrorResponseTests {
|
||||
void createWithHttpHeader() {
|
||||
ErrorResponse response = ErrorResponse.builder(new IllegalStateException(), HttpStatus.BAD_REQUEST, "test")
|
||||
.header("header", "value").build();
|
||||
assertThat(response.getHeaders()).containsOnly(entry("header", List.of("value")));
|
||||
assertThat(response.getHeaders().asMultiValueMap()).containsOnly(entry("header", List.of("value")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -47,7 +47,7 @@ class ErrorResponseTests {
|
||||
headers.add("header", "value2");
|
||||
headers.add("another", "value3");
|
||||
}).build();
|
||||
assertThat(response.getHeaders()).containsOnly(entry("header", List.of("value", "value2")),
|
||||
assertThat(response.getHeaders().asMultiValueMap()).containsOnly(entry("header", List.of("value", "value2")),
|
||||
entry("another", List.of("value3")));
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ class RestClientResponseExceptionTests {
|
||||
|
||||
HttpHeaders responseHeaders = ex.getResponseHeaders();
|
||||
assertThat(responseHeaders).isNotNull();
|
||||
assertThat(responseHeaders).hasSize(1);
|
||||
assertThat(responseHeaders.size()).isOne();
|
||||
assertThat(responseHeaders.getFirst("FOO")).isEqualTo("bar");
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
@@ -81,7 +81,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
@@ -93,7 +93,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
@@ -105,7 +105,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(null, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
}
|
||||
|
||||
@@ -116,10 +116,10 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("*");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_MAX_AGE)).isFalse();
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
@@ -135,9 +135,9 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isEqualTo("true");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
@@ -156,9 +156,9 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isEqualTo("true");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
@@ -173,7 +173,7 @@ class DefaultCorsProcessorTests {
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
}
|
||||
|
||||
@Test // gh-26892
|
||||
@@ -187,7 +187,7 @@ class DefaultCorsProcessorTests {
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
}
|
||||
|
||||
@Test // gh-33682
|
||||
@@ -202,7 +202,7 @@ class DefaultCorsProcessorTests {
|
||||
|
||||
assertThat(result).isFalse();
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -214,9 +214,9 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).contains("header1");
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS)).contains("header2");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
@@ -271,7 +271,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
@@ -284,7 +284,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
@@ -299,7 +299,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
@@ -320,11 +320,11 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("*");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)).isEqualTo("GET,PUT");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_MAX_AGE)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
@@ -345,9 +345,9 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().containsKey(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)).isEqualTo("true");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
@@ -372,7 +372,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
@@ -398,8 +398,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_ORIGIN)).isEqualTo("https://domain2.com");
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
@@ -420,8 +420,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).contains("Header1");
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).contains("Header2");
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).doesNotContain("Header3");
|
||||
@@ -442,8 +442,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_HEADERS)).isTrue();
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).contains("Header1");
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).contains("Header2");
|
||||
assertThat(response.getHeaders().getFirst(ACCESS_CONTROL_ALLOW_HEADERS)).doesNotContain("*");
|
||||
@@ -464,8 +464,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_HEADERS)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_HEADERS)).isFalse();
|
||||
assertThat(response.getHeaders().get(VARY)).contains(ORIGIN,
|
||||
ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
@@ -479,7 +479,7 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(null, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isFalse();
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
@@ -513,8 +513,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isFalse();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
}
|
||||
|
||||
@@ -530,8 +530,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isFalse();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isFalse();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
}
|
||||
|
||||
@@ -548,8 +548,8 @@ class DefaultCorsProcessorTests {
|
||||
this.processor.process(this.conf, exchange);
|
||||
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
assertThat(response.getHeaders().containsKey(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsKey(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(ACCESS_CONTROL_ALLOW_ORIGIN)).isTrue();
|
||||
assertThat(response.getHeaders().containsHeader(DefaultCorsProcessor.ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)).isTrue();
|
||||
assertThat(response.getStatusCode()).isNull();
|
||||
}
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ class ForwardedHeaderTransformerTests {
|
||||
|
||||
private void assertForwardedHeadersRemoved(ServerHttpRequest request) {
|
||||
ForwardedHeaderTransformer.FORWARDED_HEADER_NAMES
|
||||
.forEach(name -> assertThat(request.getHeaders().containsKey(name)).isFalse());
|
||||
.forEach(name -> assertThat(request.getHeaders().containsHeader(name)).isFalse());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user