Skip to content

Commit b78baec

Browse files
authored
fix(servlet): Allow overriding context set by servlet callback (#63)
2 parents 93134eb + e09f332 commit b78baec

File tree

4 files changed

+120
-2
lines changed

4 files changed

+120
-2
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ dependencies {
3232

3333
testCompile 'junit:junit:4.12'
3434
testCompile 'org.slf4j:slf4j-jdk14:1.7.25'
35+
testCompile 'javax.servlet:javax.servlet-api:3.1.0'
36+
testCompile 'org.mockito:mockito-core:2.10.0'
3537
}
3638

3739
test {

examples/servlet/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ repositories {
1717
}
1818

1919
dependencies {
20-
runtime 'org.slf4j:slf4j-simple:1.+'
20+
runtime 'org.slf4j:slf4j-simple:1.7.25'
2121
compile rootProject
2222
}
2323

src/main/java/com/bugsnag/callbacks/ServletCallback.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ public void beforeNotify(Report report) {
4141
.addToTab("request", "headers", getHeaderMap(request));
4242

4343
// Set default context
44-
report.setContext(request.getMethod() + " " + request.getRequestURI());
44+
if (report.getContext() == null) {
45+
report.setContext(request.getMethod() + " " + request.getRequestURI());
46+
}
4547
}
4648

4749
private String getClientIp(HttpServletRequest request) {
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package com.bugsnag.servlet;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertFalse;
5+
import static org.junit.Assert.assertTrue;
6+
import static org.mockito.Mockito.mock;
7+
import static org.mockito.Mockito.when;
8+
9+
import com.bugsnag.Bugsnag;
10+
import com.bugsnag.Report;
11+
import com.bugsnag.callbacks.ServletCallback;
12+
13+
import org.junit.Before;
14+
import org.junit.Test;
15+
16+
import java.lang.StringBuffer;
17+
import java.util.Arrays;
18+
import java.util.Enumeration;
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
import java.util.Vector;
22+
import javax.servlet.ServletContext;
23+
import javax.servlet.ServletRequest;
24+
import javax.servlet.ServletRequestEvent;
25+
import javax.servlet.http.HttpServletRequest;
26+
27+
public class ServletCallbackTest {
28+
29+
/**
30+
* Generate a new request instance which will be read by the servlet
31+
* context and callback
32+
*/
33+
@Before
34+
public void setUp() {
35+
HttpServletRequest request = mock(HttpServletRequest.class);
36+
37+
Map<String, String[]> params = new HashMap<String, String[]>();
38+
params.put("account", new String[]{"Acme Co"});
39+
params.put("name", new String[]{"Bill"});
40+
when(request.getParameterMap()).thenReturn(params);
41+
42+
when(request.getMethod()).thenReturn("PATCH");
43+
when(request.getRequestURL()).thenReturn(new StringBuffer("/foo/bar"));
44+
when(request.getRequestURI()).thenReturn("/foo/bar");
45+
when(request.getRemoteAddr()).thenReturn("12.0.4.57");
46+
47+
Enumeration<String> headers = new Vector<String>(
48+
Arrays.asList("Content-Type", "Content-Length")).elements();
49+
when(request.getHeaderNames()).thenReturn(headers);
50+
when(request.getHeader("Content-Type")).thenReturn("application/json");
51+
when(request.getHeader("Content-Length")).thenReturn("54");
52+
53+
ServletContext context = mock(ServletContext.class);
54+
BugsnagServletRequestListener listener = new BugsnagServletRequestListener();
55+
listener.requestInitialized(new ServletRequestEvent(context, request));
56+
}
57+
58+
@SuppressWarnings("unchecked")
59+
@Test
60+
public void testRequestMetadataAdded() {
61+
Report report = generateReport(new Exception("Spline reticulation failed"));
62+
ServletCallback callback = new ServletCallback();
63+
callback.beforeNotify(report);
64+
65+
Map<String, Object> metadata = (Map<String, Object>)report.getMetaData();
66+
assertTrue(metadata.containsKey("request"));
67+
68+
Map<String, Object> request = (Map<String, Object>)metadata.get("request");
69+
assertEquals("/foo/bar", request.get("url"));
70+
assertEquals("PATCH", request.get("method"));
71+
assertEquals("12.0.4.57", request.get("clientIp"));
72+
73+
assertTrue(request.containsKey("headers"));
74+
Map<String, String> headers = (Map<String, String>)request.get("headers");
75+
assertEquals("application/json", headers.get("Content-Type"));
76+
assertEquals("54", headers.get("Content-Length"));
77+
78+
assertTrue(request.containsKey("params"));
79+
Map<String, String[]> params = (Map<String, String[]>)request.get("params");
80+
assertTrue(params.containsKey("account"));
81+
String[] account = params.get("account");
82+
assertEquals("Acme Co", account[0]);
83+
84+
assertTrue(params.containsKey("name"));
85+
String[] name = params.get("name");
86+
assertEquals("Bill", name[0]);
87+
}
88+
89+
@Test
90+
public void testRequestContextSet() {
91+
Report report = generateReport(new Exception("Spline reticulation failed"));
92+
ServletCallback callback = new ServletCallback();
93+
callback.beforeNotify(report);
94+
95+
assertEquals("PATCH /foo/bar", report.getContext());
96+
}
97+
98+
@Test
99+
public void testExistingContextNotOverridden() {
100+
Report report = generateReport(new Exception("Spline reticulation failed"));
101+
report.setContext("Honey nut corn flakes");
102+
ServletCallback callback = new ServletCallback();
103+
callback.beforeNotify(report);
104+
105+
assertEquals("Honey nut corn flakes", report.getContext());
106+
}
107+
108+
Report generateReport(Exception exception) {
109+
Bugsnag bugsnag = new Bugsnag("apikey", false);
110+
bugsnag.setDelivery(null);
111+
112+
return bugsnag.buildReport(exception);
113+
}
114+
}

0 commit comments

Comments
 (0)