Mark,

On 6/18/25 11:02 AM, Christopher Schultz wrote:
Mark,

On 6/18/25 3:08 AM, Mark Thomas wrote:
On 17/06/2025 21:13, Christopher Schultz wrote:
All,

I recently wrote a relatively simple Servlet (which is less and less common these days with frameworks, etc.) and I was surprised that I got a chunked response.

<snip/>

It's not interfering with the operation of the servlet or the client, but why am I not getting a "simpler" response?

Good question. I would not expect a chunked response either.

I thought it might be interesting to document how I investigated this. It is a simple question but the approach is fairly general.

My first thoughts were - why might this happen? The response clearly does fit inside the buffer so why is it chunked? Is something (a filter?) causing the response to be committed before the body is written?

Hmm this might be a clue.

Have there been any changes to relevant Tomcat code that I can recall (no) or is there anything that looks relevant in the changelog (not in the 6 months or so before the version being tested).

No real clues there to help direct the investigation.

The issue was reported with 9.0.97 so my first task to to perform a clean build of 9.0.x from source.

Then I created a dynamic web project in Eclipse using the provided servlet code. I though about using a JSP which should be broadly the same but there is a lot of plumbing that sits around a JSP so I went with the simple "Hello World" servlet.

Deploy the web application to my local Tomcat instance and check it works with a a browser. It does.

Next, use telnet to make an HTP request. Using telnet means I know exactly what was sent to the client and I can see exactly what was returned.

I see a 200 response with a content length - as expected.

At this point I am beginning to suspect something in the environment is causing the response to be committed.

The report was against 9.0.97 and I have been testing 9.0.x so the next step is to switch to the 9.0.97 tag, rebuild and then retest.

Same result. I also confirmed the browser was seeing a content-length header.

So all the evidence points to something beyond a clean Tomcat install (a Filter or Valve are the most likely) that is committing the response before the content is written.

I'll review all the Filters that are firing. Our code is usually quite meticulous about not disturbing the state of the request to avoid things like this, but it's always possible.

A quick review of all Filters that are running tells me that there are a few that can set response headers, but mostly are not in this particular case. The list of headers coming back in the response are:

HTTP/1.1 200
Via: HTTP/1.1 1
Transfer-Encoding: chunked
Date: Wed, 18 Jun 2025 15:12:58 GMT

Notably, I'm not getting a response output stream or writer anywhere before the "Hello World" is printed, and the header sizes are so small that they should also not be triggering a response flush before then.

Before writing the Hello World, I checked to see if the response has been committed using HttpServletResponse.isCommitted() and the return value is /false/ O_O.

I checked *after* the write and the response still says it is not committed.

I was even able to call response.reset() after the write and then re-write the response to "Goodbye, World". No exceptions, etc.

Is there something else I should be checking?

-chris


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

Reply via email to