diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/cli/CurlRequestSnippet.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/cli/CurlRequestSnippet.java index b7e1387cb..408378bc3 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/cli/CurlRequestSnippet.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/cli/CurlRequestSnippet.java @@ -13,6 +13,7 @@ import org.jspecify.annotations.Nullable; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.restdocs.operation.Operation; import org.springframework.restdocs.operation.OperationRequest; @@ -76,7 +77,7 @@ private String getUrl(Operation operation) { private String getOptions(Operation operation) { StringBuilder builder = new StringBuilder(); - writeIncludeHeadersInOutputOption(builder); + writeIncludeHeadersInOutputOption(operation.getRequest(), builder); CliOperationRequest request = new CliOperationRequest(operation.getRequest()); writeUserOptionIfNecessary(request, builder); @@ -106,8 +107,8 @@ private void writeCookies(CliOperationRequest request, List lines) { } } - private void writeIncludeHeadersInOutputOption(StringBuilder builder) { - builder.append("-i"); + private void writeIncludeHeadersInOutputOption(OperationRequest request, StringBuilder builder) { + builder.append(isHeadRequest(request) ? "-I" : "-i"); } private void writeUserOptionIfNecessary(CliOperationRequest request, StringBuilder builder) { @@ -118,7 +119,13 @@ private void writeUserOptionIfNecessary(CliOperationRequest request, StringBuild } private void writeHttpMethod(OperationRequest request, StringBuilder builder) { - builder.append(String.format(" -X %s", request.getMethod())); + if (!isHeadRequest(request)) { + builder.append(String.format(" -X %s", request.getMethod())); + } + } + + private boolean isHeadRequest(OperationRequest request) { + return HttpMethod.HEAD.equals(request.getMethod()); } private void writeHeaders(CliOperationRequest request, List lines) { diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/cli/CurlRequestSnippetTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/cli/CurlRequestSnippetTests.java index 003a749f4..e13ace23e 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/cli/CurlRequestSnippetTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/cli/CurlRequestSnippetTests.java @@ -45,6 +45,26 @@ void nonGetRequest(OperationBuilder operationBuilder, AssertableSnippets snippet (codeBlock) -> codeBlock.withLanguage("bash").content("$ curl 'http://localhost/foo' -i -X POST")); } + @RenderedSnippetTest + void headRequest(OperationBuilder operationBuilder, AssertableSnippets snippets) throws IOException { + new CurlRequestSnippet(this.commandFormatter) + .document(operationBuilder.request("http://localhost/foo").method("HEAD").build()); + assertThat(snippets.curlRequest()) + .isCodeBlock((codeBlock) -> codeBlock.withLanguage("bash").content("$ curl 'http://localhost/foo' -I")); + } + + @RenderedSnippetTest + void headRequestWithHeadersAndBasicAuth(OperationBuilder operationBuilder, AssertableSnippets snippets) + throws IOException { + new CurlRequestSnippet(this.commandFormatter).document(operationBuilder.request("http://localhost/foo") + .method("HEAD") + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString("user:secret".getBytes())) + .build()); + assertThat(snippets.curlRequest()).isCodeBlock((codeBlock) -> codeBlock.withLanguage("bash") + .content("$ curl 'http://localhost/foo' -I -u 'user:secret' -H 'Accept: application/json'")); + } + @RenderedSnippetTest void requestWithContent(OperationBuilder operationBuilder, AssertableSnippets snippets) throws IOException { new CurlRequestSnippet(this.commandFormatter)