/*
* Copyright 2015 The Netty Project
*
* The Netty Project 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 io.netty.handler.codec.http;
import io.netty.handler.codec.http.HttpHeadersTestUtils.HeaderValue;
import io.netty.util.AsciiString;
import io.netty.util.internal.StringUtil;
import org.junit.Test;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import static io.netty.handler.codec.http.HttpHeadersTestUtils.of;
import static io.netty.util.AsciiString.contentEquals;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class DefaultHttpHeadersTest {
private static final CharSequence HEADER_NAME = "testHeader";
@Test(expected = IllegalArgumentException.class)
public void nullHeaderNameNotAllowed() {
new DefaultHttpHeaders().add(null, "foo");
}
@Test(expected = IllegalArgumentException.class)
public void emptyHeaderNameNotAllowed() {
new DefaultHttpHeaders().add(StringUtil.EMPTY_STRING, "foo");
}
@Test
public void keysShouldBeCaseInsensitive() {
DefaultHttpHeaders headers = new DefaultHttpHeaders();
headers.add(of("Name"), of("value1"));
headers.add(of("name"), of("value2"));
headers.add(of("NAME"), of("value3"));
assertEquals(3, headers.size());
List<String> values = asList("value1", "value2", "value3");
assertEquals(values, headers.getAll(of("NAME")));
assertEquals(values, headers.getAll(of("name")));
assertEquals(values, headers.getAll(of("Name")));
assertEquals(values, headers.getAll(of("nAmE")));
}
@Test
public void keysShouldBeCaseInsensitiveInHeadersEquals() {
DefaultHttpHeaders headers1 = new DefaultHttpHeaders();
headers1.add(of("name1"), Arrays.asList("value1", "value2", "value3"));
headers1.add(of("nAmE2"), of("value4"));
DefaultHttpHeaders headers2 = new DefaultHttpHeaders();
headers2.add(of("naMe1"), Arrays.asList("value1", "value2", "value3"));
headers2.add(of("NAME2"), of("value4"));
assertEquals(headers1, headers1);
assertEquals(headers2, headers2);
assertEquals(headers1, headers2);
assertEquals(headers2, headers1);
assertEquals(headers1.hashCode(), headers2.hashCode());
}
@Test
public void testStringKeyRetrievedAsAsciiString() {
final HttpHeaders headers = new DefaultHttpHeaders(false);
// Test adding String key and retrieving it using a AsciiString key
final String connection = "keep-alive";
headers.add(of("Connection"), connection);
// Passes
final String value = headers.getAsString(HttpHeaderNames.CONNECTION.toString());
assertNotNull(value);
assertEquals(connection, value);
// Passes
final String value2 = headers.getAsString(HttpHeaderNames.CONNECTION);
assertNotNull(value2);
assertEquals(connection, value2);
}
@Test
public void testAsciiStringKeyRetrievedAsString() {
final HttpHeaders headers = new DefaultHttpHeaders(false);
// Test adding AsciiString key and retrieving it using a String key
final String cacheControl = "no-cache";
headers.add(HttpHeaderNames.CACHE_CONTROL, cacheControl);
final String value = headers.getAsString(HttpHeaderNames.CACHE_CONTROL);
assertNotNull(value);
assertEquals(cacheControl, value);
final String value2 = headers.getAsString(HttpHeaderNames.CACHE_CONTROL.toString());
assertNotNull(value2);
assertEquals(cacheControl, value2);
}
@Test
public void testRemoveTransferEncodingIgnoreCase() {
HttpMessage message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
message.headers().set(HttpHeaderNames.TRANSFER_ENCODING, "Chunked");
assertFalse(message.headers().isEmpty());
HttpUtil.setTransferEncodingChunked(message, false);
assertTrue(message.headers().isEmpty());
}
// Test for https://github.com/netty/netty/issues/1690
@Test
public void testGetOperations() {
HttpHeaders headers = new DefaultHttpHeaders();
headers.add(of("Foo"), of("1"));
headers.add(of("Foo"), of("2"));
assertEquals("1", headers.get(of("Foo")));
List<String> values = headers.getAll(of("Foo"));
assertEquals(2, values.size());
assertEquals("1", values.get(0));
assertEquals("2", values.get(1));
}
@Test
public void testEqualsIgnoreCase() {
assertThat(AsciiString.contentEqualsIgnoreCase(null, null), is(true));
assertThat(AsciiString.contentEqualsIgnoreCase(null, "foo"), is(false));
assertThat(AsciiString.contentEqualsIgnoreCase("bar", null), is(false));
assertThat(AsciiString.contentEqualsIgnoreCase("FoO", "fOo"), is(true));
}
@Test(expected = NullPointerException.class)
public void testSetNullHeaderValueValidate() {
HttpHeaders headers = new DefaultHttpHeaders(true);
headers.set(of("test"), (CharSequence) null);
}
@Test(expected = NullPointerException.class)
public void testSetNullHeaderValueNotValidate() {
HttpHeaders headers = new DefaultHttpHeaders(false);
headers.set(of("test"), (CharSequence) null);
}
@Test
public void addCharSequences() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.add(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void addIterable() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.add(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void addObjects() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.add(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void setCharSequences() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.set(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void setIterable() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.set(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void setObjectObjects() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.set(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
@Test
public void setObjectIterable() {
final DefaultHttpHeaders headers = newDefaultDefaultHttpHeaders();
headers.set(HEADER_NAME, HeaderValue.THREE.asList());
assertDefaultValues(headers, HeaderValue.THREE);
}
private static void assertDefaultValues(final DefaultHttpHeaders headers, final HeaderValue headerValue) {
assertTrue(contentEquals(headerValue.asList().get(0), headers.get(HEADER_NAME)));
List<CharSequence> expected = headerValue.asList();
List<String> actual = headers.getAll(HEADER_NAME);
assertEquals(expected.size(), actual.size());
Iterator<CharSequence> eItr = expected.iterator();
Iterator<String> aItr = actual.iterator();
while (eItr.hasNext()) {
assertTrue(contentEquals(eItr.next(), aItr.next()));
}
}
private static DefaultHttpHeaders newDefaultDefaultHttpHeaders() {
return new DefaultHttpHeaders(true);
}
}