This is an automated email from the ASF dual-hosted git repository.
sergeyb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 94bbc35 [CXF-7592] Mapping IOExceptions thrown from the container
request filters
94bbc35 is described below
commit 94bbc35372b41e5e887fc52cdd6502fb149de32c
Author: Sergey Beryozkin <[email protected]>
AuthorDate: Mon Dec 18 17:50:50 2017 +0000
[CXF-7592] Mapping IOExceptions thrown from the container request filters
---
.../cxf/jaxrs/interceptor/JAXRSInInterceptor.java | 13 +++++--------
.../org/apache/cxf/jaxrs/utils/JAXRSUtils.java | 10 +++-------
.../org/apache/cxf/systest/jaxrs/BookServer20.java | 16 +++++++++++++++-
.../systest/jaxrs/JAXRS20ClientServerBookTest.java | 22 ++++++++++++++++++++++
4 files changed, 45 insertions(+), 16 deletions(-)
diff --git
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
index c07aaf1..ae42a2e 100644
---
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
+++
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
@@ -83,6 +83,8 @@ public class JAXRSInInterceptor extends
AbstractPhaseInterceptor<Message> {
convertExceptionToResponseIfPossible(ex.getCause(), message);
} catch (RuntimeException ex) {
convertExceptionToResponseIfPossible(ex, message);
+ } catch (IOException ex) {
+ convertExceptionToResponseIfPossible(ex, message);
}
}
@@ -94,7 +96,7 @@ public class JAXRSInInterceptor extends
AbstractPhaseInterceptor<Message> {
}
}
- private void processRequest(Message message, Exchange exchange) {
+ private void processRequest(Message message, Exchange exchange) throws
IOException {
ServerProviderFactory providerFactory =
ServerProviderFactory.getInstance(message);
@@ -209,13 +211,8 @@ public class JAXRSInInterceptor extends
AbstractPhaseInterceptor<Message> {
//Process parameters
- try {
- List<Object> params = JAXRSUtils.processParameters(ori,
matchedValues, message);
- message.setContent(List.class, params);
- } catch (IOException ex) {
- convertExceptionToResponseIfPossible(ex, message);
- }
-
+ List<Object> params = JAXRSUtils.processParameters(ori, matchedValues,
message);
+ message.setContent(List.class, params);
}
private void convertExceptionToResponseIfPossible(Throwable ex, Message
message) {
diff --git
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
index 1c9400b..d75412f 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
@@ -1676,18 +1676,14 @@ public final class JAXRSUtils {
public static boolean runContainerRequestFilters(ServerProviderFactory pf,
Message m,
boolean preMatch,
- Set<String> names) {
+ Set<String> names) throws
IOException {
List<ProviderInfo<ContainerRequestFilter>> containerFilters = preMatch
? pf.getPreMatchContainerRequestFilters() :
pf.getPostMatchContainerRequestFilters(names);
if (!containerFilters.isEmpty()) {
ContainerRequestContext context = new
ContainerRequestContextImpl(m, preMatch, false);
for (ProviderInfo<ContainerRequestFilter> filter :
containerFilters) {
- try {
- InjectionUtils.injectContexts(filter.getProvider(),
filter, m);
- filter.getProvider().filter(context);
- } catch (IOException ex) {
- throw ExceptionUtils.toInternalServerErrorException(ex,
null);
- }
+ InjectionUtils.injectContexts(filter.getProvider(), filter, m);
+ filter.getProvider().filter(context);
Response response = m.getExchange().get(Response.class);
if (response != null) {
setMessageContentType(m, response);
diff --git
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java
index 2c3dce7..6133002 100644
---
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java
+++
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookServer20.java
@@ -55,6 +55,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
import javax.ws.rs.ext.WriterInterceptor;
@@ -99,6 +100,7 @@ public class BookServer20 extends AbstractBusTestServerBase {
providers.add(new PreMatchReplaceStreamOrAddress());
providers.add(new ServerTestFeature());
providers.add(new JacksonJaxbJsonProvider());
+ providers.add(new IOExceptionMapper());
sf.setProviders(providers);
sf.setResourceProvider(BookStore.class,
new SingletonResourceProvider(new BookStore(),
true));
@@ -155,6 +157,9 @@ public class BookServer20 extends AbstractBusTestServerBase
{
throw new InternalServerErrorException(
Response.status(500).type("text/plain")
.entity("Prematch filter error").build());
+ } else if ("throwExceptionIO".equals(path)) {
+ context.setProperty("filterexception", "prematch");
+ throw new IOException();
}
MediaType mt = context.getMediaType();
@@ -328,7 +333,7 @@ public class BookServer20 extends AbstractBusTestServerBase
{
if ((!responseContext.getHeaders().containsKey("DynamicResponse")
||
!responseContext.getHeaders().containsKey("DynamicResponse2"))
- && !"Prematch filter
error".equals(responseContext.getEntity())) {
+ && (!"Prematch filter
error".equals(responseContext.getEntity()))) {
throw new RuntimeException();
}
responseContext.getHeaders().add("Response2", "OK2");
@@ -523,4 +528,13 @@ public class BookServer20 extends
AbstractBusTestServerBase {
}
}
+ private static class IOExceptionMapper implements
ExceptionMapper<IOException> {
+
+ @Override
+ public Response toResponse(IOException ex) {
+ return Response.status(500).type("text/plain")
+ .entity("Prematch filter error").header("IOException",
"true").build();
+ }
+
+ }
}
diff --git
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
index dc61df7..059aadd 100644
---
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
+++
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
@@ -272,6 +272,7 @@ public class JAXRS20ClientServerBookTest extends
AbstractBusClientServerTestBase
assertEquals("prematch", response.getHeaderString("FilterException"));
assertEquals("OK", response.getHeaderString("Response"));
assertEquals("OK2", response.getHeaderString("Response2"));
+ assertNull(response.getHeaderString("IOException"));
assertNull(response.getHeaderString("DynamicResponse"));
assertNull(response.getHeaderString("Custom"));
assertEquals("serverWrite",
response.getHeaderString("ServerWriterInterceptor"));
@@ -280,6 +281,27 @@ public class JAXRS20ClientServerBookTest extends
AbstractBusClientServerTestBase
response.getHeaderString("ServerWriterInterceptorHttpResponse"));
assertEquals("text/plain;charset=us-ascii",
response.getMediaType().toString());
}
+
+ @Test
+ public void testPreMatchContainerFilterThrowsIOException() {
+ String address = "http://localhost:" + PORT + "/throwExceptionIO";
+ WebClient wc = WebClient.create(address);
+
WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(1000000L);
+ Response response = wc.get();
+ assertEquals(500, response.getStatus());
+ assertEquals("Prematch filter error",
response.readEntity(String.class));
+ assertEquals("prematch", response.getHeaderString("FilterException"));
+ assertEquals("OK", response.getHeaderString("Response"));
+ assertEquals("OK2", response.getHeaderString("Response2"));
+ assertNull(response.getHeaderString("DynamicResponse"));
+ assertNull(response.getHeaderString("Custom"));
+ assertEquals("true", response.getHeaderString("IOException"));
+ assertEquals("serverWrite",
response.getHeaderString("ServerWriterInterceptor"));
+ assertEquals("serverWrite2",
response.getHeaderString("ServerWriterInterceptor2"));
+ assertEquals("serverWriteHttpResponse",
+
response.getHeaderString("ServerWriterInterceptorHttpResponse"));
+ assertEquals("text/plain;charset=us-ascii",
response.getMediaType().toString());
+ }
@Test
public void testPostMatchContainerFilterThrowsException() {
--
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].