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 01:44:54 UTC

[cxf] branch 3.3.x-fixes updated (b0e7b5f -> 88b83af)

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

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


    from b0e7b5f  Upgrade BC from 1.68 to 1.69 (#820)
     new 935c35f  CXF-8559: SseInterceptor uses PROTOCOL_HEADERS from request (in) message, not from response (out) one (#821)
     new 88b83af  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] 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.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 88b83aff685276a17f01d51d78db6f4c709ab655
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Jun 26 21:30:19 2021 -0400

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

diff --git a/.gitmergeinfo b/.gitmergeinfo
index 2577403..1efef54 100644
--- a/.gitmergeinfo
+++ b/.gitmergeinfo
@@ -660,6 +660,7 @@ B f48870559bc15762c8392ead4a5ed4832fbc6d9c
 B f4f227be9a1c4f31817a62fad7fff382d3089621
 B f54062eb331fcf35d9f3a840f532417fccbb2673
 B f54f4b406ec6ef5eb66c72e258a50924c851f737
+B f581fb864504ca2cee3f1be007a928ffacb6eebe
 B f5a5855e44703ae98281c240888a129711d69284
 B f5f08c838e1d52f17bcc8422fac38831a63e6e30
 B f63582f4f39c76c2152ea67626b21326d81e6845
@@ -717,6 +718,7 @@ M 122460d1b2ecf406993104d4f5e0a8524b811a15
 M 12a70c867e88379c520c64882ca2b261b9e9559d
 M 12d2f091afde535edab04e56c9df026cc9aad743
 M 147a6b416bdfa52b0dace0684f0b83d6a7561ce2
+M 147b4e4d34ccff0e0a15dc69740682455abc7728
 M 14976f9896a89f00e22629420636991b2e0f95fa
 M 160f50ed9bd9391b61417716b3a67653c9e81a98
 M 1650f46bcf741f0bf713ab27ed33370747d051a7
@@ -769,7 +771,9 @@ M 33abf4131ccc46b4027dbbba1c0347445473c1ea
 M 34a8f691a1926a26d2ecefa527eaf76f68b98def
 M 34dcb8025369137794281606ad70db0530f18759
 M 356c0eca80991fa821e95326f6a8578fc018a017
+M 370843cd0e196f18b8747ed309bbd499c984e05a
 M 375b065fa6c6fdc73b2d137654f5b60cc3464793
+M 384c0fdba102eb58d8b05af26322c46bcde01be2
 M 39ff641f3d81d8e0b9487ae8c49ac2a5bf055bc1
 M 3b119ca6630f1384b93cd718d0cd95ccabc81e91
 M 3b21d2ba746fb1a78009f271f71eb0c2063e7430
@@ -883,6 +887,7 @@ M 940c3d58c109a5dd3bfb756e1a5d15b2558fbb1b
 M 954085421900efbf89643b5ab8f187a237e42eb4
 M 95c3c37092751b1d00b6f2c26642f18ebcbba878
 M 972a2755ca85ba86f473b0ce46f23bf6193ced62
+M 9840d212865770eca29cb4fee7cb7a467dddb61b
 M 9980b0472524e1010aaf7a4a3fe5ff072270efe3
 M 9a519e10a01cd84349a2bef807c2597ca46b4740
 M 9a5b4568a94a72569caf4d012a42df6ebbe02779

[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.3.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 935c35f4d144b06dad25d0fb5c08f0fe2d4b4baa
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)
    (cherry picked from commit 8890a6461e192addd395a2d22447423cdd6b189e)
---
 .../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() {