1 /*
2  * Copyright 2002-2012 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.springframework.http;
18 
19 import java.net.URI;
20 import java.net.URISyntaxException;
21 import java.nio.charset.Charset;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Calendar;
25 import java.util.EnumSet;
26 import java.util.GregorianCalendar;
27 import java.util.List;
28 import java.util.Locale;
29 import java.util.TimeZone;
30 
31 import org.junit.Before;
32 import org.junit.Test;
33 
34 import static org.junit.Assert.*;
35 
36 /** @author Arjen Poutsma */
37 public class HttpHeadersTests {
38 
39 	private HttpHeaders headers;
40 
41 	@Before
setUp()42 	public void setUp() {
43 		headers = new HttpHeaders();
44 	}
45 
46 	@Test
accept()47 	public void accept() {
48 		MediaType mediaType1 = new MediaType("text", "html");
49 		MediaType mediaType2 = new MediaType("text", "plain");
50 		List<MediaType> mediaTypes = new ArrayList<MediaType>(2);
51 		mediaTypes.add(mediaType1);
52 		mediaTypes.add(mediaType2);
53 		headers.setAccept(mediaTypes);
54 		assertEquals("Invalid Accept header", mediaTypes, headers.getAccept());
55 		assertEquals("Invalid Accept header", "text/html, text/plain", headers.getFirst("Accept"));
56 	}
57 
58 	// SPR-9655
59 
60 	@Test
acceptiPlanet()61 	public void acceptiPlanet() {
62 		headers.add("Accept", "text/html");
63 		headers.add("Accept", "text/plain");
64 		List<MediaType> expected = Arrays.asList(new MediaType("text", "html"), new MediaType("text", "plain"));
65 		assertEquals("Invalid Accept header", expected, headers.getAccept());
66 	}
67 
68 	@Test
acceptCharsets()69 	public void acceptCharsets() {
70 		Charset charset1 = Charset.forName("UTF-8");
71 		Charset charset2 = Charset.forName("ISO-8859-1");
72 		List<Charset> charsets = new ArrayList<Charset>(2);
73 		charsets.add(charset1);
74 		charsets.add(charset2);
75 		headers.setAcceptCharset(charsets);
76 		assertEquals("Invalid Accept header", charsets, headers.getAcceptCharset());
77 		assertEquals("Invalid Accept header", "utf-8, iso-8859-1", headers.getFirst("Accept-Charset"));
78 	}
79 
80 	@Test
acceptCharsetWildcard()81 	public void acceptCharsetWildcard() {
82 		headers.set("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
83 		assertEquals("Invalid Accept header", Arrays.asList(Charset.forName("ISO-8859-1"), Charset.forName("UTF-8")),
84 				headers.getAcceptCharset());
85 	}
86 
87 	@Test
allow()88 	public void allow() {
89 		EnumSet<HttpMethod> methods = EnumSet.of(HttpMethod.GET, HttpMethod.POST);
90 		headers.setAllow(methods);
91 		assertEquals("Invalid Allow header", methods, headers.getAllow());
92 		assertEquals("Invalid Allow header", "GET,POST", headers.getFirst("Allow"));
93 	}
94 
95 	@Test
contentLength()96 	public void contentLength() {
97 		long length = 42L;
98 		headers.setContentLength(length);
99 		assertEquals("Invalid Content-Length header", length, headers.getContentLength());
100 		assertEquals("Invalid Content-Length header", "42", headers.getFirst("Content-Length"));
101 	}
102 
103 	@Test
contentType()104 	public void contentType() {
105 		MediaType contentType = new MediaType("text", "html", Charset.forName("UTF-8"));
106 		headers.setContentType(contentType);
107 		assertEquals("Invalid Content-Type header", contentType, headers.getContentType());
108 		assertEquals("Invalid Content-Type header", "text/html;charset=UTF-8", headers.getFirst("Content-Type"));
109 	}
110 
111 	@Test
location()112 	public void location() throws URISyntaxException {
113 		URI location = new URI("http://www.example.com/hotels");
114 		headers.setLocation(location);
115 		assertEquals("Invalid Location header", location, headers.getLocation());
116 		assertEquals("Invalid Location header", "http://www.example.com/hotels", headers.getFirst("Location"));
117 	}
118 
119 	@Test
eTag()120 	public void eTag() {
121 		String eTag = "\"v2.6\"";
122 		headers.setETag(eTag);
123 		assertEquals("Invalid ETag header", eTag, headers.getETag());
124 		assertEquals("Invalid ETag header", "\"v2.6\"", headers.getFirst("ETag"));
125 	}
126 
127 	@Test(expected = IllegalArgumentException.class)
illegalETag()128 	public void illegalETag() {
129 		String eTag = "v2.6";
130 		headers.setETag(eTag);
131 		assertEquals("Invalid ETag header", eTag, headers.getETag());
132 		assertEquals("Invalid ETag header", "\"v2.6\"", headers.getFirst("ETag"));
133 	}
134 
135 	@Test
ifNoneMatch()136 	public void ifNoneMatch() {
137 		String ifNoneMatch = "\"v2.6\"";
138 		headers.setIfNoneMatch(ifNoneMatch);
139 		assertEquals("Invalid If-None-Match header", ifNoneMatch, headers.getIfNoneMatch().get(0));
140 		assertEquals("Invalid If-None-Match header", "\"v2.6\"", headers.getFirst("If-None-Match"));
141 	}
142 
143 	@Test
ifNoneMatchList()144 	public void ifNoneMatchList() {
145 		String ifNoneMatch1 = "\"v2.6\"";
146 		String ifNoneMatch2 = "\"v2.7\"";
147 		List<String> ifNoneMatchList = new ArrayList<String>(2);
148 		ifNoneMatchList.add(ifNoneMatch1);
149 		ifNoneMatchList.add(ifNoneMatch2);
150 		headers.setIfNoneMatch(ifNoneMatchList);
151 		assertEquals("Invalid If-None-Match header", ifNoneMatchList, headers.getIfNoneMatch());
152 		assertEquals("Invalid If-None-Match header", "\"v2.6\", \"v2.7\"", headers.getFirst("If-None-Match"));
153 	}
154 
155 	@Test
date()156 	public void date() {
157 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
158 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
159 		long date = calendar.getTimeInMillis();
160 		headers.setDate(date);
161 		assertEquals("Invalid Date header", date, headers.getDate());
162 		assertEquals("Invalid Date header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("date"));
163 
164 		// RFC 850
165 		headers.set("Date", "Thursday, 18-Dec-08 11:20:00 CET");
166 		assertEquals("Invalid Date header", date, headers.getDate());
167 	}
168 
169 	@Test(expected = IllegalArgumentException.class)
dateInvalid()170 	public void dateInvalid() {
171 		headers.set("Date", "Foo Bar Baz");
172 		headers.getDate();
173 	}
174 
175 	@Test
dateOtherLocale()176 	public void dateOtherLocale() {
177 		Locale defaultLocale = Locale.getDefault();
178 		try {
179 			Locale.setDefault(new Locale("nl", "nl"));
180 			Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
181 			calendar.setTimeZone(TimeZone.getTimeZone("CET"));
182 			long date = calendar.getTimeInMillis();
183 			headers.setDate(date);
184 			assertEquals("Invalid Date header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("date"));
185 			assertEquals("Invalid Date header", date, headers.getDate());
186 		}
187 		finally {
188 			Locale.setDefault(defaultLocale);
189 		}
190 	}
191 
192 	@Test
lastModified()193 	public void lastModified() {
194 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
195 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
196 		long date = calendar.getTimeInMillis();
197 		headers.setLastModified(date);
198 		assertEquals("Invalid Last-Modified header", date, headers.getLastModified());
199 		assertEquals("Invalid Last-Modified header", "Thu, 18 Dec 2008 10:20:00 GMT",
200 				headers.getFirst("last-modified"));
201 	}
202 
203 	@Test
expires()204 	public void expires() {
205 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
206 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
207 		long date = calendar.getTimeInMillis();
208 		headers.setExpires(date);
209 		assertEquals("Invalid Expires header", date, headers.getExpires());
210 		assertEquals("Invalid Expires header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("expires"));
211 	}
212 
213 	@Test
ifModifiedSince()214 	public void ifModifiedSince() {
215 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
216 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
217 		long date = calendar.getTimeInMillis();
218 		headers.setIfModifiedSince(date);
219 		assertEquals("Invalid If-Modified-Since header", date, headers.getIfNotModifiedSince());
220 		assertEquals("Invalid If-Modified-Since header", "Thu, 18 Dec 2008 10:20:00 GMT",
221 				headers.getFirst("if-modified-since"));
222 	}
223 
224 	@Test
pragma()225 	public void pragma() {
226 		String pragma = "no-cache";
227 		headers.setPragma(pragma);
228 		assertEquals("Invalid Pragma header", pragma, headers.getPragma());
229 		assertEquals("Invalid Pragma header", "no-cache", headers.getFirst("pragma"));
230 	}
231 
232 	@Test
cacheControl()233 	public void cacheControl() {
234 		String cacheControl = "no-cache";
235 		headers.setCacheControl(cacheControl);
236 		assertEquals("Invalid Cache-Control header", cacheControl, headers.getCacheControl());
237 		assertEquals("Invalid Cache-Control header", "no-cache", headers.getFirst("cache-control"));
238 	}
239 
240 	@Test
contentDisposition()241 	public void contentDisposition() {
242 		headers.setContentDispositionFormData("name", null);
243 		assertEquals("Invalid Content-Disposition header", "form-data; name=\"name\"",
244 				headers.getFirst("Content-Disposition"));
245 
246 		headers.setContentDispositionFormData("name", "filename");
247 		assertEquals("Invalid Content-Disposition header", "form-data; name=\"name\"; filename=\"filename\"",
248 				headers.getFirst("Content-Disposition"));
249 	}
250 
251 
252 }
253