Skip to content

Commit 13c0137

Browse files
committed
Merge branch '1.3.x'
2 parents b9d7a39 + 9210029 commit 13c0137

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/trace/WebRequestTraceFilter.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.servlet.ServletException;
3030
import javax.servlet.http.HttpServletRequest;
3131
import javax.servlet.http.HttpServletResponse;
32+
import javax.servlet.http.HttpServletResponseWrapper;
3233
import javax.servlet.http.HttpSession;
3334

3435
import org.apache.commons.logging.Log;
@@ -37,6 +38,7 @@
3738
import org.springframework.boot.actuate.trace.TraceProperties.Include;
3839
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
3940
import org.springframework.core.Ordered;
41+
import org.springframework.http.HttpStatus;
4042
import org.springframework.web.context.request.ServletRequestAttributes;
4143
import org.springframework.web.filter.OncePerRequestFilter;
4244

@@ -97,11 +99,14 @@ protected void doFilterInternal(HttpServletRequest request,
9799
throws ServletException, IOException {
98100
Map<String, Object> trace = getTrace(request);
99101
logTrace(request, trace);
102+
int status = HttpStatus.INTERNAL_SERVER_ERROR.value();
100103
try {
101104
filterChain.doFilter(request, response);
105+
status = response.getStatus();
102106
}
103107
finally {
104-
enhanceTrace(trace, response);
108+
enhanceTrace(trace, status == response.getStatus() ? response
109+
: new CustomStatusResponseWrapper(response, status));
105110
this.repository.add(trace);
106111
}
107112
}
@@ -203,4 +208,21 @@ public void setErrorAttributes(ErrorAttributes errorAttributes) {
203208
this.errorAttributes = errorAttributes;
204209
}
205210

211+
private static final class CustomStatusResponseWrapper
212+
extends HttpServletResponseWrapper {
213+
214+
private final int status;
215+
216+
private CustomStatusResponseWrapper(HttpServletResponse response, int status) {
217+
super(response);
218+
this.status = status;
219+
}
220+
221+
@Override
222+
public int getStatus() {
223+
return this.status;
224+
}
225+
226+
}
227+
206228
}

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/trace/WebRequestTraceFilterTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springframework.mock.web.MockHttpServletResponse;
3939

4040
import static org.assertj.core.api.Assertions.assertThat;
41+
import static org.junit.Assert.fail;
4142
import static org.mockito.Mockito.spy;
4243
import static org.mockito.Mockito.times;
4344
import static org.mockito.Mockito.verify;
@@ -183,4 +184,32 @@ public void filterHasError() {
183184
assertThat(map.get("message").toString()).isEqualTo("Foo");
184185
}
185186

187+
@Test
188+
@SuppressWarnings("unchecked")
189+
public void filterHas500ResponseStatusWhenExceptionIsThrown()
190+
throws ServletException, IOException {
191+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
192+
MockHttpServletResponse response = new MockHttpServletResponse();
193+
194+
try {
195+
this.filter.doFilterInternal(request, response, new FilterChain() {
196+
197+
@Override
198+
public void doFilter(ServletRequest request, ServletResponse response)
199+
throws IOException, ServletException {
200+
throw new RuntimeException();
201+
}
202+
203+
});
204+
fail("Exception was swallowed");
205+
}
206+
catch (RuntimeException ex) {
207+
Map<String, Object> headers = (Map<String, Object>) this.repository.findAll()
208+
.iterator().next().getInfo().get("headers");
209+
Map<String, Object> responseHeaders = (Map<String, Object>) headers
210+
.get("response");
211+
assertThat((String) responseHeaders.get("status")).isEqualTo("500");
212+
}
213+
}
214+
186215
}

0 commit comments

Comments
 (0)