Thank you for your reply. I created a repository that demonstrates the issue.

https://github.com/tzahifadida/test-chunked

Currently it is set to 10.1.25 and fails. If you change it to 10.1.19
(in the pom.xml <tomcat.version>10.1.19</tomcat.version>) it will
succeed. It should show 5 postings and not 1 in the output. The test
can be run with “mvn test”.
The output of the tcpdump is the same for both.

The success dump and output (you can see the deltas are greater than 0
indicating they were received one by one):

2024-08-13T11:39:29.873+03:00  INFO 9753 --- [       Thread-1]
o.s.boot.SpringApplication               : No active profile set,
falling back to 1 default profile: "default"
2024-08-13T11:39:30.344+03:00  INFO 9753 --- [       Thread-1]
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with
port(s): 8080 (http)
2024-08-13T11:39:30.350+03:00  INFO 9753 --- [       Thread-1]
o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-13T11:39:30.350+03:00  INFO 9753 --- [       Thread-1]
o.apache.catalina.core.StandardEngine    : Starting Servlet engine:
[Apache Tomcat/10.1.19]
2024-08-13T11:39:30.397+03:00  INFO 9753 --- [       Thread-1]
o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
embedded WebApplicationContext
2024-08-13T11:39:30.398+03:00  INFO 9753 --- [       Thread-1]
w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext:
initialization completed in 499 ms
2024-08-13T11:39:30.582+03:00  INFO 9753 --- [       Thread-1]
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s):
8080 (http) with context path ''
2024-08-13T11:39:30.586+03:00  INFO 9753 --- [       Thread-1]
o.s.boot.SpringApplication               : Started application in
0.944 seconds (process running for 1.334)
2024-08-13T11:39:34.693+03:00  INFO 9753 --- [nio-8080-exec-1]
o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
DispatcherServlet 'dispatcherServlet'
2024-08-13T11:39:34.693+03:00  INFO 9753 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet        : Initializing Servlet
'dispatcherServlet'
2024-08-13T11:39:34.694+03:00  INFO 9753 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet        : Completed initialization in
1 ms
2024-08-13T11:39:34.708+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : EndPoint Controller /post
2024-08-13T11:39:35.630+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 0 , delta: 922, counter: 1
2024-08-13T11:39:36.633+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 1 , delta: 1001, counter: 2
2024-08-13T11:39:37.637+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 2 , delta: 1003, counter: 3
2024-08-13T11:39:38.642+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 3 , delta: 1004, counter: 4
2024-08-13T11:39:39.646+03:00  INFO 9753 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 4 , delta: 1004, counter: 5

 11:39:34.653512 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 1784064028:1784064203, ack 571601977, win 6379, options
[nop,nop,TS val 3085463629 ecr 2661427862], length 175: HTTP: POST
/post HTTP/1.1
E.....@.@...............jV.."..9...........
..pM..*.POST /post HTTP/1.1
Content-Type: application/octet-stream
User-Agent: Java/22.0.2
Host: localhost:8080
Accept: */*
Connection: keep-alive
Transfer-Encoding: chunked


11:39:35.628844 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 175:194, ack 1, win 6379, options [nop,nop,TS val 3085464606 ecr
2661427863], length 19: HTTP
E..G..@.@...............jV.."..9.....;.....
..t...*.e
PostingData 0


11:39:36.633382 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 194:213, ack 1, win 6379, options [nop,nop,TS val 3085465610 ecr
2661428840], length 19: HTTP
E..G..@.@...............jV.."..9.....;.....
..x
...he
PostingData 1


11:39:37.637367 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 213:232, ack 1, win 6379, options [nop,nop,TS val 3085466614 ecr
2661429844], length 19: HTTP
E..G..@.@...............jV.."..9.....;.....
..{...2Te
PostingData 2


11:39:38.641831 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 232:251, ack 1, win 6379, options [nop,nop,TS val 3085467618 ecr
2661430848], length 19: HTTP
E..G..@.@...............jV.."..9.....;.....
......6@e
PostingData 3


11:39:39.645695 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 251:270, ack 1, win 6379, options [nop,nop,TS val 3085468623 ecr
2661431852], length 19: HTTP
E..G..@.@...............jV.."..9.....;.....
......:,e
PostingData 4


11:39:39.646338 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 270:273, ack 1, win 6379, options [nop,nop,TS val 3085468623 ecr
2661432857], length 3: HTTP
E..7..@.@...............jV.*"..9.....+.....
......>.0

11:39:39.646455 IP localhost.49328 > localhost.http-alt: Flags [P.],
seq 273:275, ack 1, win 6379, options [nop,nop,TS val 3085468623 ecr
2661432857], length 2: HTTP
E..6..@.@...............jV.-"..9.....*.....
......>.

11:39:39.686540 IP localhost.http-alt > localhost.49328: Flags [P.],
seq 1:163, ack 275, win 6375, options [nop,nop,TS val 2661432897 ecr
3085468623], length 162: HTTP: HTTP/1.1 200
E.....@.@..............."..9jV./...........
..>A....HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 1
Date: Tue, 13 Aug 2024 08:39:39 GMT
Keep-Alive: timeout=60
Connection: keep-alive



The FAILED dump and output (you will see that they all were received
at the same time since the delta is 0):


2024-08-13T11:43:03.323+03:00  INFO 10451 --- [       Thread-1]
o.s.boot.SpringApplication               : No active profile set,
falling back to 1 default profile: "default"
2024-08-13T11:43:03.792+03:00  INFO 10451 --- [       Thread-1]
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with
port(s): 8080 (http)
2024-08-13T11:43:03.798+03:00  INFO 10451 --- [       Thread-1]
o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-13T11:43:03.798+03:00  INFO 10451 --- [       Thread-1]
o.apache.catalina.core.StandardEngine    : Starting Servlet engine:
[Apache Tomcat/10.1.25]
2024-08-13T11:43:03.851+03:00  INFO 10451 --- [       Thread-1]
o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
embedded WebApplicationContext
2024-08-13T11:43:03.852+03:00  INFO 10451 --- [       Thread-1]
w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext:
initialization completed in 507 ms
2024-08-13T11:43:04.057+03:00  INFO 10451 --- [       Thread-1]
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s):
8080 (http) with context path ''
2024-08-13T11:43:04.063+03:00  INFO 10451 --- [       Thread-1]
o.s.boot.SpringApplication               : Started application in 1.0
seconds (process running for 1.399)
2024-08-13T11:43:08.101+03:00  INFO 10451 --- [nio-8080-exec-1]
o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
DispatcherServlet 'dispatcherServlet'
2024-08-13T11:43:08.101+03:00  INFO 10451 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet        : Initializing Servlet
'dispatcherServlet'
2024-08-13T11:43:08.102+03:00  INFO 10451 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet        : Completed initialization in
1 ms
2024-08-13T11:43:08.114+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : EndPoint Controller /post
2024-08-13T11:43:13.051+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 0 , delta: 4937, counter: 1
2024-08-13T11:43:13.053+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 1 , delta: 0, counter: 1
2024-08-13T11:43:13.054+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 2 , delta: 0, counter: 1
2024-08-13T11:43:13.054+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 3 , delta: 0, counter: 1
2024-08-13T11:43:13.054+03:00  INFO 10451 --- [nio-8080-exec-1]
com.example.chunked.ChunkedController    : Reading from POST stream:
PostingData 4 , delta: 0, counter: 1
2024-08-13T11:43:13.078+03:00  INFO 10451 --- [           main]
c.e.chunked.ChunkedApplicationTests      : Response: 1
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time
elapsed: 10.143 s <<< FAILURE! - in
com.example.chunked.ChunkedApplicationTests

11:43:08.062510 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 3965401847:3965402022, ack 2785484648, win 6379, options
[nop,nop,TS val 2988012988 ecr 1104779806], length 175: HTTP: POST
/post HTTP/1.1
E.....@.@................[:....h...........
..u.A...POST /post HTTP/1.1
Content-Type: application/octet-stream
User-Agent: Java/22.0.2
Host: localhost:8080
Accept: */*
Connection: keep-alive
Transfer-Encoding: chunked


11:43:09.034422 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 175:194, ack 1, win 6379, options [nop,nop,TS val 2988013961 ecr
1104779807], length 19: HTTP
E..G..@.@................[;....h.....;.....
..y.A...e
PostingData 0


11:43:10.037596 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 194:213, ack 1, win 6379, options [nop,nop,TS val 2988014964 ecr
1104780780], length 19: HTTP
E..G..@.@................[;....h.....;.....
..}tA...e
PostingData 1


11:43:11.042428 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 213:232, ack 1, win 6379, options [nop,nop,TS val 2988015969 ecr
1104781783], length 19: HTTP
E..G..@.@................[;....h.....;.....
...aA...e
PostingData 2


11:43:12.045420 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 232:251, ack 1, win 6379, options [nop,nop,TS val 2988016972 ecr
1104782788], length 19: HTTP
E..G..@.@................[;....h.....;.....
...LA...e
PostingData 3


11:43:13.049666 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 251:270, ack 1, win 6379, options [nop,nop,TS val 2988017976 ecr
1104783791], length 19: HTTP
E..G..@.@................[;....h.....;.....
...8A...e
PostingData 4


11:43:13.049780 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 270:273, ack 1, win 6379, options [nop,nop,TS val 2988017976 ecr
1104784795], length 3: HTTP
E..7..@.@................[<....h.....+.....
...8A...0

11:43:13.049838 IP localhost.49795 > localhost.http-alt: Flags [P.],
seq 273:275, ack 1, win 6379, options [nop,nop,TS val 2988017976 ecr
1104784795], length 2: HTTP
E..6..@.@................[<....h.....*.....
...8A...

11:43:13.076541 IP localhost.http-alt > localhost.49795: Flags [P.],
seq 1:163, ack 275, win 6375, options [nop,nop,TS val 1104784822 ecr
2988017976], length 162: HTTP: HTTP/1.1 200
E.....@.@..................h.[<
...........
A......8HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 1
Date: Tue, 13 Aug 2024 08:43:13 GMT
Keep-Alive: timeout=60
Connection: keep-alive



From: Mark Thomas <ma...@apache.org>
Date: Sunday, 11 August 2024 at 17:37
To: users@tomcat.apache.org <users@tomcat.apache.org>
Subject: Re: Issue with Chunked Transfer Encoding in Tomcat
10.1.25-10.1.28 with Spring

On 11/08/2024 13:50, Itzhak Fadida wrote:
> • Problem: Chunked transfer encoding seems to behave incorrectly in
> Tomcat versions 10.1.25 through 10.1.28. Specifically, instead of
> receiving several chunks of data, I am receiving the entire message in
> a single chunk, but only when the connection is closed by the client.

What makes multiple chunks correct and one chunk incorrect?

If the connection is closed by the client, how is the client receiving
the response?

> I reviewed the changelogs and noticed there were modifications related
> to chunked transfer encoding in these versions.

Really? What changes?

> • Spring Version: 3.3.2.

Do you mean Spring Boot here?

> I appreciate any insights or advice from the community. If additional
> information is needed, I’m happy to provide it.

A minimal reproducible test case is usually the easiest way for other
folks to investigate the behaviour you are seeing.

Mark

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to