From c467ec335af9af14071ef0ac9e6d8973368ce56c Mon Sep 17 00:00:00 2001 From: Benoit <43733395+benoit-sns@users.noreply.github.com> Date: Mon, 15 Oct 2018 13:55:25 +0000 Subject: [PATCH] SONAR-11020 Log to debug when a request failed because the client reset the connection (#827) --- .../sonar/server/platform/web/RootFilter.java | 11 +++++++---- .../server/platform/web/RootFilterTest.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/web/RootFilter.java b/server/sonar-server/src/main/java/org/sonar/server/platform/web/RootFilter.java index 0e913f5c9b6..b15e3c19491 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/web/RootFilter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/web/RootFilter.java @@ -46,7 +46,7 @@ import static java.lang.String.format; */ public class RootFilter implements Filter { - public static final org.sonar.api.utils.log.Logger Logger = Loggers.get("http"); + private static final org.sonar.api.utils.log.Logger LOGGER = Loggers.get(RootFilter.class); @Override public void init(FilterConfig filterConfig) { @@ -61,10 +61,13 @@ public class RootFilter implements Filter { try { chain.doFilter(new ServletRequestWrapper(httpRequest), httpResponse); } catch (Throwable e) { - Loggers.get(RootFilter.class).error(format("Processing of request %s failed", toUrl(httpRequest)), e); - if (!response.isCommitted()) { - httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + if (httpResponse.isCommitted()) { + // Request has been aborted by the client, nothing can been done as Tomcat has committed the response + LOGGER.debug(format("Processing of request %s failed", toUrl(httpRequest)), e); + return; } + LOGGER.error(format("Processing of request %s failed", toUrl(httpRequest)), e); + httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } else { // Not an HTTP request, not profiled diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/web/RootFilterTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/web/RootFilterTest.java index 79d49843a4a..093f0d21d42 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/web/RootFilterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/web/RootFilterTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.platform.web; +import java.util.List; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; @@ -31,6 +32,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; +import org.sonar.api.utils.log.LogTester; +import org.sonar.api.utils.log.LoggerLevel; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -44,6 +47,8 @@ public class RootFilterTest { @Rule public ExpectedException expectedException = ExpectedException.none(); + @Rule + public LogTester logTester = new LogTester(); private FilterChain chain = mock(FilterChain.class); private RootFilter underTest; @@ -76,6 +81,18 @@ public class RootFilterTest { verify(response, never()).sendError(500); } + @Test + public void throwable_in_doFilter_is_logged_in_debug_if_response_is_already_committed() throws Exception { + doThrow(new RuntimeException()).when(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class)); + HttpServletResponse response = mockHttpResponse(true); + underTest.doFilter(request("POST", "/context/service/call", "param=value"), response, chain); + + List debugLogs = logTester.logs(LoggerLevel.DEBUG); + assertThat(debugLogs.size()).isEqualTo(1); + assertThat(debugLogs.get(0)).contains("Processing of request", "failed"); + } + + @Test public void request_used_in_chain_do_filter_is_a_servlet_wrapper_when_static_resource() throws Exception { underTest.doFilter(request("GET", "/context/static/image.png", null), mock(HttpServletResponse.class), chain); -- 2.39.5