You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2021/06/27 00:27:16 UTC

[cxf] branch 3.4.x-fixes updated (dcf7b19 -> f581fb8)

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

reta pushed a change to branch 3.4.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git.


    from dcf7b19  Upgrade BC from 1.68 to 1.69 (#820)
     new 8890a64  CXF-8559: SseInterceptor uses PROTOCOL_HEADERS from request (in) message, not from response (out) one (#821)
     new f581fb8  Recording .gitmergeinfo Changes

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitmergeinfo                                      |  5 +++
 .../cxf/jaxrs/sse/interceptor/SseInterceptor.java  | 46 +++++++++++++---------
 .../cxf/systest/jaxrs/sse/AbstractSseTest.java     | 10 +++++
 .../apache/cxf/systest/jaxrs/sse/BookStore.java    | 18 ++++++++-
 .../systest/jaxrs/sse/BookStoreResponseFilter.java | 22 ++++++++++-
 5 files changed, 80 insertions(+), 21 deletions(-)

[cxf] 01/02: CXF-8559: SseInterceptor uses PROTOCOL_HEADERS from request (in) message, not from response (out) one (#821)

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8890a6461e192addd395a2d22447423cdd6b189e
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Jun 26 20:25:39 2021 -0400

    CXF-8559: SseInterceptor uses PROTOCOL_HEADERS from request (in) message, not from response (out) one (#821)
    
    (cherry picked from commit 3abb5099003e078f3537051eaa36029ea0131af4)
---
 .../cxf/jaxrs/sse/interceptor/SseInterceptor.java  | 46 +++++++++++++---------
 .../cxf/systest/jaxrs/sse/AbstractSseTest.java     | 10 +++++
 .../apache/cxf/systest/jaxrs/sse/BookStore.java    | 18 ++++++++-
 .../systest/jaxrs/sse/BookStoreResponseFilter.java | 22 ++++++++++-
 4 files changed, 75 insertions(+), 21 deletions(-)

diff --git a/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/interceptor/SseInterceptor.java b/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/interceptor/SseInterceptor.java
index 0599ee0..4e510e5 100644
--- a/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/interceptor/SseInterceptor.java
+++ b/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/interceptor/SseInterceptor.java
@@ -31,6 +31,8 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.sse.SseEventSink;
 
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.impl.ResponseImpl;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
@@ -38,6 +40,7 @@ import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
 import org.apache.cxf.phase.AbstractPhaseInterceptor;
 import org.apache.cxf.phase.Phase;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
@@ -72,17 +75,7 @@ public class SseInterceptor extends AbstractPhaseInterceptor<Message> {
                 if (response instanceof HttpServletResponse) {
                     servletResponse = (HttpServletResponse)response;
                     builder = Response.status(servletResponse.getStatus());
-                    
-                    @SuppressWarnings("unchecked")
-                    final Map<String, List<Object>> userHeaders = (Map<String, List<Object>>)message
-                        .get(Message.PROTOCOL_HEADERS);
 
-                    if (userHeaders != null) {
-                        for (Map.Entry<String, List<Object>> entry: userHeaders.entrySet()) {
-                            addHeader(builder, entry);
-                        }
-                    }
-                    
                     for (final String header: servletResponse.getHeaderNames()) {
                         final Collection<String> headers = servletResponse.getHeaders(header);
                         addHeader(builder, header, headers);
@@ -92,13 +85,23 @@ public class SseInterceptor extends AbstractPhaseInterceptor<Message> {
                 // Run the filters
                 try {
                     final ResponseImpl responseImpl = (ResponseImpl)builder.build();
+                    final Message outMessage = getOutMessage(message);
 
                     JAXRSUtils.runContainerResponseFilters(providerFactory, responseImpl, 
-                        message, ori, ori.getAnnotatedMethod());
+                        outMessage, ori, ori.getAnnotatedMethod());
 
                     if (servletResponse != null) {
-                        final MultivaluedMap<String, String> headers = responseImpl.getStringHeaders();
                         servletResponse.setStatus(responseImpl.getStatus());
+                        
+                        final Map<String, List<String>> userHeaders =  CastUtils.cast((Map<?, ?>)outMessage
+                            .get(Message.PROTOCOL_HEADERS));
+                        if (userHeaders != null) {
+                            for (Map.Entry<String, List<String>> entry: userHeaders.entrySet()) {
+                                setHeader(servletResponse, entry);
+                            }
+                        }
+                        
+                        final MultivaluedMap<String, String> headers = responseImpl.getStringHeaders();
                         if (headers != null) {
                             for (Map.Entry<String, List<String>> entry: headers.entrySet()) {
                                 setHeader(servletResponse, entry);
@@ -113,13 +116,20 @@ public class SseInterceptor extends AbstractPhaseInterceptor<Message> {
             }
         }
     }
-  
-    private void addHeader(Response.ResponseBuilder builder, Map.Entry<String, List<Object>> entry) {
-        if (entry.getValue() != null) {
-            for (Object value: entry.getValue()) {
-                builder.header(entry.getKey(), value);
-            }
+    
+    private Message getOutMessage(final Message message) {
+        final Exchange exchange = message.getExchange();
+        Message outMessage = message.getExchange().getOutMessage();
+        
+        if (outMessage == null) {
+            final Endpoint ep = exchange.getEndpoint();
+            outMessage = new MessageImpl();
+            outMessage.setExchange(exchange);
+            outMessage = ep.getBinding().createMessage(outMessage);
+            message.getExchange().setOutMessage(outMessage);
         }
+
+        return outMessage;
     }
     
     private void addHeader(Response.ResponseBuilder builder, final String header, final Collection<String> headers) {
diff --git a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/AbstractSseTest.java b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/AbstractSseTest.java
index f6ad024..8a82b21 100644
--- a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/AbstractSseTest.java
+++ b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/AbstractSseTest.java
@@ -325,6 +325,16 @@ public abstract class AbstractSseTest extends AbstractSseBaseTest {
         assertTrue(stats.getCompleted() == 2 || stats.getCompleted() == 1);
     }
 
+    @Test
+    public void testBooksSseContainerResponseAddedHeaders() throws InterruptedException {
+        final WebTarget target = createWebTarget("/rest/api/bookstore/headers/sse");
+        try (Response response = target.request(MediaType.SERVER_SENT_EVENTS).get()) {
+            assertThat(response.getStatus(), equalTo(202));
+            assertThat(response.getHeaderString("X-My-Header"), equalTo("headers"));
+            assertThat(response.getHeaderString("X-My-ProtocolHeader"), equalTo("protocol-headers"));
+        }
+    }
+
     /**
      * Jetty / Undertow do not propagate errors from the runnable passed to
      * AsyncContext::start() up to the AsyncEventListener::onError(). Tomcat however
diff --git a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStore.java b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStore.java
index de28eef..7fa54c5 100644
--- a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStore.java
+++ b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStore.java
@@ -183,7 +183,23 @@ public class BookStore extends BookStoreClientCloseable {
             }
         }.start();
     }
-    
+
+    @GET
+    @Path("/headers/sse")
+    @Produces(MediaType.SERVER_SENT_EVENTS)
+    public void headers(@Context SseEventSink sink) {
+        new Thread() {
+            public void run() {
+                try {
+                    Thread.sleep(200);
+                    sink.close();
+                } catch (final InterruptedException ex) {
+                    LOG.error("Communication error", ex);
+                }
+            }
+        }.start();
+    }
+
     @GET
     @Path("/filtered/stats")
     @Produces(MediaType.TEXT_PLAIN)
diff --git a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStoreResponseFilter.java b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStoreResponseFilter.java
index 0dba7d6..0a8270e 100644
--- a/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStoreResponseFilter.java
+++ b/systests/rs-sse/rs-sse-base/src/main/java/org/apache/cxf/systest/jaxrs/sse/BookStoreResponseFilter.java
@@ -20,6 +20,9 @@
 package org.apache.cxf.systest.jaxrs.sse;
 
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.ws.rs.container.ContainerRequestContext;
@@ -29,6 +32,10 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.Provider;
 
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.transport.http.Headers;
+
 @Provider
 public class BookStoreResponseFilter implements ContainerResponseFilter {
     private static AtomicInteger counter = new AtomicInteger(0);
@@ -40,9 +47,20 @@ public class BookStoreResponseFilter implements ContainerResponseFilter {
 
     @Override
     public void filter(ContainerRequestContext reqContext, ContainerResponseContext rspContext) throws IOException {
-        if (!uriInfo.getRequestUri().getPath().endsWith("/filtered/stats")) {
+        final String path = uriInfo.getRequestUri().getPath();
+        
+        if (!path.endsWith("/filtered/stats")) {
             counter.incrementAndGet();
-        }
+            
+            if (path.endsWith("/headers/sse")) {
+                rspContext.setStatus(202);
+                rspContext.getHeaders().add("X-My-Header", "headers");
+                
+                final Message message = JAXRSUtils.getCurrentMessage().getExchange().getOutMessage();
+                final Map<String, List<String>> headers = Headers.getSetProtocolHeaders(message);
+                headers.put("X-My-ProtocolHeader", Collections.singletonList("protocol-headers"));
+            }
+        } 
     }
     
     public static int getInvocations() {

[cxf] 02/02: Recording .gitmergeinfo Changes

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f581fb864504ca2cee3f1be007a928ffacb6eebe
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Jun 26 20:26:52 2021 -0400

    Recording .gitmergeinfo Changes
---
 .gitmergeinfo | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.gitmergeinfo b/.gitmergeinfo
index 253dc87..fa24406 100644
--- a/.gitmergeinfo
+++ b/.gitmergeinfo
@@ -86,6 +86,7 @@ B fe058a4c83590e7a768e5be32c94622cbe1a3b6b
 M 011debd91b16215245e039309e620699042a9f4b
 M 0320ad320ba88a123a5296a8060d3ac1794009f6
 M 0c609dc1e242e4156ad55e10fa0699636da02ee9
+M 0dda1ec488fa7187c26913d7190430bccd108bc3
 M 0f30442f3acb82e9936d4b486e07f5c341c142d2
 M 12873b9257b5de85f819346ab2325738e3f80206
 M 12a70c867e88379c520c64882ca2b261b9e9559d
@@ -121,6 +122,7 @@ M 675006323cdc3d1f8c8fbe1f65c03f4884782401
 M 67d7e562c786e5cbe0d88f82832622e6f3e7131f
 M 689ec48d044a62627ca302da6b219cb292eee36e
 M 6a77819f4bc141fcddd53a36b178972f1f68fe97
+M 6d136a2635f0fe160bff6be1dcb8e52954dcbac3
 M 700cf3929763d551d9fac6c570c2560039c6238c
 M 70c7d6a1e3f23522609d58b72b61c52e3cbc919a
 M 752a8a2dafff76ed8098cd73f1e071ffa0514754
@@ -159,6 +161,7 @@ M c0ef051466d775c84ddb20a9a12025d4258fb18b
 M c1002628081169c9561135a55fed8851ef4b9fff
 M c2244fa94cd86e1bd1068f36d9fe2f88269f2a74
 M c2e6f351383602c5c40405049fb83a52a0b3ccff
+M c7786d4e78999cb08fd668b24a7fac480bf7b5e0
 M ca5d02bf9581a28971c8b8d021732972dce5377e
 M ccb76b7c2c02b0f295405fd9bb0b585544c40869
 M cf2f79a5de150773b8dd1c4975de7e679a6d4d17
@@ -169,8 +172,10 @@ M d7b4638bc19e24e5916eadfceab2bf2b909caa0a
 M d88202133e39bebdb966b6ccfed57e1ff9d73638
 M d8eb0627ec5e878ef58e16b387a36c4cf3d1457c
 M dd9e67bef536068ce3956b9b94e380e780e78ee8
+M ddc96849ddf45bde462497aac9150eace164c7ef
 M e0dbc85b5b3383c48fecb97ac11608d7b8c82cc5
 M e31815b50c433a91bac93871bec801c34df2ff57
+M e474ee7d98eb782d1729c1e363ec91706c346069
 M e47b201c3032f64082e9173c0f02d54698388c06
 M e671095fbb2576e6e5a01d860951c3aa84968c80
 M e775237e6dcb16b647d102bcbb3908d3e9fce1de