diff --git a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java index 39dbd08d4d2..da932206c85 100644 --- a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -273,22 +273,21 @@ public class ServletServerHttpRequest implements ServerHttpRequest { Writer writer = new OutputStreamWriter(bos, FORM_CHARSET); Map form = request.getParameterMap(); - for (Iterator> entryIterator = form.entrySet().iterator(); entryIterator.hasNext();) { - Map.Entry entry = entryIterator.next(); - String name = entry.getKey(); + for (Iterator> entryItr = form.entrySet().iterator(); entryItr.hasNext();) { + Map.Entry entry = entryItr.next(); List values = Arrays.asList(entry.getValue()); - for (Iterator valueIterator = values.iterator(); valueIterator.hasNext();) { - String value = valueIterator.next(); - writer.write(URLEncoder.encode(name, FORM_CHARSET)); + for (Iterator valueItr = values.iterator(); valueItr.hasNext();) { + String value = valueItr.next(); + writer.write(URLEncoder.encode(entry.getKey(), FORM_CHARSET)); if (value != null) { writer.write('='); writer.write(URLEncoder.encode(value, FORM_CHARSET)); - if (valueIterator.hasNext()) { + if (valueItr.hasNext()) { writer.write('&'); } } } - if (entryIterator.hasNext()) { + if (entryItr.hasNext()) { writer.append('&'); } } diff --git a/spring-web/src/test/java/org/springframework/http/server/ServletServerHttpRequestTests.java b/spring-web/src/test/java/org/springframework/http/server/ServletServerHttpRequestTests.java index 6dad7e7ab2e..55fd33e08eb 100644 --- a/spring-web/src/test/java/org/springframework/http/server/ServletServerHttpRequestTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/ServletServerHttpRequestTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -182,9 +182,7 @@ class ServletServerHttpRequestTests { mockRequest.addParameter("name 2", "value 2+1", "value 2+2"); mockRequest.addParameter("name 3", (String) null); - byte[] result = FileCopyUtils.copyToByteArray(request.getBody()); - byte[] content = "name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3".getBytes(StandardCharsets.UTF_8); - assertThat(result).as("Invalid content returned").isEqualTo(content); + assertFormContent("name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3"); } @Test @@ -192,9 +190,7 @@ class ServletServerHttpRequestTests { mockRequest.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); mockRequest.setMethod("POST"); - byte[] result = FileCopyUtils.copyToByteArray(request.getBody()); - byte[] content = "".getBytes(StandardCharsets.UTF_8); - assertThat(result).as("Invalid content returned").isEqualTo(content); + assertFormContent(""); } @Test // gh-31327 @@ -206,9 +202,7 @@ class ServletServerHttpRequestTests { mockRequest.setContent("foo=bar".getBytes(StandardCharsets.UTF_8)); mockRequest.addHeader("Content-Length", 7); - byte[] result = FileCopyUtils.copyToByteArray(request.getBody()); - byte[] content = "foo=bar".getBytes(StandardCharsets.UTF_8); - assertThat(result).as("Invalid content returned").isEqualTo(content); + assertFormContent("foo=bar"); } @Test // gh-32471 @@ -219,9 +213,15 @@ class ServletServerHttpRequestTests { mockRequest.addParameter("lastName", "Test@er"); mockRequest.addHeader("Content-Length", 26); + int contentLength = assertFormContent("name=Test&lastName=Test%40er"); + assertThat(request.getHeaders().getContentLength()).isEqualTo(contentLength); + } + + private int assertFormContent(String expected) throws IOException { byte[] result = FileCopyUtils.copyToByteArray(request.getBody()); - assertThat(result).isEqualTo("name=Test&lastName=Test%40er".getBytes(StandardCharsets.UTF_8)); - assertThat(request.getHeaders().getContentLength()).isEqualTo(result.length); + byte[] content = expected.getBytes(StandardCharsets.UTF_8); + assertThat(result).as("Invalid content returned").isEqualTo(content); + return result.length; } @Test