From ec21a0e2dfad2c7ebee950478ce18dffedaa8347 Mon Sep 17 00:00:00 2001 From: banseok1216 Date: Mon, 1 Dec 2025 16:09:18 +0900 Subject: [PATCH] Fix incorrect Content-Type inference for POST/PUT/PATCH requests without body Signed-off-by: banseok1216 --- .../restdocs/http/HttpRequestSnippet.java | 2 +- .../restdocs/http/HttpRequestSnippetTests.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpRequestSnippet.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpRequestSnippet.java index 4639a1a9..bddc6950 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpRequestSnippet.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpRequestSnippet.java @@ -178,7 +178,7 @@ private void writeMultipartEnd(PrintWriter writer) { private boolean requiresFormEncodingContentTypeHeader(OperationRequest request) { return request.getHeaders().get(HttpHeaders.CONTENT_TYPE) == null && isPutPostOrPatch(request) - && !includeParametersInUri(request); + && request.getContent().length > 0 && !includeParametersInUri(request); } private Map header(String name, String value) { diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpRequestSnippetTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpRequestSnippetTests.java index 203084d3..6ba8f128 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpRequestSnippetTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpRequestSnippetTests.java @@ -244,6 +244,22 @@ void deleteWithQueryString(OperationBuilder operationBuilder, AssertableSnippets .isHttpRequest((request) -> request.delete("/foo?a=alpha&b=bravo").header("Host", "localhost")); } + @RenderedSnippetTest + void postFormUrlEncodedRequestIsDocumentedWhenContentTypeIsExplicit(OperationBuilder operationBuilder, + AssertableSnippets snippets) throws IOException { + String body = "a=alpha&b=bravo"; + new HttpRequestSnippet().document(operationBuilder.request("http://localhost/foo") + .method("POST") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE) + .content(body) + .build()); + assertThat(snippets.httpRequest()).isHttpRequest((request) -> request.post("/foo") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE) + .header(HttpHeaders.HOST, "localhost") + .header(HttpHeaders.CONTENT_LENGTH, body.getBytes().length) + .content(body)); + } + private String createPart(String content) { return this.createPart(content, true); }