This is an automated email from the ASF dual-hosted git repository.

sergeyb pushed a commit to branch 3.1.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.1.x-fixes by this push:
     new d2357bd  [CXF-7592] Mapping IOExceptions thrown from the container 
request filters
d2357bd is described below

commit d2357bddf23908ec0aacf433c48390cdef69cb19
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  | 18 ++++++++----------
 .../org/apache/cxf/jaxrs/utils/JAXRSUtils.java     | 20 ++++++++------------
 .../org/apache/cxf/systest/jaxrs/BookServer20.java | 16 +++++++++++++++-
 .../systest/jaxrs/JAXRS20ClientServerBookTest.java | 22 ++++++++++++++++++++++
 4 files changed, 53 insertions(+), 23 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 e2f9dc9..e5071e3 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);
             }
         }
         
@@ -93,9 +95,9 @@ public class JAXRSInInterceptor extends 
AbstractPhaseInterceptor<Message> {
                                                                 
OutgoingChainInterceptor.class.getName());
         }
     }
-    
-    private void processRequest(Message message, Exchange exchange) {
-        
+
+    private void processRequest(Message message, Exchange exchange) throws 
IOException {
+
         ServerProviderFactory providerFactory = 
ServerProviderFactory.getInstance(message);
         
         RequestPreprocessor rp = providerFactory.getRequestPreprocessor();
@@ -210,13 +212,9 @@ 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 77c3f06..6eebcc6 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
@@ -1677,22 +1677,18 @@ public final class JAXRSUtils {
     public static QName convertStringToQName(String name) {
         return DOMUtils.convertStringToQName(name, "");
     }
-    
-    public static boolean runContainerRequestFilters(ServerProviderFactory pf, 
-                                                     Message m, 
-                                                     boolean preMatch, 
-                                                     Set<String> names) {
-        List<ProviderInfo<ContainerRequestFilter>> containerFilters = preMatch 
+
+    public static boolean runContainerRequestFilters(ServerProviderFactory pf,
+                                                     Message m,
+                                                     boolean preMatch,
+                                                     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 fac5206..67679a7 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 b9b6fe4..9fa3bbf 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
@@ -269,6 +269,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"));
@@ -279,6 +280,27 @@ public class JAXRS20ClientServerBookTest extends 
AbstractBusClientServerTestBase
     }
     
     @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() {
         String address = "http://localhost:"; + PORT + 
"/bookstore/bookheaders/simple?throwException";
         WebClient wc = WebClient.create(address);

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to