/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.cxf.common.header; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.camel.Exchange; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.impl.DefaultHeaderFilterStrategy; import org.apache.cxf.endpoint.Client; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.message.Message; import org.junit.Assert; import org.junit.Test; public class CxfHeaderHelperTest extends Assert { private DefaultCamelContext context = new DefaultCamelContext(); @Test public void testPropagateCamelToCxf() { Exchange exchange = new DefaultExchange(context); exchange.getIn().setHeader("soapAction", "urn:hello:world"); exchange.getIn().setHeader("MyFruitHeader", "peach"); exchange.getIn().setHeader("MyBrewHeader", Arrays.asList("cappuccino", "espresso")); exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "text/xml"); exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, "200"); exchange.getIn().setHeader(Exchange.HTTP_URI, "/hello/cxf"); exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET"); exchange.getIn().setHeader(Exchange.HTTP_PATH, "/hello/cxf"); Map<String, Object> requestContext = Collections.singletonMap("request", "true"); Map<String, Object> responseContext = Collections.singletonMap("response", "true"); exchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext); exchange.getIn().setHeader(Client.RESPONSE_CONTEXT, responseContext); org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl(); CxfHeaderHelper.propagateCamelToCxf(new DefaultHeaderFilterStrategy(), exchange.getIn().getHeaders(), cxfMessage, exchange); assertEquals("text/xml", cxfMessage.get(Message.CONTENT_TYPE)); assertEquals("200", cxfMessage.get(Message.RESPONSE_CODE)); assertEquals(requestContext, cxfMessage.get(Client.REQUEST_CONTEXT)); assertEquals(responseContext, cxfMessage.get(Client.RESPONSE_CONTEXT)); assertNull(cxfMessage.get(Exchange.HTTP_RESPONSE_CODE)); // check the protocol headers Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfMessage.get(org.apache.cxf.message.Message.PROTOCOL_HEADERS)); assertNotNull(cxfHeaders); assertTrue(cxfHeaders.size() == 7); verifyHeader(cxfHeaders, "soapaction", "urn:hello:world"); verifyHeader(cxfHeaders, "SoapAction", "urn:hello:world"); verifyHeader(cxfHeaders, "SOAPAction", "urn:hello:world"); verifyHeader(cxfHeaders, "myfruitheader", "peach"); verifyHeader(cxfHeaders, "myFruitHeader", "peach"); verifyHeader(cxfHeaders, "MYFRUITHEADER", "peach"); verifyHeader(cxfHeaders, "MyBrewHeader", Arrays.asList("cappuccino", "espresso")); verifyHeader(cxfHeaders, Message.CONTENT_TYPE, "text/xml"); verifyHeader(cxfHeaders, Message.REQUEST_URI, "/hello/cxf"); verifyHeader(cxfHeaders, Message.HTTP_REQUEST_METHOD, "GET"); verifyHeader(cxfHeaders, Message.PATH_INFO, "/hello/cxf"); assertNull(cxfHeaders.get(Exchange.HTTP_RESPONSE_CODE)); assertNull(cxfHeaders.get(Exchange.HTTP_URI)); assertNull(cxfHeaders.get(Exchange.HTTP_METHOD)); assertNull(cxfHeaders.get(Exchange.HTTP_PATH)); } @Test public void testPropagateCxfToCamel() { Exchange exchange = new DefaultExchange(context); org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl(); Map<String, List<String>> cxfHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); cxfHeaders.put("Content-Length", Arrays.asList("241")); cxfHeaders.put("soapAction", Arrays.asList("urn:hello:world")); cxfHeaders.put("myfruitheader", Arrays.asList("peach")); cxfHeaders.put("mybrewheader", Arrays.asList("cappuccino", "espresso")); cxfHeaders.put(Message.CONTENT_TYPE, Arrays.asList("text/xml")); cxfHeaders.put(Message.ENCODING, Arrays.asList("UTF-8")); cxfHeaders.put(Message.RESPONSE_CODE, Arrays.asList("201")); // Ignored cxfHeaders.put(Message.REQUEST_URI, Arrays.asList("/base/hello/cxf")); cxfHeaders.put(Message.HTTP_REQUEST_METHOD, Arrays.asList("GET")); cxfHeaders.put(Message.PATH_INFO, Arrays.asList("/base/hello/cxf")); cxfHeaders.put(Message.BASE_PATH, Arrays.asList("/base")); cxfMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, cxfHeaders); cxfMessage.put(Message.RESPONSE_CODE, "200"); Map<String, Object> requestContext = Collections.singletonMap("request", "true"); Map<String, Object> responseContext = Collections.singletonMap("response", "true"); cxfMessage.put(Client.REQUEST_CONTEXT, requestContext); cxfMessage.put(Client.RESPONSE_CONTEXT, responseContext); CxfHeaderHelper.propagateCxfToCamel(new DefaultHeaderFilterStrategy(), cxfMessage, exchange.getIn(), exchange); Map<String, Object> camelHeaders = exchange.getIn().getHeaders(); assertEquals("urn:hello:world", camelHeaders.get("soapaction")); assertEquals("urn:hello:world", camelHeaders.get("SoapAction")); assertEquals("241", camelHeaders.get("content-length")); assertEquals("peach", camelHeaders.get("MyFruitHeader")); assertEquals(Arrays.asList("cappuccino", "espresso"), camelHeaders.get("MyBrewHeader")); assertEquals("text/xml; charset=UTF-8", camelHeaders.get(Exchange.CONTENT_TYPE)); assertEquals("/base/hello/cxf", camelHeaders.get(Exchange.HTTP_URI)); assertEquals("GET", camelHeaders.get(Exchange.HTTP_METHOD)); assertEquals("/hello/cxf", camelHeaders.get(Exchange.HTTP_PATH)); assertEquals("200", camelHeaders.get(Exchange.HTTP_RESPONSE_CODE)); assertEquals(requestContext, camelHeaders.get(Client.REQUEST_CONTEXT)); assertEquals(responseContext, camelHeaders.get(Client.RESPONSE_CONTEXT)); assertNull(camelHeaders.get(Message.RESPONSE_CODE)); assertNull(camelHeaders.get(Message.REQUEST_URI)); assertNull(camelHeaders.get(Message.HTTP_REQUEST_METHOD)); assertNull(camelHeaders.get(Message.PATH_INFO)); assertNull(camelHeaders.get(Message.RESPONSE_CODE)); } @Test public void testPropagateCxfToCamelWithMerged() { Exchange exchange = new DefaultExchange(context); exchange.setProperty(CxfConstants.CAMEL_CXF_PROTOCOL_HEADERS_MERGED, Boolean.TRUE); org.apache.cxf.message.Message cxfMessage = new org.apache.cxf.message.MessageImpl(); Map<String, List<String>> cxfHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); cxfHeaders.put("myfruitheader", Arrays.asList("peach")); cxfHeaders.put("mybrewheader", Arrays.asList("cappuccino", "espresso")); cxfMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, cxfHeaders); CxfHeaderHelper.propagateCxfToCamel(new DefaultHeaderFilterStrategy(), cxfMessage, exchange.getIn(), exchange); Map<String, Object> camelHeaders = exchange.getIn().getHeaders(); assertEquals("peach", camelHeaders.get("MyFruitHeader")); assertEquals("cappuccino, espresso", camelHeaders.get("MyBrewHeader")); } private void verifyHeader(Map<String, List<String>> headers, String name, List<String> value) { List<String> values = headers.get(name); assertTrue("The entry must be available", values != null && values.size() == ((List<?>)value).size()); assertEquals("The value must match", value, values); } private void verifyHeader(Map<String, List<String>> headers, String name, String value) { List<String> values = headers.get(name); assertTrue("The entry must be available", values != null && values.size() == 1); assertEquals("The value must match", value, values.get(0)); } }