HttpHeaderParserTest.java revision 8611e831aebbec7d6eebf02c8180e746c26dc05c
1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/*
2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project
3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License");
5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License.
6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at
7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and
14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License.
15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */
16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley.toolbox;
18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
19d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.test.suitebuilder.annotation.SmallTest;
20d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
21d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.Cache;
22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.NetworkResponse;
23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
248611e831aebbec7d6eebf02c8180e746c26dc05cRalph Bergmannimport junit.framework.TestCase;
258611e831aebbec7d6eebf02c8180e746c26dc05cRalph Bergmann
26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.text.DateFormat;
27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.text.SimpleDateFormat;
28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.util.Date;
29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.util.HashMap;
308611e831aebbec7d6eebf02c8180e746c26dc05cRalph Bergmannimport java.util.Locale;
31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.util.Map;
32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru@SmallTest
34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic class HttpHeaderParserTest extends TestCase {
35d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private static long ONE_MINUTE_MILLIS = 1000L * 60;
37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private static long ONE_HOUR_MILLIS = 1000L * 60 * 60;
38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private NetworkResponse response;
40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private Map<String, String> headers;
41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    protected void setUp() throws Exception {
44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        super.setUp();
45d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers = new HashMap<String, String>();
46d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        response = new NetworkResponse(0, null, headers, false);
47d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
48d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
49d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_noHeaders() {
50d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
53d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry.etag);
54d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(0, entry.serverDate);
55d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(0, entry.ttl);
56d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(0, entry.softTtl);
57d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
59e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    public void testParseCacheHeaders_headersSet() {
60e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        headers.put("MyCustomHeader", "42");
61e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
62e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
63e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
64e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        assertNotNull(entry);
65e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        assertNotNull(entry.responseHeaders);
66e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        assertEquals(1, entry.responseHeaders.size());
67e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        assertEquals("42", entry.responseHeaders.get("MyCustomHeader"));
68e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    }
69e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_etag() {
71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("ETag", "Yow!");
72d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("Yow!", entry.etag);
77d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
78d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
79d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_normalExpire() {
80d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
81d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now));
82d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now + ONE_HOUR_MILLIS));
83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
84d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
85d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
86d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
87d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry.etag);
88d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEqualsWithin(entry.serverDate, now, ONE_MINUTE_MILLIS);
89d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertTrue(entry.softTtl >= (now + ONE_HOUR_MILLIS));
90d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertTrue(entry.ttl == entry.softTtl);
91d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
92d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
93d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_expiresInPast() {
94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now));
96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now - ONE_HOUR_MILLIS));
97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
101d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry.etag);
102d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEqualsWithin(entry.serverDate, now, ONE_MINUTE_MILLIS);
103d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(0, entry.ttl);
104d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(0, entry.softTtl);
105d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
106d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
107d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_serverRelative() {
108d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
109d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
110d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Set "current" date as one hour in the future
111d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now + ONE_HOUR_MILLIS));
112d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // TTL four hours in the future, so should be three hours from now
113d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now + 4 * ONE_HOUR_MILLIS));
114d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
115d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
116d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
117d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEqualsWithin(now + 3 * ONE_HOUR_MILLIS, entry.ttl, ONE_MINUTE_MILLIS);
118d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(entry.softTtl, entry.ttl);
119d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
120d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
121d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_cacheControlOverridesExpires() {
122d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
123d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now));
124d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now + ONE_HOUR_MILLIS));
125d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Cache-Control", "public, max-age=86400");
126d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
127d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
128d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
129d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
130d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry.etag);
131d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEqualsWithin(now + 24 * ONE_HOUR_MILLIS, entry.ttl, ONE_MINUTE_MILLIS);
132d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(entry.softTtl, entry.ttl);
133d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
134d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
135d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_cacheControlNoCache() {
136d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
137d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now));
138d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now + ONE_HOUR_MILLIS));
139d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Cache-Control", "no-cache");
140d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
141d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
142d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
143d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry);
144d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
145d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
146d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCacheHeaders_cacheControlMustRevalidate() {
147d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long now = System.currentTimeMillis();
148d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Date", rfc1123Date(now));
149d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Expires", rfc1123Date(now + ONE_HOUR_MILLIS));
150d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Cache-Control", "must-revalidate");
151d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
152d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Cache.Entry entry = HttpHeaderParser.parseCacheHeaders(response);
153d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
154d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(entry);
155d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNull(entry.etag);
156d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEqualsWithin(now, entry.ttl, ONE_MINUTE_MILLIS);
157d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(entry.softTtl, entry.ttl);
158d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
159d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
160d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private void assertEqualsWithin(long expected, long value, long fudgeFactor) {
161d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        long diff = Math.abs(expected - value);
162d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertTrue(diff < fudgeFactor);
163d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
164d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
165d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private static String rfc1123Date(long millis) {
1668611e831aebbec7d6eebf02c8180e746c26dc05cRalph Bergmann        DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
167d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        return df.format(new Date(millis));
168d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
169d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
170d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    // --------------------------
171d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
172d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseCharset() {
173d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Like the ones we usually see
174d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain; charset=utf-8");
175d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("utf-8", HttpHeaderParser.parseCharset(headers));
176d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
177d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Extra whitespace
178d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain;    charset=utf-8 ");
179d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("utf-8", HttpHeaderParser.parseCharset(headers));
180d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
181d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Extra parameters
182d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain; charset=utf-8; frozzle=bar");
183d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("utf-8", HttpHeaderParser.parseCharset(headers));
184d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
185d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // No Content-Type header
186d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.clear();
187d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("ISO-8859-1", HttpHeaderParser.parseCharset(headers));
188d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
189d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Empty value
190d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain; charset=");
191d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("ISO-8859-1", HttpHeaderParser.parseCharset(headers));
192d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
193d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // None specified
194d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain");
195d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("ISO-8859-1", HttpHeaderParser.parseCharset(headers));
196d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
197d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // None specified, extra semicolon
198d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        headers.put("Content-Type", "text/plain;");
199d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals("ISO-8859-1", HttpHeaderParser.parseCharset(headers));
200d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
201d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru}
202