In Spring Boot Web, starting from version 3.2.0, there is an issue where the request body is truncated if it contains characters that need to be escaped, such as ":" or "=".
Steps to reproduce:
1. Create a basic Spring Boot Web app with version 3.2.0 or greater.
2. Create a sample controller with the following code:
```kotlin
@PostMapping("/test")
fun testRequest(@RequestBody requestAsString: String) {
requestAsString.split("&").forEach { println(it) }
}
```
3. Invoke the controller with parameters, including one with a special character, using the following `curl` command:
```shell
curl -X POST \
'http://localhost:8080/test' \
-d 'A=0:1' \
-d 'B=123'
```
**Actual output (>=3.2.0):**
A=0%3A1 B=1
**Expected output (=3.1.10):**
A=0%3A1 B=123
**Comment From: bclozel**
I don't think this is strictly a Spring issue. As of Spring Framework 6.1, [we only read the amount of bytes that are declared in the Content-Length header of the request](https://github.com/spring-projects/spring-framework/pull/30942).
Using [httpie](https://httpie.io/) and Spring Boot 3.2.x, I'm getting the correct result:
http -vvv --form POST localhost:8080/test A='0:1' B='123' POST /test HTTP/1.1 Accept: / Accept-Encoding: gzip, deflate Connection: keep-alive Content-Length: 13 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: localhost:8080 User-Agent: HTTPie/3.2.2
A=0%3A1&B=123
HTTP/1.1 200 Connection: keep-alive Content-Length: 0 Date: Mon, 25 Mar 2024 18:17:16 GMT Keep-Alive: timeout=60
Note, the "Content-Length" header shows "13".
With the curl command listed above, the content is URL encoded but somehow the Content-Length is only 10.
curl -vv -X POST 'http://localhost:8080/test' -d 'A=0:1' -d 'B=123' Note: Unnecessary use of -X or --request, POST is already inferred. * Trying [::1]:8080... * Connected to localhost (::1) port 8080
POST /test HTTP/1.1 Host: localhost:8080 User-Agent: curl/8.4.0 Accept: / Content-Length: 11 Content-Type: application/x-www-form-urlencoded
< HTTP/1.1 200 < Content-Length: 0 < Date: Mon, 25 Mar 2024 18:22:18 GMT < * Connection #0 to host localhost left intact
I'm not a curl expert, so I don't know if this is a bug or the expected behavior. I do know though that using the `--data-urlencode` option fixes things:
curl -X POST 'http://localhost:8080/test' --data-urlencode 'A=0:1' -d 'B=123' ```
I'm closing this issue as a result, as there's nothing we can do from our side since the request is invalid in the first place when the problem happens.
Thanks for your report!