From 417583ccaa6bcad739056b1ce2536ccf3b128743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Thomas?= Date: Sun, 10 Mar 2019 21:40:24 +0100 Subject: [PATCH] Do not show stack trace for client-side connection errors The `ClientAbortException` exception indicates that the connection was closed by the client, usually for something the server can do nothing about (e.g. navigating outside of the page while it's loading). Since this error happens often, this commit displays shorter error messages when it does, without a large stack trace. All other exceptions are handled just as before. --- .../player/controller/StreamController.java | 5 ++--- .../player/spring/LoggingExceptionResolver.java | 11 ++++++++--- .../main/java/org/airsonic/player/util/Util.java | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/airsonic-main/src/main/java/org/airsonic/player/controller/StreamController.java b/airsonic-main/src/main/java/org/airsonic/player/controller/StreamController.java index 7a038637..fc97b95c 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/controller/StreamController.java +++ b/airsonic-main/src/main/java/org/airsonic/player/controller/StreamController.java @@ -249,8 +249,8 @@ public class StreamController { } } } - } catch (ClientAbortException err) { - LOG.info("org.apache.catalina.connector.ClientAbortException: Connection reset"); + } catch (ClientAbortException e) { + LOG.info("{}: Client unexpectedly closed connection while loading {} ({})", request.getRemoteAddr(), Util.getURLForRequest(request), e.getCause().toString()); return; } finally { if (status != null) { @@ -426,5 +426,4 @@ public class StreamController { out.write(buf); out.flush(); } - } diff --git a/airsonic-main/src/main/java/org/airsonic/player/spring/LoggingExceptionResolver.java b/airsonic-main/src/main/java/org/airsonic/player/spring/LoggingExceptionResolver.java index f374b74d..6ee5b55a 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/spring/LoggingExceptionResolver.java +++ b/airsonic-main/src/main/java/org/airsonic/player/spring/LoggingExceptionResolver.java @@ -1,5 +1,6 @@ package org.airsonic.player.spring; +import org.airsonic.player.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.Ordered; @@ -11,13 +12,17 @@ import javax.servlet.http.HttpServletResponse; public class LoggingExceptionResolver implements HandlerExceptionResolver, Ordered { - private static final Logger logger = LoggerFactory.getLogger(LoggingExceptionResolver.class); + private static final Logger LOG = LoggerFactory.getLogger(LoggingExceptionResolver.class); @Override public ModelAndView resolveException( - HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e + HttpServletRequest request, HttpServletResponse response, Object o, Exception e ) { - logger.error("Exception occurred", e); + if (e instanceof org.apache.catalina.connector.ClientAbortException) { + LOG.info("{}: Client unexpectedly closed connection while loading {} ({})", request.getRemoteAddr(), Util.getURLForRequest(request), e.getCause().toString()); + } else { + LOG.error("{}: An exception occurred while loading {}", request.getRemoteAddr(), Util.getURLForRequest(request), e); + } return null; } diff --git a/airsonic-main/src/main/java/org/airsonic/player/util/Util.java b/airsonic-main/src/main/java/org/airsonic/player/util/Util.java index 294d3fb4..b5c07da9 100644 --- a/airsonic-main/src/main/java/org/airsonic/player/util/Util.java +++ b/airsonic-main/src/main/java/org/airsonic/player/util/Util.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -117,4 +118,18 @@ public final class Util { return ""; } } + + /** + * Return a complete URL for the given HTTP request, + * including the query string. + * + * @param request An HTTP request instance + * @return The associated URL + */ + public static String getURLForRequest(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + String queryString = request.getQueryString(); + if (queryString != null && queryString.length() > 0) url += "?" + queryString; + return url; + } }