/*
* Copyright 2002-2016 the original author or authors.
*
* Licensed 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.springframework.integration.http.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.integration.mapping.HeaderMapper;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.util.StopWatch;
/**
* @author Oleg Zhurakousky
* @author Mark Fisher
* @author Gunnar Hillert
* @author Artem Bilan
* @since 2.0.1
*/
public class DefaultHttpHeaderMapperFromMessageOutboundTests {
// ACCEPT tests
@Test(expected = IllegalArgumentException.class)
public void validateAcceptHeaderWithNoSlash() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", "bar");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
}
@Test
public void validateAcceptHeaderSingleString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", "bar/foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("bar", headers.getAccept().get(0).getType());
assertEquals("foo", headers.getAccept().get(0).getSubtype());
}
@Test
public void validateAcceptHeaderSingleMediaType() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", new MediaType("bar", "foo"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("bar", headers.getAccept().get(0).getType());
assertEquals("foo", headers.getAccept().get(0).getSubtype());
}
@Test
public void validateAcceptHeaderMultipleAsDelimitedString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", "bar/foo, text/xml");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAccept().size());
assertEquals("bar/foo", headers.getAccept().get(0).toString());
assertEquals("text/xml", headers.getAccept().get(1).toString());
}
@Test
public void validateAcceptHeaderMultipleAsStringArray() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", new String[] {"bar/foo", "text/xml"});
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAccept().size());
assertEquals("bar/foo", headers.getAccept().get(0).toString());
assertEquals("text/xml", headers.getAccept().get(1).toString());
}
@Test
public void validateAcceptHeaderMultipleAsStringCollection() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", Arrays.asList("bar/foo", "text/xml"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAccept().size());
assertEquals("bar/foo", headers.getAccept().get(0).toString());
assertEquals("text/xml", headers.getAccept().get(1).toString());
}
@Test
public void validateAcceptHeaderMultipleAsStringCollectionCaseInsensitive() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("acCePt", Arrays.asList("bar/foo", "text/xml"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAccept().size());
assertEquals("bar/foo", headers.getAccept().get(0).toString());
assertEquals("text/xml", headers.getAccept().get(1).toString());
}
@Test
public void validateAcceptHeaderMultipleAsMediatypeCollection() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept", Arrays.asList(new MediaType("bar", "foo"), new MediaType("text", "xml")));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAccept().size());
assertEquals("bar/foo", headers.getAccept().get(0).toString());
assertEquals("text/xml", headers.getAccept().get(1).toString());
}
// ACCEPT_CHARSET tests
@Test(expected = UnsupportedCharsetException.class)
public void validateAcceptCharsetHeaderWithWrongCharset() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
}
@Test
public void validateAcceptCharsetHeaderSingleString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", "UTF-8");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(1, headers.getAcceptCharset().size());
assertEquals("UTF-8", headers.getAcceptCharset().get(0).displayName());
}
@Test
public void validateAcceptCharsetHeaderSingleCharset() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", Charset.forName("UTF-8"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(1, headers.getAcceptCharset().size());
assertEquals("UTF-8", headers.getAcceptCharset().get(0).displayName());
}
@Test
public void validateAcceptCharsetHeaderMultipleAsDelimitedString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", "UTF-8, ISO-8859-1");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAcceptCharset().size());
// validate contains since the order is not enforced
assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8")));
assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1")));
}
@Test
public void validateAcceptCharsetHeaderMultipleAsStringArray() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", new String[] {"UTF-8", "ISO-8859-1"});
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAcceptCharset().size());
// validate contains since the order is not enforced
assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8")));
assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1")));
}
@Test
public void validateAcceptCharsetHeaderMultipleAsCharsetArray() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", new Charset[] {Charset.forName("UTF-8"), Charset.forName("ISO-8859-1")});
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAcceptCharset().size());
// validate contains since the order is not enforced
assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8")));
assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1")));
}
@Test
public void validateAcceptCharsetHeaderMultipleAsCollectionOfStrings() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", Arrays.asList("UTF-8", "ISO-8859-1"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAcceptCharset().size());
// validate contains since the order is not enforced
assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8")));
assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1")));
}
@Test
public void validateAcceptCharsetHeaderMultipleAsCollectionOfCharsets() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Accept-Charset", Arrays.asList(Charset.forName("UTF-8"), Charset.forName("ISO-8859-1")));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getAcceptCharset().size());
// validate contains since the order is not enforced
assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8")));
assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1")));
}
// Cache-Control tests
@Test
public void validateCacheControl() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Cache-Control", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("foo", headers.getCacheControl());
}
// Content-Length tests
@Test
public void validateContentLengthAsString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Content-Length", "1");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(1, headers.getContentLength());
}
@Test
public void validateContentLengthAsNumber() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Content-Length", 1);
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(1, headers.getContentLength());
}
@Test(expected = NumberFormatException.class)
public void validateContentLengthAsNonNumericString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Content-Length", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
}
// Content-Type test
@Test(expected = IllegalArgumentException.class)
public void validateContentTypeWrongValue() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put(MessageHeaders.CONTENT_TYPE, "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
}
@Test
public void validateContentTypeAsString() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Content-Type", "text/html");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("text", headers.getContentType().getType());
assertEquals("html", headers.getContentType().getSubtype());
}
@Test
public void validateContentTypeAsMediaType() {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put(MessageHeaders.CONTENT_TYPE, new MediaType("text", "html"));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("text", headers.getContentType().getType());
assertEquals("html", headers.getContentType().getSubtype());
}
// Date test
@Test
public void validateDateAsNumber() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Date", 12345678);
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate());
}
@Test
public void validateDateAsString() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Date", "12345678");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate());
}
@Test
public void validateDateAsDate() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Date", new Date(12345678));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate());
}
// If-Modified-Since tests
@Test
public void validateIfModifiedSinceAsNumber() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-Modified-Since", 12345678);
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfModifiedSince());
}
@Test
public void validateIfModifiedSinceAsString() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-Modified-Since", "12345678");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfModifiedSince());
}
@Test
public void validateIfModifiedSinceAsDate() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-Modified-Since", new Date(12345678));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfModifiedSince());
}
// If-None-Match
@Test
public void validateIfNoneMatch() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-None-Match", "\"1234567\"");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(1, headers.getIfNoneMatch().size());
assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0));
}
@Test
public void validateIfNoneMatchAsDelimitedString() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-None-Match", "\"123,4567\", \"123\"");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getIfNoneMatch().size());
assertEquals("\"123,4567\"", headers.getIfNoneMatch().get(0));
assertEquals("\"123\"", headers.getIfNoneMatch().get(1));
}
@Test
public void validateIfNoneMatchAsStringArray() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-None-Match", new String[] {"\"1234567\"", "\"123\""});
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getIfNoneMatch().size());
assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0));
assertEquals("\"123\"", headers.getIfNoneMatch().get(1));
}
@Test
public void validateIfNoneMatchAsCommaDelimitedString() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-None-Match", "\"123.4567\", \"123\"");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getIfNoneMatch().size());
assertEquals("\"123.4567\"", headers.getIfNoneMatch().get(0));
assertEquals("\"123\"", headers.getIfNoneMatch().get(1));
}
@Test
public void validateIfNoneMatchAsStringCollection() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("If-None-Match", Arrays.asList("\"1234567\"", "\"123\""));
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(2, headers.getIfNoneMatch().size());
assertEquals("\"1234567\"", headers.getIfNoneMatch().get(0));
assertEquals("\"123\"", headers.getIfNoneMatch().get(1));
}
// Pragma tests
@Test
public void validatePragma() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Pragma", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals("foo", headers.getPragma());
}
// Transfer-Encoding tests
@Test
public void validateTransferEncoding() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Transfer-Encoding", "chunked");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertNull(headers.get("Transfer-Encoding"));
}
@Test
public void validateTransferEncodingToHeaders() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Transfer-Encoding", "chunked");
Map<String, ?> messageHeaders = mapper.toHeaders(httpHeaders);
assertEquals(1, messageHeaders.size());
}
@Test
@Ignore
public void perf() throws ParseException {
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Transfer-Encoding", "chunked");
httpHeaders.set("X-Transfer-Encoding1", "chunked");
httpHeaders.set("X-Transfer-Encoding2", "chunked");
httpHeaders.set("X-Transfer-Encoding3", "chunked");
httpHeaders.set("X-Transfer-Encoding4", "chunked");
httpHeaders.set("X-Transfer-Encoding5", "chunked");
httpHeaders.set("X-Transfer-Encoding6", "chunked");
httpHeaders.set("X-Transfer-Encoding7", "chunked");
StopWatch watch = new StopWatch();
watch.start();
for (int i = 0; i < 100000; i++) {
mapper.toHeaders(httpHeaders);
}
watch.stop();
}
// Custom headers
@Test
public void validateCustomHeaderWithNoHeaderNames() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("foo", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertNull(headers.get("foo"));
assertNull(headers.get("X-foo"));
}
@Test
public void validateCustomHeaderWithHeaderNames() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setOutboundHeaderNames(new String[] {"foo"});
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("foo", "foo");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertNull(headers.get("X-foo"));
assertNotNull(headers.get("foo"));
assertTrue(headers.get("foo").size() == 1);
assertEquals("foo", headers.get("foo").get(0));
}
@Test
public void validateCustomHeaderWithHeaderNamePatterns() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setOutboundHeaderNames(new String[] {"x*", "*z", "a*f"});
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("x1", "x1-value");
messageHeaders.put("1x", "1x-value");
messageHeaders.put("z1", "z1-value");
messageHeaders.put("1z", "1z-value");
messageHeaders.put("abc", "abc-value");
messageHeaders.put("def", "def-value");
messageHeaders.put("abcdef", "abcdef-value");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(3, headers.size());
assertNull(headers.get("1x"));
assertNull(headers.get("z1"));
assertNull(headers.get("abc"));
assertNull(headers.get("def"));
assertEquals(1, headers.get("x1").size());
assertEquals("x1-value", headers.getFirst("x1"));
assertEquals(1, headers.get("1z").size());
assertEquals("1z-value", headers.getFirst("1z"));
assertEquals(1, headers.get("abcdef").size());
assertEquals("abcdef-value", headers.getFirst("abcdef"));
}
@Test
public void validateCustomHeaderWithHeaderNamePatternsAndStandardRequestHeaders() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setOutboundHeaderNames(new String[] {"foo*", "HTTP_REQUEST_HEADERS"});
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("foobar", "abc");
messageHeaders.put("Content-Type", "text/html");
messageHeaders.put("Accept", "text/xml");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(3, headers.size());
assertEquals(1, headers.get("foobar").size());
assertEquals("abc", headers.getFirst("foobar"));
assertEquals("text/html", headers.getContentType().toString());
assertEquals(1, headers.getAccept().size());
assertEquals(MediaType.TEXT_XML, headers.getAccept().get(0));
}
@Test
public void validateCustomHeaderWithHeaderNamePatternsAndStandardResponseHeaders() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setInboundHeaderNames(new String[] {"foo*", "HTTP_RESPONSE_HEADERS"});
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("foobar", "abc");
httpHeaders.setContentType(MediaType.TEXT_HTML);
httpHeaders.setAccept(Collections.singletonList(MediaType.TEXT_HTML));
Map<String, ?> messageHeaders = mapper.toHeaders(httpHeaders);
assertEquals(2, messageHeaders.size());
assertNull(messageHeaders.get("Accept"));
assertEquals("abc", messageHeaders.get("foobar"));
assertEquals("text/html", messageHeaders.get(MessageHeaders.CONTENT_TYPE).toString());
}
@Test
public void validateCustomHeaderWithStandardPrefix() throws Exception {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setInboundHeaderNames(new String[] {"X-Foo"});
HttpHeaders headers = new HttpHeaders();
headers.set("x-foo", "x-foo-value");
Map<String, ?> result = mapper.toHeaders(headers);
assertEquals(1, result.size());
assertEquals("x-foo-value", result.get("x-foo"));
}
@Test
public void validateCustomHeaderWithStandardPrefixSameCase() throws Exception {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setInboundHeaderNames(new String[] {"X-Foo"});
HttpHeaders headers = new HttpHeaders();
headers.set("X-Foo", "x-foo-value");
Map<String, ?> result = mapper.toHeaders(headers);
assertEquals(1, result.size());
assertEquals("x-foo-value", result.get("X-Foo"));
}
@Test
public void validateCustomHeaderCaseInsensitivity() throws ParseException {
DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();
mapper.setOutboundHeaderNames(new String[] {"*", "HTTP_REQUEST_HEADERS"});
mapper.setUserDefinedHeaderPrefix("X-");
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("foobar", "abc");
messageHeaders.put("X-bar", "xbar");
messageHeaders.put("x-baz", "xbaz");
messageHeaders.put("Content-Type", "text/html");
messageHeaders.put("Accept", "text/xml");
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertEquals(5, headers.size());
assertEquals(1, headers.get("X-foobar").size());
assertEquals(1, headers.get("x-foobar").size());
assertEquals(1, headers.get("X-bar").size());
assertEquals(1, headers.get("x-bar").size());
assertEquals(1, headers.get("X-baz").size());
assertEquals(1, headers.get("x-baz").size());
}
@Test
public void dontPropagateContentLength() {
DefaultHttpHeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper();
// not suppressed on outbound request, by default
mapper.setExcludedOutboundStandardRequestHeaderNames(new String[] {"Content-Length"});
Map<String, Object> messageHeaders = new HashMap<String, Object>();
messageHeaders.put("Content-Length", 4);
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(new MessageHeaders(messageHeaders), headers);
assertNull(headers.get("Content-Length"));
}
@Test
public void testInt3063InvalidExpiresHeader() {
HttpHeaders headers = new HttpHeaders();
headers.set("Expires", "-1");
Map<String, Object> messageHeaders = DefaultHttpHeaderMapper.outboundMapper().toHeaders(headers);
assertEquals(0, messageHeaders.size());
}
@Test
public void testInt2995IfModifiedSince() throws Exception {
Date ifModifiedSince = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
String value = dateFormat.format(ifModifiedSince);
Message<?> testMessage = MessageBuilder.withPayload("foo").setHeader("If-Modified-Since", value).build();
HeaderMapper<HttpHeaders> mapper = DefaultHttpHeaderMapper.outboundMapper();
HttpHeaders headers = new HttpHeaders();
mapper.fromHeaders(testMessage.getHeaders(), headers);
Calendar c = Calendar.getInstance();
c.setTime(ifModifiedSince);
c.set(Calendar.MILLISECOND, 0);
assertEquals(c.getTimeInMillis(), headers.getIfModifiedSince());
}
@Test
public void testContentDispositionHeader() throws Exception {
HttpHeaders headers = new HttpHeaders();
String headerValue = "attachment; filename=\"test.txt\"";
headers.set("Content-Disposition", headerValue);
Map<String, Object> messageHeaders = DefaultHttpHeaderMapper.outboundMapper().toHeaders(headers);
assertEquals(1, messageHeaders.size());
assertEquals(headerValue, messageHeaders.get("Content-Disposition"));
}
}