[ http://issues.apache.org/jira/browse/WICKET-144?page=all ]

Eelco Hillenius closed WICKET-144.
----------------------------------


> wrong handling of exceptions for Resource#respond and 
> ComponentResourceRequestTarget#respond
> --------------------------------------------------------------------------------------------
>
>                 Key: WICKET-144
>                 URL: http://issues.apache.org/jira/browse/WICKET-144
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 2.0, 1.3, 1.2.4
>            Reporter: Eelco Hillenius
>         Assigned To: Eelco Hillenius
>             Fix For: 2.0, 1.3, 1.2.4
>
>
> Resource's exception handling is too fragile. Currently (before fix) it looks 
> like this:
>       private final void respond(final IResourceStream resourceStream, final 
> Response response)
>       {
>               try
>               {
>                       final OutputStream out = response.getOutputStream();
>                       try
>                       {
>                               Streams.copy(resourceStream.getInputStream(), 
> out);
>                       }
>                       finally
>                       {
>                               resourceStream.close();
>                               out.flush();
>                       }
>               }
>               catch (Exception e)
>               {
>                       Throwable throwable = e;
>                       boolean ignoreException = false;
>                       while (throwable != null)
>                       {
>                               if (throwable instanceof SocketException)
>                               {
>                                       String message = throwable.getMessage();
>                                       ignoreException = message != null
>                                                       && 
> (message.indexOf("Connection reset by peer") != -1 || message
>                                                                       
> .indexOf("Software caused connection abort") != -1);
>                               }
>                               else
>                               {
>                                       ignoreException = 
> throwable.getClass().getName()
>                                                       
> .indexOf("ClientAbortException") >= 0;
>                                       if (ignoreException)
>                                       {
>                                               if (log.isDebugEnabled())
>                                               {
>                                                       log.debug("Socket 
> exception ignored for sending Resource "
>                                                                       + 
> "response to client (ClientAbort)", e);
>                                               }
>                                               break;
>                                       }
>                               }
>                               throwable = throwable.getCause();
>                       }
>                       if (!ignoreException)
>                       {
>                               throw new WicketRuntimeException("Unable to 
> render resource stream "
>                                               + resourceStream, e);
>                       }
>               }
>       }
> and ComponentResourceRequestTarget re-threw this exception, resulting in 
> Wicket trying to render an error page. One problem with the above code is 
> that it is simply does not cover all appservers/versions/os-ses, nor it that 
> something we should want to support. For instance, an aborted request in 
> Jetty on Linux/ OSX results in an IOException (or more concrete EofException).
> Besides the fact that this can get you weird behavior in general, handling 
> the exception like we did there is never a good idea. We should never try to 
> render an error page for any exception during a resource request but instead 
> set an appropriate status code. I propose status code 500 
> (INTERNAL_SERVER_ERROR) for this and put that in 
> ComponentResourceRequestTarget, and alter Resource so that it always 
> re-throws any exception.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to