Hi Christopher,

> Von: "Christopher Schultz" <ch...@christopherschultz.net>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
> 
> Micheal,
> 
> On 5/15/13 3:46 AM, Michael-O wrote:
> > I have modified the ErrorReportValve's messages outside of the 
> > one-byte range and the output got mangled. The response does not 
> > contain a char encoding anymore.
> 
> Can you be more specific? What exactly did you modify, and how did you
> modify it? What are the exact HTTP response headers that you get?

My modified valve is available here [1]. I did modify message layout and 
structure. The logic of the valve remained the same. Important are lines 219 to 
233 which are the same as in the original ErrorReportValve.

Responded headers are:
Cache-Control   private
Content-Length  992
Content-Type    text/html
Date    Wed, 15 May 2013 14:53:15 GMT
Expires Thu, 01 Jan 1970 01:00:00 CET
Server  Apache-Coyote/1.1

Content encoding is missing.
 
> > I know that the error valve does this:
> > 
> > response.setContentType("text/html"); 
> > response.setCharacterEncoding("utf-8");
> > 
> > but the setCharEnc method is completely ignored. Because the var 
> > usingWriter is already set to true. This happens in the 
> > ApplicationDispatcher#doForward line 393/394 when a servlet
> > performs a forward.
> 
> Looking at Tomcat 6.0.x/trunk line 393 is part of the cleanup code,
> and the response PrintWriter is immediately closed. That does not
> appear to have changed since 6.0.35. At this point, the request should
> be /over/.
> 
> What else is going on? Is any content being generated before the
> ErrorReportValve gets invoked? If the response has already been
> committed, then Tomcat can't re-write the response headers.

Nothing else is generated, this is my doGet:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {

 HttpSession session = request.getSession(false);

  if (session == null) {
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Keine Session 
vorhanden");
    return;
  }
  ..
}

In my testcase, the session is null, thus the ErrorReportValve is triggered.
When I have debugged the issue, I saw that the response was not committed yet.
 
> > Though a response.getReporter() is used but this one is completely 
> > unaware of the char encoding.
> > 
> > I am on Tomcat 6.0.35.
> 
> Where is response.getReporter being called?

That is called in my valve in line 227, which has the same counterpart in the 
original valve.
The ReporterPrintWriter has beeen created exactly for the case that where the 
original writer is not available anymore. It has already been cleaned up as you 
have mentioned before.

The setCharEnc is simply not propagated to the new one. The double-byte char 
\u2013 is displayed as a question mark in Firefox. Fiddler shows a 3F which 
simply means that the writer did not know how to map char to bytes.

Michael

[1] 
http://mo-tomcat-ext.sourceforge.net/xref/net/sf/michaelo/tomcat/extras/valves/EnhancedErrorReportValve.html

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

Reply via email to