From 15a63c58a7309ca7433a5681653a2a0c194c17f1 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Thu, 17 Oct 2013 14:49:45 -0500 Subject: [PATCH] SEC-2368: DebugFilter outputs headers and HTTP method --- .../security/web/debug/DebugFilter.java | 24 +++++++++++- .../security/web/debug/DebugFilterTest.java | 39 +++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/web/src/main/java/org/springframework/security/web/debug/DebugFilter.java b/web/src/main/java/org/springframework/security/web/debug/DebugFilter.java index ccbc1a5688..6d7ef508b1 100644 --- a/web/src/main/java/org/springframework/security/web/debug/DebugFilter.java +++ b/web/src/main/java/org/springframework/security/web/debug/DebugFilter.java @@ -48,10 +48,11 @@ public final class DebugFilter implements Filter { HttpServletResponse response = (HttpServletResponse) srvltResponse; List filters = getFilters(request); - logger.info("Request received for '" + UrlUtils.buildRequestUrl(request) + "':\n\n" + + logger.info("Request received for " + request.getMethod() + " '" + UrlUtils.buildRequestUrl(request) + "':\n\n" + request + "\n\n" + "servletPath:" + request.getServletPath() + "\n" + - "pathInfo:" + request.getPathInfo() + "\n\n" + + "pathInfo:" + request.getPathInfo() + "\n" + + "headers: \n" + formatHeaders(request) + "\n\n" + formatFilters(filters)); if (request.getAttribute(ALREADY_FILTERED_ATTR_NAME) == null) { @@ -73,6 +74,25 @@ public final class DebugFilter implements Filter { } } + String formatHeaders(HttpServletRequest request) { + StringBuilder sb = new StringBuilder(); + Enumeration eHeaderNames = request.getHeaderNames(); + while(eHeaderNames.hasMoreElements()) { + String headerName = eHeaderNames.nextElement(); + sb.append(headerName); + sb.append(": "); + Enumeration eHeaderValues = request.getHeaders(headerName); + while(eHeaderValues.hasMoreElements()) { + sb.append(eHeaderValues.nextElement()); + if(eHeaderValues.hasMoreElements()) { + sb.append(", "); + } + } + sb.append("\n"); + } + return sb.toString(); + } + String formatFilters(List filters) { StringBuilder sb = new StringBuilder(); sb.append("Security filter chain: "); diff --git a/web/src/test/java/org/springframework/security/web/debug/DebugFilterTest.java b/web/src/test/java/org/springframework/security/web/debug/DebugFilterTest.java index 73e87351df..f623b4bd4f 100644 --- a/web/src/test/java/org/springframework/security/web/debug/DebugFilterTest.java +++ b/web/src/test/java/org/springframework/security/web/debug/DebugFilterTest.java @@ -1,5 +1,6 @@ package org.springframework.security.web.debug; +import static org.fest.assertions.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; @@ -7,6 +8,8 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.Collections; + import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -21,10 +24,8 @@ import org.mockito.Mock; import org.powermock.core.classloader.annotations.PrepareOnlyThisForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.internal.WhiteboxImpl; +import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.security.web.FilterChainProxy; -import org.springframework.security.web.debug.DebugFilter; -import org.springframework.security.web.debug.DebugRequestWrapper; -import org.springframework.security.web.debug.Logger; /** * @@ -36,6 +37,9 @@ import org.springframework.security.web.debug.Logger; public class DebugFilterTest { @Captor private ArgumentCaptor requestCaptor; + @Captor + private ArgumentCaptor logCaptor; + @Mock private HttpServletRequest request; @Mock @@ -53,6 +57,7 @@ public class DebugFilterTest { @Before public void setUp() { + when(request.getHeaderNames()).thenReturn(Collections.enumeration(Collections.emptyList())); when(request.getServletPath()).thenReturn("/login"); filter = new DebugFilter(fcp); WhiteboxImpl.setInternalState(filter, Logger.class, logger); @@ -92,4 +97,32 @@ public class DebugFilterTest { verify(fcp).doFilter(fireWalledRequest, response, filterChain); } + + @Test + public void doFilterLogsProperly() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setMethod("GET"); + request.setServletPath("/path"); + request.setPathInfo("/"); + request.addHeader("A", "A Value"); + request.addHeader("A", "Another Value"); + request.addHeader("B", "B Value"); + + filter.doFilter(request, response, filterChain); + + verify(logger).info(logCaptor.capture()); + + assertThat(logCaptor.getValue()).isEqualTo("Request received for GET '/path/':\n" + + "\n" + + request + "\n" + + "\n" + + "servletPath:/path\n" + + "pathInfo:/\n" + + "headers: \n" + + "A: A Value, Another Value\n" + + "B: B Value\n" + + "\n" + + "\n" + + "Security filter chain: no match"); + } } \ No newline at end of file