From d4d83f293aea33d4a46d8578d466586414741ab2 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 10 Jan 2022 14:31:03 +0000 Subject: [PATCH] Fix HTTP request snippet's handling of query strings and params Closes gh-763 --- .../springframework/restdocs/http/HttpRequestSnippet.java | 5 +++-- .../restdocs/http/HttpRequestSnippetTests.java | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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 8f57ae5a..59d75af1 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 @@ -134,7 +134,7 @@ public class HttpRequestSnippet extends TemplatedSnippet { } else if (isPutOrPost(request)) { if (request.getParts().isEmpty()) { - String queryString = request.getParameters().toQueryString(); + String queryString = request.getParameters().getUniqueParameters(request.getUri()).toQueryString(); if (StringUtils.hasText(queryString)) { writer.println(); writer.print(queryString); @@ -206,7 +206,8 @@ public class HttpRequestSnippet extends TemplatedSnippet { private boolean requiresFormEncodingContentTypeHeader(OperationRequest request) { return request.getHeaders().get(HttpHeaders.CONTENT_TYPE) == null && isPutOrPost(request) - && (!request.getParameters().isEmpty() && !includeParametersInUri(request)); + && !request.getParameters().getUniqueParameters(request.getUri()).isEmpty() + && !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 cffc0eb9..4bdb908d 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 @@ -224,6 +224,14 @@ public class HttpRequestSnippetTests extends AbstractSnippetTests { .header("Content-Type", "application/x-www-form-urlencoded").content("b%26r=baz&a=alpha")); } + @Test + public void putRequestWithTotallyOverlappingQueryStringAndParameters() throws IOException { + new HttpRequestSnippet().document(this.operationBuilder.request("http://localhost/foo?a=alpha&b=bravo") + .method("PUT").param("a", "alpha").param("b", "bravo").build()); + assertThat(this.generatedSnippets.httpRequest()) + .is(httpRequest(RequestMethod.PUT, "/foo?a=alpha&b=bravo").header(HttpHeaders.HOST, "localhost")); + } + @Test public void multipartPost() throws IOException { new HttpRequestSnippet().document(this.operationBuilder.request("http://localhost/upload").method("POST")