From e0ef2928964bcaffbf2301e25f0ebbc19d9797e6 Mon Sep 17 00:00:00 2001 From: Yannick Reifschneider Date: Wed, 10 Jul 2024 11:33:50 +0200 Subject: [PATCH 1/2] Allows adding literal header values to RequestTemplate This change adds a new method RequestTemplate#headerLiteral which allows adding headers which are not interpreted as Template expressions. This allows adding empty JSON objects to headers in RequestInterceptor implementations. Fixes #2252, #1987 --- core/src/main/java/feign/RequestTemplate.java | 30 +++++++++++++++++++ .../test/java/feign/RequestTemplateTest.java | 20 +++++++++++++ 2 files changed, 50 insertions(+) diff --git a/core/src/main/java/feign/RequestTemplate.java b/core/src/main/java/feign/RequestTemplate.java index 7309cdfa1..8157e3887 100644 --- a/core/src/main/java/feign/RequestTemplate.java +++ b/core/src/main/java/feign/RequestTemplate.java @@ -728,6 +728,36 @@ public RequestTemplate header(String name, Iterable values) { return appendHeader(name, values); } + /** + * @see RequestTemplate#headerLiteral(String, Iterable) + */ + public RequestTemplate headerLiteral(String name, String... values) { + if (values == null) { + return appendHeader(name, Collections.emptyList(), true); + } + + return headerLiteral(name, Arrays.asList(values)); + } + + /** + * Specify a Header, with the specified values. Values are treated as literals. Template + * expressions are not resolved. + * + * @param name of the header. + * @param values for this header. + * @return a RequestTemplate for chaining. + */ + public RequestTemplate headerLiteral(String name, Iterable values) { + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("name is required."); + } + if (values == null) { + values = Collections.emptyList(); + } + + return appendHeader(name, values, true); + } + /** * Clear on reader from {@link RequestTemplate} * diff --git a/core/src/test/java/feign/RequestTemplateTest.java b/core/src/test/java/feign/RequestTemplateTest.java index c8d29a4b2..4c40b6ad0 100644 --- a/core/src/test/java/feign/RequestTemplateTest.java +++ b/core/src/test/java/feign/RequestTemplateTest.java @@ -246,6 +246,26 @@ void resolveTemplateWithHeaderEmptyResult() { assertThat(template).hasNoHeader("Encoded"); } + @Test + void templateWithEmptyJsonObjectLiteralHeader() { + String emptyJsonObject = "{}"; + RequestTemplate template = + new RequestTemplate().method(HttpMethod.GET).headerLiteral("A-Header", emptyJsonObject); + + template.resolve(new LinkedHashMap<>()); + assertThat(template).hasHeaders(entry("A-Header", Collections.singletonList(emptyJsonObject))); + } + + @Test + void templateWithTemplateExpressionLiteralHeader() { + String header = "{var}"; + RequestTemplate template = + new RequestTemplate().method(HttpMethod.GET).headerLiteral("A-Header", header); + + template = template.resolve(mapOf("var", "value")); + assertThat(template).hasHeaders(entry("A-Header", Collections.singletonList(header))); + } + @Test void resolveTemplateWithMixedRequestLineParams() { RequestTemplate template = new RequestTemplate().method(HttpMethod.GET)// From faac0804f1c6c36c4e8c46a4bedbce4d8fa107c1 Mon Sep 17 00:00:00 2001 From: Marvin Date: Wed, 10 Jul 2024 08:17:23 -0300 Subject: [PATCH 2/2] Update RequestTemplate.java --- core/src/main/java/feign/RequestTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/feign/RequestTemplate.java b/core/src/main/java/feign/RequestTemplate.java index 8157e3887..f5c5022a9 100644 --- a/core/src/main/java/feign/RequestTemplate.java +++ b/core/src/main/java/feign/RequestTemplate.java @@ -733,7 +733,7 @@ public RequestTemplate header(String name, Iterable values) { */ public RequestTemplate headerLiteral(String name, String... values) { if (values == null) { - return appendHeader(name, Collections.emptyList(), true); + return headerLiteral(name, Collections.emptyList()); } return headerLiteral(name, Arrays.asList(values));