|
40 | 40 |
|
41 | 41 | package org.glassfish.jersey.tests.e2e.common;
|
42 | 42 |
|
| 43 | +import java.io.IOException; |
43 | 44 | import java.util.ArrayList;
|
44 | 45 | import java.util.List;
|
45 | 46 | import java.util.logging.Level;
|
|
50 | 51 | import javax.ws.rs.POST;
|
51 | 52 | import javax.ws.rs.Path;
|
52 | 53 | import javax.ws.rs.Produces;
|
| 54 | +import javax.ws.rs.client.ClientRequestContext; |
| 55 | +import javax.ws.rs.client.ClientRequestFilter; |
| 56 | +import javax.ws.rs.client.ClientResponseContext; |
| 57 | +import javax.ws.rs.client.ClientResponseFilter; |
53 | 58 | import javax.ws.rs.client.Entity;
|
| 59 | +import javax.ws.rs.container.ContainerRequestContext; |
| 60 | +import javax.ws.rs.container.ContainerRequestFilter; |
| 61 | +import javax.ws.rs.container.ContainerResponseContext; |
| 62 | +import javax.ws.rs.container.ContainerResponseFilter; |
54 | 63 | import javax.ws.rs.core.Application;
|
55 | 64 | import javax.ws.rs.core.MediaType;
|
56 | 65 | import javax.ws.rs.core.Response;
|
57 | 66 |
|
| 67 | +import javax.annotation.Priority; |
| 68 | + |
58 | 69 | import org.glassfish.jersey.logging.LoggingFeature;
|
59 | 70 | import org.glassfish.jersey.server.ResourceConfig;
|
60 | 71 | import org.glassfish.jersey.test.JerseyTest;
|
|
79 | 90 | @Suite.SuiteClasses({
|
80 | 91 | LoggingFeatureTest.ClientTest.class,
|
81 | 92 | LoggingFeatureTest.ContainerTest.class,
|
82 |
| - LoggingFeatureTest.ContainerAutodiscoveryTest.class |
| 93 | + LoggingFeatureTest.ContainerAutodiscoveryTest.class, |
| 94 | + LoggingFeatureTest.FiltersOrderTest.class |
83 | 95 | })
|
84 | 96 | public class LoggingFeatureTest {
|
85 | 97 |
|
@@ -372,4 +384,91 @@ private static List<LogRecord> getLoggingFilterLogRecord(final List<LogRecord> r
|
372 | 384 |
|
373 | 385 | return loggingFilterRecords;
|
374 | 386 | }
|
| 387 | + |
| 388 | + public static class FiltersOrderTest extends JerseyTest { |
| 389 | + |
| 390 | + @Priority(1000) |
| 391 | + private static class CustomFilter implements ClientRequestFilter, ClientResponseFilter, |
| 392 | + ContainerRequestFilter, ContainerResponseFilter { |
| 393 | + |
| 394 | + static final String CUSTOM_HEADER = "custom_header"; |
| 395 | + |
| 396 | + @Override |
| 397 | + public void filter(final ClientRequestContext requestContext) throws IOException { |
| 398 | + requestContext.getHeaders().add(CUSTOM_HEADER, "client/request"); |
| 399 | + } |
| 400 | + |
| 401 | + @Override |
| 402 | + public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) |
| 403 | + throws IOException { |
| 404 | + responseContext.getHeaders().add(CUSTOM_HEADER, "client/response"); |
| 405 | + } |
| 406 | + |
| 407 | + @Override |
| 408 | + public void filter(final ContainerRequestContext requestContext) throws IOException { |
| 409 | + requestContext.getHeaders().add(CUSTOM_HEADER, "container/request"); |
| 410 | + } |
| 411 | + |
| 412 | + @Override |
| 413 | + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) |
| 414 | + throws IOException { |
| 415 | + responseContext.getHeaders().add(CUSTOM_HEADER, "container/response"); |
| 416 | + } |
| 417 | + } |
| 418 | + |
| 419 | + @Override |
| 420 | + protected Application configure() { |
| 421 | + set(TestProperties.RECORD_LOG_LEVEL, Level.INFO.intValue()); |
| 422 | + |
| 423 | + return new ResourceConfig(MyResource.class) |
| 424 | + .property(LoggingFeature.LOGGING_FEATURE_LOGGER_NAME, LOGGER_NAME) |
| 425 | + .property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL, "INFO") |
| 426 | + .register(CustomFilter.class); |
| 427 | + } |
| 428 | + |
| 429 | + @Test |
| 430 | + public void testFilterAsContainerFilter() throws Exception { |
| 431 | + // Correct response status. |
| 432 | + assertThat(target() |
| 433 | + .register(CustomFilter.class) |
| 434 | + .register(new LoggingFeature(Logger.getLogger(LOGGER_NAME), |
| 435 | + Level.INFO, |
| 436 | + LoggingFeature.Verbosity.HEADERS_ONLY, |
| 437 | + 0)) |
| 438 | + .request().get().getStatus(), is(Response.Status.OK.getStatusCode())); |
| 439 | + |
| 440 | + for (LogRecord record : getLoggedRecords()) { |
| 441 | + System.out.println(record.getMessage()); |
| 442 | + } |
| 443 | + |
| 444 | + // --- client request log entry |
| 445 | + // client added header before request has sent (and logged) |
| 446 | + assertThat(getLoggedRecords().get(0).getMessage(), |
| 447 | + containsString("1 > custom_header: client/request\n")); |
| 448 | + |
| 449 | + |
| 450 | + // --- container request log entry |
| 451 | + // container receives header from client request |
| 452 | + assertThat(getLoggedRecords().get(1).getMessage(), |
| 453 | + containsString("1 > custom_header: client/request\n")); |
| 454 | + // container has added its own header after logging filter logged message |
| 455 | + assertThat(getLoggedRecords().get(1).getMessage(), |
| 456 | + not(containsString("1 > custom_header: container/request\n"))); |
| 457 | + |
| 458 | + |
| 459 | + // --- container response log entry |
| 460 | + // container added header to the response and it was logged |
| 461 | + assertThat(getLoggedRecords().get(2).getMessage(), |
| 462 | + containsString("1 < custom_header: container/response\n")); |
| 463 | + |
| 464 | + // --- client response log entry |
| 465 | + // client received header |
| 466 | + assertThat(getLoggedRecords().get(3).getMessage(), |
| 467 | + containsString("1 < custom_header: container/response\n")); |
| 468 | + assertThat(getLoggedRecords().get(3).getMessage(), |
| 469 | + not(containsString("1 < custom_header: client/response\n"))); |
| 470 | + |
| 471 | + } |
| 472 | + |
| 473 | + } |
375 | 474 | }
|
0 commit comments