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]>'].

Reply via email to