View Javadoc
1   /*
2    * Copyright 2002-2014 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.Collections;
26  import java.util.EnumSet;
27  import java.util.GregorianCalendar;
28  import java.util.List;
29  import java.util.Locale;
30  import java.util.TimeZone;
31  
32  import org.hamcrest.Matchers;
33  import org.junit.Before;
34  import org.junit.Test;
35  
36  import static org.junit.Assert.*;
37  
38  /**
39   * @author Arjen Poutsma
40   */
41  public class HttpHeadersTests {
42  
43  	private HttpHeaders headers;
44  
45  
46  	@Before
47  	public void setUp() {
48  		headers = new HttpHeaders();
49  	}
50  
51  
52  	@Test
53  	public void accept() {
54  		MediaType mediaType1 = new MediaType("text", "html");
55  		MediaType mediaType2 = new MediaType("text", "plain");
56  		List<MediaType> mediaTypes = new ArrayList<MediaType>(2);
57  		mediaTypes.add(mediaType1);
58  		mediaTypes.add(mediaType2);
59  		headers.setAccept(mediaTypes);
60  		assertEquals("Invalid Accept header", mediaTypes, headers.getAccept());
61  		assertEquals("Invalid Accept header", "text/html, text/plain", headers.getFirst("Accept"));
62  	}
63  
64  	@Test  // SPR-9655
65  	public void acceptiPlanet() {
66  		headers.add("Accept", "text/html");
67  		headers.add("Accept", "text/plain");
68  		List<MediaType> expected = Arrays.asList(new MediaType("text", "html"), new MediaType("text", "plain"));
69  		assertEquals("Invalid Accept header", expected, headers.getAccept());
70  	}
71  
72  	@Test
73  	public void acceptCharsets() {
74  		Charset charset1 = Charset.forName("UTF-8");
75  		Charset charset2 = Charset.forName("ISO-8859-1");
76  		List<Charset> charsets = new ArrayList<Charset>(2);
77  		charsets.add(charset1);
78  		charsets.add(charset2);
79  		headers.setAcceptCharset(charsets);
80  		assertEquals("Invalid Accept header", charsets, headers.getAcceptCharset());
81  		assertEquals("Invalid Accept header", "utf-8, iso-8859-1", headers.getFirst("Accept-Charset"));
82  	}
83  
84  	@Test
85  	public void acceptCharsetWildcard() {
86  		headers.set("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
87  		assertEquals("Invalid Accept header", Arrays.asList(Charset.forName("ISO-8859-1"), Charset.forName("UTF-8")),
88  				headers.getAcceptCharset());
89  	}
90  
91  	@Test
92  	public void allow() {
93  		EnumSet<HttpMethod> methods = EnumSet.of(HttpMethod.GET, HttpMethod.POST);
94  		headers.setAllow(methods);
95  		assertEquals("Invalid Allow header", methods, headers.getAllow());
96  		assertEquals("Invalid Allow header", "GET,POST", headers.getFirst("Allow"));
97  	}
98  
99  	@Test
100 	public void contentLength() {
101 		long length = 42L;
102 		headers.setContentLength(length);
103 		assertEquals("Invalid Content-Length header", length, headers.getContentLength());
104 		assertEquals("Invalid Content-Length header", "42", headers.getFirst("Content-Length"));
105 	}
106 
107 	@Test
108 	public void contentType() {
109 		MediaType contentType = new MediaType("text", "html", Charset.forName("UTF-8"));
110 		headers.setContentType(contentType);
111 		assertEquals("Invalid Content-Type header", contentType, headers.getContentType());
112 		assertEquals("Invalid Content-Type header", "text/html;charset=UTF-8", headers.getFirst("Content-Type"));
113 	}
114 
115 	@Test
116 	public void location() throws URISyntaxException {
117 		URI location = new URI("http://www.example.com/hotels");
118 		headers.setLocation(location);
119 		assertEquals("Invalid Location header", location, headers.getLocation());
120 		assertEquals("Invalid Location header", "http://www.example.com/hotels", headers.getFirst("Location"));
121 	}
122 
123 	@Test
124 	public void eTag() {
125 		String eTag = "\"v2.6\"";
126 		headers.setETag(eTag);
127 		assertEquals("Invalid ETag header", eTag, headers.getETag());
128 		assertEquals("Invalid ETag header", "\"v2.6\"", headers.getFirst("ETag"));
129 	}
130 
131 	@Test(expected = IllegalArgumentException.class)
132 	public void illegalETag() {
133 		String eTag = "v2.6";
134 		headers.setETag(eTag);
135 		assertEquals("Invalid ETag header", eTag, headers.getETag());
136 		assertEquals("Invalid ETag header", "\"v2.6\"", headers.getFirst("ETag"));
137 	}
138 
139 	@Test
140 	public void ifNoneMatch() {
141 		String ifNoneMatch = "\"v2.6\"";
142 		headers.setIfNoneMatch(ifNoneMatch);
143 		assertEquals("Invalid If-None-Match header", ifNoneMatch, headers.getIfNoneMatch().get(0));
144 		assertEquals("Invalid If-None-Match header", "\"v2.6\"", headers.getFirst("If-None-Match"));
145 	}
146 
147 	@Test
148 	public void ifNoneMatchList() {
149 		String ifNoneMatch1 = "\"v2.6\"";
150 		String ifNoneMatch2 = "\"v2.7\"";
151 		List<String> ifNoneMatchList = new ArrayList<String>(2);
152 		ifNoneMatchList.add(ifNoneMatch1);
153 		ifNoneMatchList.add(ifNoneMatch2);
154 		headers.setIfNoneMatch(ifNoneMatchList);
155 		assertEquals("Invalid If-None-Match header", ifNoneMatchList, headers.getIfNoneMatch());
156 		assertEquals("Invalid If-None-Match header", "\"v2.6\", \"v2.7\"", headers.getFirst("If-None-Match"));
157 	}
158 
159 	@Test
160 	public void date() {
161 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
162 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
163 		long date = calendar.getTimeInMillis();
164 		headers.setDate(date);
165 		assertEquals("Invalid Date header", date, headers.getDate());
166 		assertEquals("Invalid Date header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("date"));
167 
168 		// RFC 850
169 		headers.set("Date", "Thursday, 18-Dec-08 11:20:00 CET");
170 		assertEquals("Invalid Date header", date, headers.getDate());
171 	}
172 
173 	@Test(expected = IllegalArgumentException.class)
174 	public void dateInvalid() {
175 		headers.set("Date", "Foo Bar Baz");
176 		headers.getDate();
177 	}
178 
179 	@Test
180 	public void dateOtherLocale() {
181 		Locale defaultLocale = Locale.getDefault();
182 		try {
183 			Locale.setDefault(new Locale("nl", "nl"));
184 			Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
185 			calendar.setTimeZone(TimeZone.getTimeZone("CET"));
186 			long date = calendar.getTimeInMillis();
187 			headers.setDate(date);
188 			assertEquals("Invalid Date header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("date"));
189 			assertEquals("Invalid Date header", date, headers.getDate());
190 		}
191 		finally {
192 			Locale.setDefault(defaultLocale);
193 		}
194 	}
195 
196 	@Test
197 	public void lastModified() {
198 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
199 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
200 		long date = calendar.getTimeInMillis();
201 		headers.setLastModified(date);
202 		assertEquals("Invalid Last-Modified header", date, headers.getLastModified());
203 		assertEquals("Invalid Last-Modified header", "Thu, 18 Dec 2008 10:20:00 GMT",
204 				headers.getFirst("last-modified"));
205 	}
206 
207 	@Test
208 	public void expires() {
209 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
210 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
211 		long date = calendar.getTimeInMillis();
212 		headers.setExpires(date);
213 		assertEquals("Invalid Expires header", date, headers.getExpires());
214 		assertEquals("Invalid Expires header", "Thu, 18 Dec 2008 10:20:00 GMT", headers.getFirst("expires"));
215 	}
216 
217 	// SPR-10648 (example is from INT-3063)
218 
219 	@Test
220 	public void expiresInvalidDate() {
221 		headers.set("Expires", "-1");
222 		assertEquals(-1, headers.getExpires());
223 	}
224 
225 	@Test
226 	public void ifModifiedSince() {
227 		Calendar calendar = new GregorianCalendar(2008, 11, 18, 11, 20);
228 		calendar.setTimeZone(TimeZone.getTimeZone("CET"));
229 		long date = calendar.getTimeInMillis();
230 		headers.setIfModifiedSince(date);
231 		assertEquals("Invalid If-Modified-Since header", date, headers.getIfModifiedSince());
232 		assertEquals("Invalid If-Modified-Since header", "Thu, 18 Dec 2008 10:20:00 GMT",
233 				headers.getFirst("if-modified-since"));
234 	}
235 
236 	@Test
237 	public void pragma() {
238 		String pragma = "no-cache";
239 		headers.setPragma(pragma);
240 		assertEquals("Invalid Pragma header", pragma, headers.getPragma());
241 		assertEquals("Invalid Pragma header", "no-cache", headers.getFirst("pragma"));
242 	}
243 
244 	@Test
245 	public void cacheControl() {
246 		String cacheControl = "no-cache";
247 		headers.setCacheControl(cacheControl);
248 		assertEquals("Invalid Cache-Control header", cacheControl, headers.getCacheControl());
249 		assertEquals("Invalid Cache-Control header", "no-cache", headers.getFirst("cache-control"));
250 	}
251 
252 	@Test
253 	public void contentDisposition() {
254 		headers.setContentDispositionFormData("name", null);
255 		assertEquals("Invalid Content-Disposition header", "form-data; name=\"name\"",
256 				headers.getFirst("Content-Disposition"));
257 
258 		headers.setContentDispositionFormData("name", "filename");
259 		assertEquals("Invalid Content-Disposition header", "form-data; name=\"name\"; filename=\"filename\"",
260 				headers.getFirst("Content-Disposition"));
261 	}
262 
263 	@Test  // SPR-11917
264 	public void getAllowEmptySet() {
265 		headers.setAllow(Collections.<HttpMethod> emptySet());
266 		assertThat(headers.getAllow(), Matchers.emptyCollectionOf(HttpMethod.class));
267 	}
268 
269 }