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;