Project: Tomcat
Bug 54248 Retrieving content that contains a BOM via request.getReader() issue
Reported: 2012-12-05 11:56:08 | Status: resolved fixed

If a request contains Content that includes the BOM - in my case Content-Type: application/xml; charset-utf-16 - and the content has a BOM (FF FE), when fetched utilizing the BufferedReader from getReader() - the first request serviced on the AJP thread works correctly (encoded correctly, only characters fetched), however, any subsequent request on the thread which includes the BOM has the BOM being delivered to the application. It appears via review of the Tomcat code, that the recycle() method in B2CConverter simply ensures the socket's data has been completely flushed and the underlying InputStream doesn't get reset (don't really know if there is a way to do this without re-instantiating it) to ensure subsequent requests BOM is consumed. I proved this as a test by adding a call to reset() within the recycle() method which re-instantiates the underlying InputStreams and the problem resolved itself. I've temporarily resolved the issue in my application code by using request.getInputStream() and using request.getCharacterEncoding() and encoding the content inside my application.

Files changed in fix:
java/org/apache/tomcat/util/buf/B2CConverter.java test/org/apache/tomcat/util/buf/TestB2CConverter.java