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 1061676c9b81461d82ce890b0178fa9f9432de05 Author: Andriy Redko <[email protected]> AuthorDate: Wed Feb 16 10:26:19 2022 -0500 CXF-8657: Headers are copied as case sensitive in MessageContextImpl (#907) (cherry picked from commit b03bfd13355a2058ea7b072f73558360fab12101) (cherry picked from commit 599ce5123b5c8d3284c38461c10845a171500005) --- .../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;
