OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/io_buffer.h" | 5 #include "net/base/io_buffer.h" |
6 #include "net/filter/filter.h" | 6 #include "net/filter/filter.h" |
7 #include "net/filter/mock_filter_context.h" | 7 #include "net/filter/mock_filter_context.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace net { | 10 namespace net { |
(...skipping 30 matching lines...) Expand all Loading... |
41 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, | 41 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, |
42 Filter::ConvertEncodingToType("sdch")); | 42 Filter::ConvertEncodingToType("sdch")); |
43 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, | 43 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, |
44 Filter::ConvertEncodingToType("sDcH")); | 44 Filter::ConvertEncodingToType("sDcH")); |
45 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, | 45 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, |
46 Filter::ConvertEncodingToType("weird")); | 46 Filter::ConvertEncodingToType("weird")); |
47 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, | 47 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, |
48 Filter::ConvertEncodingToType("strange")); | 48 Filter::ConvertEncodingToType("strange")); |
49 } | 49 } |
50 | 50 |
51 // Check various fixups that modify content encoding lists. | |
52 TEST(FilterTest, ApacheGzip) { | |
53 MockFilterContext filter_context; | |
54 filter_context.SetSdchResponse(NULL); | |
55 | |
56 // Check that redundant gzip mime type removes only solo gzip encoding. | |
57 const std::string kGzipMime1("application/x-gzip"); | |
58 const std::string kGzipMime2("application/gzip"); | |
59 const std::string kGzipMime3("application/x-gunzip"); | |
60 std::vector<Filter::FilterType> encoding_types; | |
61 | |
62 // First show it removes the gzip, given any gzip style mime type. | |
63 encoding_types.clear(); | |
64 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
65 filter_context.SetMimeType(kGzipMime1); | |
66 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
67 EXPECT_TRUE(encoding_types.empty()); | |
68 | |
69 encoding_types.clear(); | |
70 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
71 filter_context.SetMimeType(kGzipMime2); | |
72 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
73 EXPECT_TRUE(encoding_types.empty()); | |
74 | |
75 encoding_types.clear(); | |
76 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
77 filter_context.SetMimeType(kGzipMime3); | |
78 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
79 EXPECT_TRUE(encoding_types.empty()); | |
80 | |
81 // Check to be sure it doesn't remove everything when it has such a type. | |
82 encoding_types.clear(); | |
83 encoding_types.push_back(Filter::FILTER_TYPE_SDCH); | |
84 filter_context.SetMimeType(kGzipMime1); | |
85 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
86 ASSERT_EQ(1U, encoding_types.size()); | |
87 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, encoding_types.front()); | |
88 | |
89 // Check to be sure that gzip can survive with other mime types. | |
90 encoding_types.clear(); | |
91 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
92 filter_context.SetMimeType("other/mime"); | |
93 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
94 ASSERT_EQ(1U, encoding_types.size()); | |
95 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
96 } | |
97 | |
98 TEST(FilterTest, GzipContentDispositionFilename) { | |
99 MockFilterContext filter_context; | |
100 filter_context.SetSdchResponse(NULL); | |
101 | |
102 const std::string kGzipMime("application/x-tar"); | |
103 const std::string kContentDisposition("attachment; filename=\"foo.tgz\""); | |
104 const std::string kURL("http://foo.com/getfoo.php"); | |
105 std::vector<Filter::FilterType> encoding_types; | |
106 | |
107 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
108 filter_context.SetMimeType(kGzipMime); | |
109 filter_context.SetURL(GURL(kURL)); | |
110 filter_context.SetContentDisposition(kContentDisposition); | |
111 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
112 ASSERT_EQ(0U, encoding_types.size()); | |
113 } | |
114 | |
115 TEST(FilterTest, SdchEncoding) { | 51 TEST(FilterTest, SdchEncoding) { |
116 // Handle content encodings including SDCH. | 52 // Handle content encodings including SDCH. |
117 const std::string kTextHtmlMime("text/html"); | 53 const std::string kTextHtmlMime("text/html"); |
118 MockFilterContext filter_context; | 54 MockFilterContext filter_context; |
119 // Empty handle indicates to filter that SDCH is active. | 55 // Empty handle indicates to filter that SDCH is active. |
120 filter_context.SetSdchResponse( | 56 filter_context.SetSdchResponse( |
121 SdchManager::CreateEmptyDictionarySetForTesting().Pass()); | 57 SdchManager::CreateEmptyDictionarySetForTesting().Pass()); |
122 | 58 |
123 std::vector<Filter::FilterType> encoding_types; | 59 std::vector<Filter::FilterType> encoding_types; |
124 | 60 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 118 |
183 // No encoding, but it was an SDCH response with non-html type. | 119 // No encoding, but it was an SDCH response with non-html type. |
184 encoding_types.clear(); | 120 encoding_types.clear(); |
185 filter_context.SetMimeType("other/mime"); | 121 filter_context.SetMimeType("other/mime"); |
186 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 122 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
187 ASSERT_EQ(2U, encoding_types.size()); | 123 ASSERT_EQ(2U, encoding_types.size()); |
188 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); | 124 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); |
189 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); | 125 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); |
190 } | 126 } |
191 | 127 |
192 TEST(FilterTest, Svgz) { | |
193 MockFilterContext filter_context; | |
194 | |
195 // Check that svgz files are only decompressed when not downloading. | |
196 const std::string kSvgzMime("image/svg+xml"); | |
197 const std::string kSvgzUrl("http://ignore.com/foo.svgz"); | |
198 const std::string kSvgUrl("http://ignore.com/foo.svg"); | |
199 std::vector<Filter::FilterType> encoding_types; | |
200 | |
201 // Test svgz extension | |
202 encoding_types.clear(); | |
203 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
204 filter_context.SetDownload(false); | |
205 filter_context.SetMimeType(kSvgzMime); | |
206 filter_context.SetURL(GURL(kSvgzUrl)); | |
207 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
208 ASSERT_EQ(1U, encoding_types.size()); | |
209 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
210 | |
211 encoding_types.clear(); | |
212 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
213 filter_context.SetDownload(true); | |
214 filter_context.SetMimeType(kSvgzMime); | |
215 filter_context.SetURL(GURL(kSvgzUrl)); | |
216 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
217 EXPECT_TRUE(encoding_types.empty()); | |
218 | |
219 // Test svg extension | |
220 encoding_types.clear(); | |
221 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
222 filter_context.SetDownload(false); | |
223 filter_context.SetMimeType(kSvgzMime); | |
224 filter_context.SetURL(GURL(kSvgUrl)); | |
225 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
226 ASSERT_EQ(1U, encoding_types.size()); | |
227 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
228 | |
229 encoding_types.clear(); | |
230 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
231 filter_context.SetDownload(true); | |
232 filter_context.SetMimeType(kSvgzMime); | |
233 filter_context.SetURL(GURL(kSvgUrl)); | |
234 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
235 ASSERT_EQ(1U, encoding_types.size()); | |
236 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
237 } | |
238 | |
239 TEST(FilterTest, UnsupportedMimeGzip) { | |
240 // From issue 8170 - handling files with Content-Encoding: x-gzip | |
241 MockFilterContext filter_context; | |
242 std::vector<Filter::FilterType> encoding_types; | |
243 const std::string kTarMime("application/x-tar"); | |
244 const std::string kCpioMime("application/x-cpio"); | |
245 const std::string kTarUrl("http://ignore.com/foo.tar"); | |
246 const std::string kTargzUrl("http://ignore.com/foo.tar.gz"); | |
247 const std::string kTgzUrl("http://ignore.com/foo.tgz"); | |
248 const std::string kBadTgzUrl("http://ignore.com/foo.targz"); | |
249 const std::string kUrl("http://ignore.com/foo"); | |
250 | |
251 // Firefox 3 does not decompress when we have unsupported mime types for | |
252 // certain filenames. | |
253 encoding_types.clear(); | |
254 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
255 filter_context.SetDownload(false); | |
256 filter_context.SetMimeType(kTarMime); | |
257 filter_context.SetURL(GURL(kTargzUrl)); | |
258 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
259 EXPECT_TRUE(encoding_types.empty()); | |
260 | |
261 encoding_types.clear(); | |
262 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
263 filter_context.SetDownload(false); | |
264 filter_context.SetMimeType(kTarMime); | |
265 filter_context.SetURL(GURL(kTgzUrl)); | |
266 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
267 EXPECT_TRUE(encoding_types.empty()); | |
268 | |
269 encoding_types.clear(); | |
270 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
271 filter_context.SetDownload(false); | |
272 filter_context.SetMimeType(kCpioMime); | |
273 filter_context.SetURL(GURL(kTgzUrl)); | |
274 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
275 EXPECT_TRUE(encoding_types.empty()); | |
276 | |
277 // Same behavior for downloads. | |
278 encoding_types.clear(); | |
279 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
280 filter_context.SetDownload(true); | |
281 filter_context.SetMimeType(kCpioMime); | |
282 filter_context.SetURL(GURL(kTgzUrl)); | |
283 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
284 EXPECT_TRUE(encoding_types.empty()); | |
285 | |
286 // Unsupported mime type with wrong file name, decompressed. | |
287 encoding_types.clear(); | |
288 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
289 filter_context.SetDownload(false); | |
290 filter_context.SetMimeType(kTarMime); | |
291 filter_context.SetURL(GURL(kUrl)); | |
292 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
293 ASSERT_EQ(1U, encoding_types.size()); | |
294 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
295 | |
296 encoding_types.clear(); | |
297 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
298 filter_context.SetDownload(false); | |
299 filter_context.SetMimeType(kTarMime); | |
300 filter_context.SetURL(GURL(kTarUrl)); | |
301 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
302 ASSERT_EQ(1U, encoding_types.size()); | |
303 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
304 | |
305 encoding_types.clear(); | |
306 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
307 filter_context.SetDownload(false); | |
308 filter_context.SetMimeType(kTarMime); | |
309 filter_context.SetURL(GURL(kBadTgzUrl)); | |
310 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
311 ASSERT_EQ(1U, encoding_types.size()); | |
312 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
313 | |
314 // Same behavior for downloads. | |
315 encoding_types.clear(); | |
316 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
317 filter_context.SetDownload(true); | |
318 filter_context.SetMimeType(kTarMime); | |
319 filter_context.SetURL(GURL(kBadTgzUrl)); | |
320 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
321 ASSERT_EQ(1U, encoding_types.size()); | |
322 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
323 } | |
324 | |
325 TEST(FilterTest, SupportedMimeGzip) { | |
326 // From issue 16430 - Files with supported mime types should be decompressed, | |
327 // even though these files end in .gz/.tgz. | |
328 MockFilterContext filter_context; | |
329 std::vector<Filter::FilterType> encoding_types; | |
330 const std::string kGzUrl("http://ignore.com/foo.gz"); | |
331 const std::string kUrl("http://ignore.com/foo"); | |
332 const std::string kHtmlMime("text/html"); | |
333 const std::string kJavascriptMime("text/javascript"); | |
334 | |
335 // For files that does not end in .gz/.tgz, we always decompress. | |
336 encoding_types.clear(); | |
337 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
338 filter_context.SetDownload(false); | |
339 filter_context.SetMimeType(kHtmlMime); | |
340 filter_context.SetURL(GURL(kUrl)); | |
341 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
342 ASSERT_EQ(1U, encoding_types.size()); | |
343 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
344 | |
345 encoding_types.clear(); | |
346 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
347 filter_context.SetDownload(true); | |
348 filter_context.SetMimeType(kHtmlMime); | |
349 filter_context.SetURL(GURL(kUrl)); | |
350 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
351 ASSERT_EQ(1U, encoding_types.size()); | |
352 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
353 | |
354 // And also decompress files that end in .gz/.tgz. | |
355 encoding_types.clear(); | |
356 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
357 filter_context.SetDownload(false); | |
358 filter_context.SetMimeType(kHtmlMime); | |
359 filter_context.SetURL(GURL(kGzUrl)); | |
360 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
361 ASSERT_EQ(1U, encoding_types.size()); | |
362 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
363 | |
364 encoding_types.clear(); | |
365 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
366 filter_context.SetDownload(false); | |
367 filter_context.SetMimeType(kJavascriptMime); | |
368 filter_context.SetURL(GURL(kGzUrl)); | |
369 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
370 ASSERT_EQ(1U, encoding_types.size()); | |
371 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | |
372 | |
373 // Except on downloads, where they just get saved. | |
374 encoding_types.clear(); | |
375 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | |
376 filter_context.SetDownload(true); | |
377 filter_context.SetMimeType(kHtmlMime); | |
378 filter_context.SetURL(GURL(kGzUrl)); | |
379 Filter::FixupEncodingTypes(filter_context, &encoding_types); | |
380 EXPECT_TRUE(encoding_types.empty()); | |
381 } | |
382 | |
383 // Make sure a series of three pass-through filters copies the data cleanly. | 128 // Make sure a series of three pass-through filters copies the data cleanly. |
384 // Regression test for http://crbug.com/418975. | 129 // Regression test for http://crbug.com/418975. |
385 TEST(FilterTest, ThreeFilterChain) { | 130 TEST(FilterTest, ThreeFilterChain) { |
386 scoped_ptr<PassThroughFilter> filter1(new PassThroughFilter); | 131 scoped_ptr<PassThroughFilter> filter1(new PassThroughFilter); |
387 scoped_ptr<PassThroughFilter> filter2(new PassThroughFilter); | 132 scoped_ptr<PassThroughFilter> filter2(new PassThroughFilter); |
388 scoped_ptr<PassThroughFilter> filter3(new PassThroughFilter); | 133 scoped_ptr<PassThroughFilter> filter3(new PassThroughFilter); |
389 | 134 |
390 filter1->InitBuffer(32 * 1024); | 135 filter1->InitBuffer(32 * 1024); |
391 filter2->InitBuffer(32 * 1024); | 136 filter2->InitBuffer(32 * 1024); |
392 filter3->InitBuffer(32 * 1024); | 137 filter3->InitBuffer(32 * 1024); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 amount_to_copy); | 183 amount_to_copy); |
439 filter1->FlushStreamBuffer(amount_to_copy); | 184 filter1->FlushStreamBuffer(amount_to_copy); |
440 read_array_index += amount_to_copy; | 185 read_array_index += amount_to_copy; |
441 } while (true); | 186 } while (true); |
442 | 187 |
443 EXPECT_EQ(read_array_index, input_array_size); | 188 EXPECT_EQ(read_array_index, input_array_size); |
444 EXPECT_EQ(compare_array_index, input_array_size); | 189 EXPECT_EQ(compare_array_index, input_array_size); |
445 } | 190 } |
446 | 191 |
447 } // Namespace net | 192 } // Namespace net |
OLD | NEW |