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 2022/02/16 15:26:31 UTC

[cxf] branch master updated: CXF-8657: Headers are copied as case sensitive in MessageContextImpl (#907)

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

reta 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 b03bfd1  CXF-8657: Headers are copied as case sensitive in MessageContextImpl (#907)
b03bfd1 is described below

commit b03bfd13355a2058ea7b072f73558360fab12101
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Wed Feb 16 10:26:19 2022 -0500

    CXF-8657: Headers are copied as case sensitive in MessageContextImpl (#907)
---
 .../apache/cxf/jaxrs/ext/MessageContextImpl.java   |  2 +-
 .../cxf/jaxrs/ext/MessageContextImplTest.java      | 54 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
index f421ca7..d2bdbd80 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
@@ -218,7 +218,7 @@ public class MessageContextImpl implements MessageContext {
         Attachment root = (Attachment)handlers.get(0);
 
         String rootContentType = root.getContentType().toString();
-        MultivaluedMap<String, String> rootHeaders = new MetadataMap<>(root.getHeaders());
+        MultivaluedMap<String, String> rootHeaders = new MetadataMap<>(root.getHeaders(), true, false, true);
         if (!AttachmentUtil.isMtomEnabled(outMessage)) {
             rootHeaders.putSingle(Message.CONTENT_TYPE, rootContentType);
         }
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/MessageContextImplTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/MessageContextImplTest.java
index ca73512..4a6c67f 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/MessageContextImplTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/ext/MessageContextImplTest.java
@@ -19,12 +19,20 @@
 
 package org.apache.cxf.jaxrs.ext;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collections;
+import java.util.UUID;
+
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Request;
 import javax.ws.rs.core.SecurityContext;
 import javax.ws.rs.core.UriInfo;
@@ -32,7 +40,10 @@ import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Providers;
 import javax.xml.bind.JAXBContext;
 
+import org.apache.cxf.binding.Binding;
 import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.jaxrs.ext.multipart.Attachment;
+import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
 import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
 import org.apache.cxf.jaxrs.impl.HttpServletRequestFilter;
 import org.apache.cxf.jaxrs.impl.HttpServletResponseFilter;
@@ -46,15 +57,20 @@ import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.ExchangeImpl;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.phase.PhaseInterceptorChain;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 
+import org.easymock.Capture;
 import org.easymock.EasyMock;
+import org.easymock.IAnswer;
 import org.junit.Test;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
 
 public class MessageContextImplTest {
 
@@ -197,6 +213,42 @@ public class MessageContextImplTest {
         MessageContext mc = new MessageContextImpl(createMessage());
         assertNull(mc.getContext(Message.class));
     }
+    
+    @Test
+    public void testAttachments() throws IOException {
+        final Message in = createMessage();
+        final MessageContext mc = new MessageContextImpl(in);
+        
+        try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
+            final Message out = new MessageImpl();
+            out.put(Message.CONTENT_TYPE, "image/png");
+            out.setContent(OutputStream.class, output);
+            out.setInterceptorChain(new PhaseInterceptorChain(Collections.emptySortedSet()));
+            in.getExchange().setOutMessage(out);
+            
+            final Binding binding = in.getExchange().getEndpoint().getBinding();
+            final Capture<Message> capture = Capture.newInstance();
+            EasyMock.expect(binding.createMessage(EasyMock.capture(capture)))
+                .andAnswer(
+                    new IAnswer<Message>() {
+                        @Override
+                        public Message answer() throws Throwable {
+                            return capture.getValue();
+                        }
+                    }
+                ).anyTimes();
+    
+            final String id = UUID.randomUUID().toString();
+            final MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();
+            // Headers should be case-insensitive
+            headers.add("Content-Id", id);
+            mc.put(MultipartBody.OUTBOUND_MESSAGE_ATTACHMENTS, 
+                Collections.singletonList(new Attachment(headers, new byte[0])));
+
+            output.flush();
+            assertThat(new String(output.toByteArray()), containsString("Content-ID: <" + id + ">"));
+        }
+    }
 
     private Message createMessage() {
         ProviderFactory factory = ServerProviderFactory.getInstance();
@@ -205,12 +257,14 @@ public class MessageContextImplTest {
         Exchange e = new ExchangeImpl();
         m.setExchange(e);
         e.setInMessage(m);
+        Binding binding = EasyMock.mock(Binding.class);
         Endpoint endpoint = EasyMock.mock(Endpoint.class);
         EasyMock.expect(endpoint.getEndpointInfo()).andReturn(null).anyTimes();
         EasyMock.expect(endpoint.get(Application.class.getName())).andReturn(null);
         EasyMock.expect(endpoint.size()).andReturn(0).anyTimes();
         EasyMock.expect(endpoint.isEmpty()).andReturn(true).anyTimes();
         EasyMock.expect(endpoint.get(ServerProviderFactory.class.getName())).andReturn(factory).anyTimes();
+        EasyMock.expect(endpoint.getBinding()).andReturn(binding).anyTimes();
         EasyMock.replay(endpoint);
         e.put(Endpoint.class, endpoint);
         return m;