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; + } }