[ http://issues.apache.org/jira/browse/WICKET-144?page=all ]
Eelco Hillenius resolved WICKET-144.
------------------------------------
Resolution: Fixed
Rolled back the change to Resource and included a FIXME that notes we don't
cover all cases. But that doesn't lead to very serious problems anymore as it
least the exception isn't thrown up in ComponentResourceRequestTarget anymore.
> 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: 1.2.4, 1.3, 2.0
> Reporter: Eelco Hillenius
> Assigned To: Eelco Hillenius
> Fix For: 1.2.4, 1.3, 2.0
>
>
> 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