From c8f05b6b6ef7ea307d4d836a8fd2cd1a9e5b8e01 Mon Sep 17 00:00:00 2001 From: chuuminggg Date: Sat, 7 Nov 2026 04:22:32 +0900 Subject: [PATCH] Allow values of a header that was set to be added or removed Previously, modifyHeaders() put the fixed-size list of values passed to set into the headers. A later modification that added a value to or removed a value from the same header then failed with an UnsupportedOperationException. A copy of the values is now used. Signed-off-by: chuuminggg --- .../HeadersModifyingOperationPreprocessor.java | 2 +- ...ersModifyingOperationPreprocessorTests.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessor.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessor.java index ef7323525..bdc91f3f9 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessor.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessor.java @@ -144,7 +144,7 @@ private SetHeaderModification(String name, List values) { @Override public void applyTo(HttpHeaders headers) { - headers.put(this.name, this.values); + headers.put(this.name, new ArrayList<>(this.values)); } } diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessorTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessorTests.java index 0beaa23c7..504e51670 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessorTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/operation/preprocess/HeadersModifyingOperationPreprocessorTests.java @@ -73,6 +73,24 @@ void setExistingHeader() { .headerSet()).contains(entry("a", Arrays.asList("alpha", "avocado"))); } + @Test + void addValueToHeaderThatWasSet() { + this.preprocessor.set("a", "alpha").add("a", "avocado"); + assertThat(this.preprocessor.preprocess(createRequest()).getHeaders().headerSet()) + .contains(entry("a", Arrays.asList("alpha", "avocado"))); + assertThat(this.preprocessor.preprocess(createResponse()).getHeaders().headerSet()) + .contains(entry("a", Arrays.asList("alpha", "avocado"))); + } + + @Test + void removeValueFromHeaderThatWasSet() { + this.preprocessor.set("a", "alpha", "avocado").remove("a", "alpha"); + assertThat(this.preprocessor.preprocess(createRequest()).getHeaders().headerSet()) + .contains(entry("a", Arrays.asList("avocado"))); + assertThat(this.preprocessor.preprocess(createResponse()).getHeaders().headerSet()) + .contains(entry("a", Arrays.asList("avocado"))); + } + @Test void removeNonExistentHeader() { this.preprocessor.remove("a");