Skip to content

Commit 8714840

Browse files
Show return status to all calls where our logic runs
Makes the switch over to JAX-RS compliant container filters, which are better because: * The CXF API is incomprehensible; very difficult to find the right random string to get from the message, and very little documentation in the code about what each entry contains, when it will be there. I tried implemening this change previously with the CXF API, but both the response code and path were null. idk why, and didn't want to spend ages trying to figure it out. * we can eventually switch the HTTP server over to Spring (if desired; would clean up a bit of stuff: related to https://github.com/SuffolkLITLab/EfileProxyServer/blob/main/TODO.md). https://stackoverflow.com/a/46726824/11416267
1 parent edc3319 commit 8714840

File tree

5 files changed

+46
-42
lines changed

5 files changed

+46
-42
lines changed

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/EfspServer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ protected EfspServer(
149149
sf.setProviders(providers());
150150

151151
sf.setAddress(ServiceHelpers.BASE_LOCAL_URL);
152-
sf.getInInterceptors().add(new ObservabilityHeadersInterceptor());
153-
sf.getOutInterceptors().add(new ObservabilityResetInterceptor());
154152
server = sf.create();
155153
}
156154

@@ -217,7 +215,9 @@ public static List<?> providers() {
217215
new JAXBElementProvider<Object>(),
218216
new JacksonJsonProvider(), // TODO(brycew): JAXBJSon?
219217
new SoapExceptionMapper(),
220-
new JsonExceptionMapper());
218+
new JsonExceptionMapper(),
219+
new ObservabilityHeadersInterceptor(),
220+
new ObservabilityResetInterceptor());
221221
}
222222

223223
public static void main(String[] args) throws Exception {

proxyserver/src/main/java/edu/suffolk/litlab/efsp/server/utils/ObservabilityHeadersInterceptor.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,32 @@
11
package edu.suffolk.litlab.efsp.server.utils;
22

3+
import jakarta.ws.rs.container.ContainerRequestContext;
4+
import jakarta.ws.rs.container.ContainerRequestFilter;
5+
import jakarta.ws.rs.container.PreMatching;
6+
import jakarta.ws.rs.ext.Provider;
7+
import java.io.IOException;
38
import java.util.List;
49
import java.util.Map;
510
import java.util.UUID;
611
import java.util.regex.Pattern;
7-
import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
8-
import org.apache.cxf.interceptor.Fault;
9-
import org.apache.cxf.message.Message;
10-
import org.apache.cxf.phase.Phase;
1112
import org.slf4j.Logger;
1213
import org.slf4j.LoggerFactory;
1314
import org.slf4j.MDC;
15+
import org.springframework.stereotype.Component;
1416

15-
public class ObservabilityHeadersInterceptor extends AbstractInDatabindingInterceptor {
17+
@Component
18+
@Provider
19+
@PreMatching // lets this run on all requests, not just those that match an endpoint
20+
public class ObservabilityHeadersInterceptor implements ContainerRequestFilter {
1621
private static final Logger log = LoggerFactory.getLogger(ObservabilityHeadersInterceptor.class);
1722

1823
private static final String SESSION_ID = "efsp-session-id";
1924
private static final String CORRELATION_ID = "efsp-correlation-id";
2025
private static final String REQUEST_ID = "efsp-request-id";
2126

22-
public ObservabilityHeadersInterceptor() {
23-
// See https://cxf.apache.org/docs/interceptors.html for phase descriptions
24-
super(Phase.UNMARSHAL);
25-
}
26-
2727
@Override
28-
public void handleMessage(Message message) throws Fault {
29-
@SuppressWarnings("unchecked")
30-
var headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
28+
public void filter(ContainerRequestContext requestContext) throws IOException {
29+
var headers = requestContext.getHeaders();
3130
try {
3231
String sessionId = handleHeaderString(headers, SESSION_ID);
3332
if (sessionId != null) {
Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
package edu.suffolk.litlab.efsp.server.utils;
22

3-
import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
4-
import org.apache.cxf.interceptor.Fault;
5-
import org.apache.cxf.message.Message;
6-
import org.apache.cxf.phase.Phase;
3+
import jakarta.ws.rs.container.ContainerRequestContext;
4+
import jakarta.ws.rs.container.ContainerResponseContext;
5+
import jakarta.ws.rs.container.ContainerResponseFilter;
6+
import jakarta.ws.rs.ext.Provider;
7+
import java.io.IOException;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import org.springframework.stereotype.Component;
711

12+
@Component
13+
@Provider
814
/** Clears all MDC entries after our business logic finishes running. */
9-
public class ObservabilityResetInterceptor extends AbstractOutDatabindingInterceptor {
10-
11-
public ObservabilityResetInterceptor() {
12-
// See https://cxf.apache.org/docs/interceptors.html for phase descriptions
13-
super(Phase.POST_LOGICAL);
14-
}
15+
public class ObservabilityResetInterceptor implements ContainerResponseFilter {
16+
private static final Logger log = LoggerFactory.getLogger(ObservabilityResetInterceptor.class);
1517

1618
@Override
17-
public void handleMessage(Message message) throws Fault {
19+
public void filter(ContainerRequestContext request, ContainerResponseContext response)
20+
throws IOException {
21+
log.info(
22+
"Sending back status of {} in response to {}",
23+
response.getStatus(),
24+
request.getUriInfo().getPath());
1825
MDCWrappers.removeAllMDCs();
1926
}
2027
}

proxyserver/src/main/resources/logback.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<!-- Ignoring "WARN org.eclipse.jetty.server.handler.ContextHandler - Unimplemented getRequestCharacterEncoding() - use org.eclipse.jetty.servlet.ServletContextHandler" -->
4242
<logger name="org.eclipse.jetty.server.handler.ContextHandler" level="ERROR"/>
4343
<!--logger name="org.eclipse.jetty" level="DEBUG"/-->
44+
<!--logger name="edu.suffolk.litlab.efsp" level="TRACE"/-->
4445

4546
<root level="info">
4647
<appender-ref ref="STDOUT" />

proxyserver/src/test/java/edu/suffolk/litlab/efsp/server/utils/ObservabilityHeadersInterceptorTest.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import static org.mockito.Mockito.mock;
44
import static org.mockito.Mockito.when;
55

6-
import java.util.List;
7-
import java.util.Map;
6+
import jakarta.ws.rs.container.ContainerRequestContext;
7+
import jakarta.ws.rs.core.MultivaluedHashMap;
8+
import java.io.IOException;
89
import net.jqwik.api.ForAll;
910
import net.jqwik.api.Property;
10-
import org.apache.cxf.message.Message;
1111
import org.slf4j.MDC;
1212

1313
public class ObservabilityHeadersInterceptorTest {
@@ -16,18 +16,15 @@ public class ObservabilityHeadersInterceptorTest {
1616

1717
@Property
1818
boolean interceptorHandlesAllHeaders(
19-
@ForAll String sessionId, @ForAll String corrId, @ForAll String reqId) {
20-
Message m = mock(Message.class);
21-
when(m.get(Message.PROTOCOL_HEADERS))
22-
.thenReturn(
23-
Map.of(
24-
"efsp-session-id",
25-
List.of(sessionId),
26-
"efsp-correlation-id",
27-
List.of(corrId),
28-
"efsp-request-id",
29-
List.of(reqId)));
30-
interceptor.handleMessage(m);
19+
@ForAll String sessionId, @ForAll String corrId, @ForAll String reqId) throws IOException {
20+
ContainerRequestContext ctx = mock(ContainerRequestContext.class);
21+
var headers = new MultivaluedHashMap<String, String>();
22+
headers.add("efsp-session-id", sessionId);
23+
headers.add("efsp-correlation-id", corrId);
24+
headers.add("efsp-request-id", reqId);
25+
when(ctx.getHeaders()).thenReturn(headers);
26+
27+
interceptor.filter(ctx);
3128

3229
// Request should always be present, but as long as we don't crash we're good.
3330
return MDC.get(MDCWrappers.REQUEST_ID) != null;

0 commit comments

Comments
 (0)