@ -29,7 +29,6 @@ import org.airsonic.player.service.sonos.SonosHelper;
import org.airsonic.player.util.HttpRange ;
import org.airsonic.player.util.HttpRange ;
import org.airsonic.player.util.StringUtil ;
import org.airsonic.player.util.StringUtil ;
import org.airsonic.player.util.Util ;
import org.airsonic.player.util.Util ;
import org.apache.catalina.connector.ClientAbortException ;
import org.apache.commons.io.IOUtils ;
import org.apache.commons.io.IOUtils ;
import org.slf4j.Logger ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import org.slf4j.LoggerFactory ;
@ -249,9 +248,22 @@ public class StreamController {
}
}
}
}
}
}
} catch ( ClientAbortException e ) {
} catch ( IOException e ) {
// This happens often and outside of the control of the server, so
// we catch Tomcat/Jetty "connection aborted by client" exceptions
// and display a short error message.
boolean shouldCatch = false ;
shouldCatch | = Util . isInstanceOfClassName ( e , "org.apache.catalina.connector.ClientAbortException" ) ;
shouldCatch | = Util . isInstanceOfClassName ( e , "org.eclipse.jetty.io.EofException" ) ;
if ( shouldCatch ) {
LOG . info ( "{}: Client unexpectedly closed connection while loading {} ({})" , request . getRemoteAddr ( ) , Util . getURLForRequest ( request ) , e . getCause ( ) . toString ( ) ) ;
LOG . info ( "{}: Client unexpectedly closed connection while loading {} ({})" , request . getRemoteAddr ( ) , Util . getURLForRequest ( request ) , e . getCause ( ) . toString ( ) ) ;
return ;
return ;
}
// Rethrow the exception in all other cases
throw e ;
} finally {
} finally {
if ( status ! = null ) {
if ( status ! = null ) {
securityService . updateUserByteCounts ( user , status . getBytesTransfered ( ) , 0L , 0L ) ;
securityService . updateUserByteCounts ( user , status . getBytesTransfered ( ) , 0L , 0L ) ;