OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/file_path.h" | 6 #include "base/file_path.h" |
7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
8 #include "base/time.h" | 8 #include "base/time.h" |
9 #include "googleurl/src/gurl.h" | 9 #include "googleurl/src/gurl.h" |
10 #include "net/base/net_util.h" | 10 #include "net/base/net_util.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 }; | 32 }; |
33 | 33 |
34 struct HeaderParamCase { | 34 struct HeaderParamCase { |
35 const wchar_t* header_name; | 35 const wchar_t* header_name; |
36 const wchar_t* param_name; | 36 const wchar_t* param_name; |
37 const wchar_t* expected; | 37 const wchar_t* expected; |
38 }; | 38 }; |
39 | 39 |
40 struct FileNameCDCase { | 40 struct FileNameCDCase { |
41 const char* header_field; | 41 const char* header_field; |
| 42 const char* referrer_charset; |
42 const wchar_t* expected; | 43 const wchar_t* expected; |
43 }; | 44 }; |
44 | 45 |
45 const wchar_t* kLanguages[] = { | 46 const wchar_t* kLanguages[] = { |
46 L"", L"en", L"zh-CN", L"ja", L"ko", | 47 L"", L"en", L"zh-CN", L"ja", L"ko", |
47 L"he", L"ar", L"ru", L"el", L"fr", | 48 L"he", L"ar", L"ru", L"el", L"fr", |
48 L"de", L"pt", L"sv", L"th", L"hi", | 49 L"de", L"pt", L"sv", L"th", L"hi", |
49 L"de,en", L"el,en", L"zh,zh-TW,en", L"ko,ja", L"he,ru,en", | 50 L"de,en", L"el,en", L"zh,zh-TW,en", L"ko,ja", L"he,ru,en", |
50 L"zh,ru,en" | 51 L"zh,ru,en" |
51 }; | 52 }; |
52 | 53 |
53 struct IDNTestCase { | 54 struct IDNTestCase { |
54 const char* input; | 55 const char* input; |
55 const wchar_t* unicode_output; | 56 const wchar_t* unicode_output; |
56 const bool unicode_allowed[arraysize(kLanguages)]; | 57 const bool unicode_allowed[arraysize(kLanguages)]; |
57 }; | 58 }; |
58 | 59 |
59 struct SuggestedFilenameCase { | 60 struct SuggestedFilenameCase { |
60 const char* url; | 61 const char* url; |
61 const wchar_t* content_disp_header; | 62 const char* content_disp_header; |
| 63 const char* referrer_charset; |
62 const wchar_t* default_filename; | 64 const wchar_t* default_filename; |
63 const wchar_t* expected_filename; | 65 const wchar_t* expected_filename; |
64 }; | 66 }; |
65 | 67 |
66 // Returns an addrinfo for the given 32-bit address (IPv4.) | 68 // Returns an addrinfo for the given 32-bit address (IPv4.) |
67 // The result lives in static storage, so don't delete it. | 69 // The result lives in static storage, so don't delete it. |
68 const struct addrinfo* GetIPv4Address(const uint8 bytes[4]) { | 70 const struct addrinfo* GetIPv4Address(const uint8 bytes[4]) { |
69 static struct addrinfo static_ai; | 71 static struct addrinfo static_ai; |
70 static struct sockaddr_in static_addr4; | 72 static struct sockaddr_in static_addr4; |
71 | 73 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 net::GetSpecificHeader(L"", tests[i].header_name); | 294 net::GetSpecificHeader(L"", tests[i].header_name); |
293 std::wstring result = | 295 std::wstring result = |
294 net::GetHeaderParamValue(header_value, tests[i].param_name); | 296 net::GetHeaderParamValue(header_value, tests[i].param_name); |
295 EXPECT_EQ(result, std::wstring()); | 297 EXPECT_EQ(result, std::wstring()); |
296 } | 298 } |
297 } | 299 } |
298 | 300 |
299 TEST(NetUtilTest, GetFileNameFromCD) { | 301 TEST(NetUtilTest, GetFileNameFromCD) { |
300 const FileNameCDCase tests[] = { | 302 const FileNameCDCase tests[] = { |
301 // Test various forms of C-D header fields emitted by web servers. | 303 // Test various forms of C-D header fields emitted by web servers. |
302 {"content-disposition: inline; filename=\"abcde.pdf\"", L"abcde.pdf"}, | 304 {"content-disposition: inline; filename=\"abcde.pdf\"", "", L"abcde.pdf"}, |
303 {"content-disposition: inline; name=\"abcde.pdf\"", L"abcde.pdf"}, | 305 {"content-disposition: inline; name=\"abcde.pdf\"", "", L"abcde.pdf"}, |
304 {"content-disposition: attachment; filename=abcde.pdf", L"abcde.pdf"}, | 306 {"content-disposition: attachment; filename=abcde.pdf", "", L"abcde.pdf"}, |
305 {"content-disposition: attachment; name=abcde.pdf", L"abcde.pdf"}, | 307 {"content-disposition: attachment; name=abcde.pdf", "", L"abcde.pdf"}, |
306 {"content-disposition: attachment; filename=abc,de.pdf", L"abc,de.pdf"}, | 308 {"content-disposition: attachment; filename=abc,de.pdf", "", L"abc,de.pdf"}, |
307 {"content-disposition: filename=abcde.pdf", L"abcde.pdf"}, | 309 {"content-disposition: filename=abcde.pdf", "", L"abcde.pdf"}, |
308 {"content-disposition: filename= abcde.pdf", L"abcde.pdf"}, | 310 {"content-disposition: filename= abcde.pdf", "", L"abcde.pdf"}, |
309 {"content-disposition: filename =abcde.pdf", L"abcde.pdf"}, | 311 {"content-disposition: filename =abcde.pdf", "", L"abcde.pdf"}, |
310 {"content-disposition: filename = abcde.pdf", L"abcde.pdf"}, | 312 {"content-disposition: filename = abcde.pdf", "", L"abcde.pdf"}, |
311 {"content-disposition: filename\t=abcde.pdf", L"abcde.pdf"}, | 313 {"content-disposition: filename\t=abcde.pdf", "", L"abcde.pdf"}, |
312 {"content-disposition: filename \t\t =abcde.pdf", L"abcde.pdf"}, | 314 {"content-disposition: filename \t\t =abcde.pdf", "", L"abcde.pdf"}, |
313 {"content-disposition: name=abcde.pdf", L"abcde.pdf"}, | 315 {"content-disposition: name=abcde.pdf", "", L"abcde.pdf"}, |
314 {"content-disposition: inline; filename=\"abc%20de.pdf\"", L"abc de.pdf"}, | 316 {"content-disposition: inline; filename=\"abc%20de.pdf\"", "", |
| 317 L"abc de.pdf"}, |
315 // Whitespaces are converted to a space. | 318 // Whitespaces are converted to a space. |
316 {"content-disposition: inline; filename=\"abc \t\nde.pdf\"", | 319 {"content-disposition: inline; filename=\"abc \t\nde.pdf\"", "", |
317 L"abc de.pdf"}, | 320 L"abc de.pdf"}, |
318 // %-escaped UTF-8 | 321 // %-escaped UTF-8 |
319 {"Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" | 322 {"Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" |
320 "%EC%98%88%EC%88%A0.jpg\"", L"\xc608\xc220 \xc608\xc220.jpg"}, | 323 "%EC%98%88%EC%88%A0.jpg\"", "", L"\xc608\xc220 \xc608\xc220.jpg"}, |
321 {"Content-Disposition: attachment; filename=\"%F0%90%8C%B0%F0%90%8C%B1" | 324 {"Content-Disposition: attachment; filename=\"%F0%90%8C%B0%F0%90%8C%B1" |
322 "abc.jpg\"", L"\U00010330\U00010331abc.jpg"}, | 325 "abc.jpg\"", "", L"\U00010330\U00010331abc.jpg"}, |
323 {"Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0 \n" | 326 {"Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0 \n" |
324 "%EC%98%88%EC%88%A0.jpg\"", L"\xc608\xc220 \xc608\xc220.jpg"}, | 327 "%EC%98%88%EC%88%A0.jpg\"", "", L"\xc608\xc220 \xc608\xc220.jpg"}, |
325 // RFC 2047 with various charsets and Q/B encodings | 328 // RFC 2047 with various charsets and Q/B encodings |
326 {"Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" | 329 {"Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" |
327 "D13=2Epng?=\"", L"\x82b8\x8853" L"3.png"}, | 330 "D13=2Epng?=\"", "", L"\x82b8\x8853" L"3.png"}, |
328 {"Content-Disposition: attachment; filename==?eUc-Kr?b?v7m8+iAzLnBuZw==?=", | 331 {"Content-Disposition: attachment; filename==?eUc-Kr?b?v7m8+iAzLnBuZw==?=", |
329 L"\xc608\xc220 3.png"}, | 332 "", L"\xc608\xc220 3.png"}, |
330 {"Content-Disposition: attachment; filename==?utf-8?Q?=E8=8A=B8=E8" | 333 {"Content-Disposition: attachment; filename==?utf-8?Q?=E8=8A=B8=E8" |
331 "=A1=93_3=2Epng?=", L"\x82b8\x8853 3.png"}, | 334 "=A1=93_3=2Epng?=", "", L"\x82b8\x8853 3.png"}, |
332 {"Content-Disposition: attachment; filename==?utf-8?Q?=F0=90=8C=B0" | 335 {"Content-Disposition: attachment; filename==?utf-8?Q?=F0=90=8C=B0" |
333 "_3=2Epng?=", L"\U00010330 3.png"}, | 336 "_3=2Epng?=", "", L"\U00010330 3.png"}, |
334 {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=e3_=2epng?=\"", | 337 {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=e9_=2epng?=\"", |
335 L"caf\x00e3 .png"}, | 338 "", L"caf\x00e9 .png"}, |
336 // Space after an encode word should be removed. | 339 // Space after an encode word should be removed. |
337 {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=E3_?= .png\"", | 340 {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=E9_?= .png\"", |
338 L"caf\x00e3 .png"}, | 341 "", L"caf\x00e9 .png"}, |
339 // Two encoded words with different charsets (not very likely to be emitted | 342 // Two encoded words with different charsets (not very likely to be emitted |
340 // by web servers in the wild). Spaces between them are removed. | 343 // by web servers in the wild). Spaces between them are removed. |
341 {"Content-Disposition: inline; filename=\"=?euc-kr?b?v7m8+iAz?=" | 344 {"Content-Disposition: inline; filename=\"=?euc-kr?b?v7m8+iAz?=" |
342 " =?ksc5601?q?=BF=B9=BC=FA=2Epng?=\"", L"\xc608\xc220 3\xc608\xc220.png"}, | 345 " =?ksc5601?q?=BF=B9=BC=FA=2Epng?=\"", "", |
343 {"Content-Disposition: attachment; filename=\"=?windows-1252?Q?caf=E3?=" | 346 L"\xc608\xc220 3\xc608\xc220.png"}, |
344 " =?iso-8859-7?b?4eI=?= .png\"", L"caf\x00e3\x03b1\x03b2.png"}, | 347 {"Content-Disposition: attachment; filename=\"=?windows-1252?Q?caf=E9?=" |
345 // Non-ASCII string is passed through (and treated as UTF-8). | 348 " =?iso-8859-7?b?4eI=?= .png\"", "", L"caf\x00e9\x03b1\x03b2.png"}, |
346 {"Content-Disposition: attachment; filename=caf\xc3\xa3.png", | 349 // Non-ASCII string is passed through and treated as UTF-8 as long as |
347 L"caf\x00e3.png"}, | 350 // it's valid as UTF-8 and regardless of |referrer_charset|. |
| 351 {"Content-Disposition: attachment; filename=caf\xc3\xa9.png", |
| 352 "iso-8859-1", L"caf\x00e9.png"}, |
| 353 {"Content-Disposition: attachment; filename=caf\xc3\xa9.png", |
| 354 "", L"caf\x00e9.png"}, |
| 355 // Non-ASCII/Non-UTF-8 string. Fall back to the referrer charset. |
| 356 {"Content-Disposition: attachment; filename=caf\xe5.png", |
| 357 "windows-1253", L"caf\x03b5.png"}, |
| 358 #if 0 |
| 359 // Non-ASCII/Non-UTF-8 string. Fall back to the native codepage. |
| 360 // TODO(jungshik): We need to set the OS default codepage |
| 361 // to a specific value before testing. On Windows, we can use |
| 362 // SetThreadLocale(). |
| 363 {"Content-Disposition: attachment; filename=\xb0\xa1\xb0\xa2.png", |
| 364 "", L"\xac00\xac01.png"}, |
| 365 #endif |
348 // Failure cases | 366 // Failure cases |
349 // Invalid hex-digit "G" | 367 // Invalid hex-digit "G" |
350 {"Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", L""}, | 368 {"Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", "", |
| 369 L""}, |
351 // Incomplete RFC 2047 encoded-word (missing '='' at the end) | 370 // Incomplete RFC 2047 encoded-word (missing '='' at the end) |
352 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?", L""}, | 371 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?", "", L""}, |
353 // Extra character at the end of an encoded word | 372 // Extra character at the end of an encoded word |
354 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?==", L""}, | 373 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?==", |
| 374 "", L""}, |
355 // Extra token at the end of an encoded word | 375 // Extra token at the end of an encoded word |
356 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?=?", L""}, | 376 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?=?", |
357 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?=?=", L""}, | 377 "", L""}, |
| 378 {"Content-Disposition: attachment; filename==?iso88591?Q?caf=E3?=?=", |
| 379 "", L""}, |
358 // Incomplete hex-escaped chars | 380 // Incomplete hex-escaped chars |
359 {"Content-Disposition: attachment; filename==?windows-1252?Q?=63=61=E?=", | 381 {"Content-Disposition: attachment; filename==?windows-1252?Q?=63=61=E?=", |
360 L""}, | 382 "", L""}, |
361 {"Content-Disposition: attachment; filename=%EC%98%88%EC%88%A", L""}, | 383 {"Content-Disposition: attachment; filename=%EC%98%88%EC%88%A", "", L""}, |
362 // %-escaped non-UTF-8 encoding is an "error" | 384 // %-escaped non-UTF-8 encoding is an "error" |
363 {"Content-Disposition: attachment; filename=%B7%DD%BD%D1.png", L""}, | 385 {"Content-Disposition: attachment; filename=%B7%DD%BD%D1.png", "", L""}, |
364 // Two RFC 2047 encoded words in a row without a space is an error. | 386 // Two RFC 2047 encoded words in a row without a space is an error. |
365 {"Content-Disposition: attachment; filename==?windows-1252?Q?caf=E3?=" | 387 {"Content-Disposition: attachment; filename==?windows-1252?Q?caf=E3?=" |
366 "=?iso-8859-7?b?4eIucG5nCg==?=", L""}, | 388 "=?iso-8859-7?b?4eIucG5nCg==?=", "", L""}, |
367 }; | 389 }; |
368 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 390 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
369 EXPECT_EQ(tests[i].expected, | 391 EXPECT_EQ(tests[i].expected, |
370 net::GetFileNameFromCD(tests[i].header_field)); | 392 net::GetFileNameFromCD(tests[i].header_field, |
| 393 tests[i].referrer_charset)); |
371 } | 394 } |
372 } | 395 } |
373 | 396 |
374 TEST(NetUtilTest, IDNToUnicode) { | 397 TEST(NetUtilTest, IDNToUnicode) { |
375 // TODO(jungshik) This is just a random sample of languages and is far | 398 // TODO(jungshik) This is just a random sample of languages and is far |
376 // from exhaustive. We may have to generate all the combinations | 399 // from exhaustive. We may have to generate all the combinations |
377 // of languages (powerset of a set of all the languages). | 400 // of languages (powerset of a set of all the languages). |
378 const IDNTestCase idn_cases[] = { | 401 const IDNTestCase idn_cases[] = { |
379 // No IDN | 402 // No IDN |
380 {"www.google.com", L"www.google.com", | 403 {"www.google.com", L"www.google.com", |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 TEST(NetUtilTest, StripWWW) { | 685 TEST(NetUtilTest, StripWWW) { |
663 EXPECT_EQ(L"", net::StripWWW(L"")); | 686 EXPECT_EQ(L"", net::StripWWW(L"")); |
664 EXPECT_EQ(L"", net::StripWWW(L"www.")); | 687 EXPECT_EQ(L"", net::StripWWW(L"www.")); |
665 EXPECT_EQ(L"blah", net::StripWWW(L"www.blah")); | 688 EXPECT_EQ(L"blah", net::StripWWW(L"www.blah")); |
666 EXPECT_EQ(L"blah", net::StripWWW(L"blah")); | 689 EXPECT_EQ(L"blah", net::StripWWW(L"blah")); |
667 } | 690 } |
668 | 691 |
669 TEST(NetUtilTest, GetSuggestedFilename) { | 692 TEST(NetUtilTest, GetSuggestedFilename) { |
670 const SuggestedFilenameCase test_cases[] = { | 693 const SuggestedFilenameCase test_cases[] = { |
671 {"http://www.google.com/", | 694 {"http://www.google.com/", |
672 L"Content-disposition: attachment; filename=test.html", | 695 "Content-disposition: attachment; filename=test.html", |
| 696 "", |
673 L"", | 697 L"", |
674 L"test.html"}, | 698 L"test.html"}, |
675 {"http://www.google.com/", | 699 {"http://www.google.com/", |
676 L"Content-disposition: attachment; filename=\"test.html\"", | 700 "Content-disposition: attachment; filename=\"test.html\"", |
| 701 "", |
677 L"", | 702 L"", |
678 L"test.html"}, | 703 L"test.html"}, |
679 {"http://www.google.com/path/test.html", | 704 {"http://www.google.com/path/test.html", |
680 L"Content-disposition: attachment", | 705 "Content-disposition: attachment", |
| 706 "", |
681 L"", | 707 L"", |
682 L"test.html"}, | 708 L"test.html"}, |
683 {"http://www.google.com/path/test.html", | 709 {"http://www.google.com/path/test.html", |
684 L"Content-disposition: attachment;", | 710 "Content-disposition: attachment;", |
| 711 "", |
685 L"", | 712 L"", |
686 L"test.html"}, | 713 L"test.html"}, |
687 {"http://www.google.com/", | 714 {"http://www.google.com/", |
688 L"", | 715 "", |
| 716 "", |
689 L"", | 717 L"", |
690 L"www.google.com"}, | 718 L"www.google.com"}, |
691 {"http://www.google.com/test.html", | 719 {"http://www.google.com/test.html", |
692 L"", | 720 "", |
| 721 "", |
693 L"", | 722 L"", |
694 L"test.html"}, | 723 L"test.html"}, |
695 // Now that we use googleurl's ExtractFileName, this case falls back | 724 // Now that we use googleurl's ExtractFileName, this case falls back |
696 // to the hostname. If this behavior is not desirable, we'd better | 725 // to the hostname. If this behavior is not desirable, we'd better |
697 // change ExtractFileName (in url_parse). | 726 // change ExtractFileName (in url_parse). |
698 {"http://www.google.com/path/", | 727 {"http://www.google.com/path/", |
699 L"", | 728 "", |
| 729 "", |
700 L"", | 730 L"", |
701 L"www.google.com"}, | 731 L"www.google.com"}, |
702 {"http://www.google.com/path", | 732 {"http://www.google.com/path", |
703 L"", | 733 "", |
| 734 "", |
704 L"", | 735 L"", |
705 L"path"}, | 736 L"path"}, |
706 {"file:///", | 737 {"file:///", |
707 L"", | 738 "", |
| 739 "", |
708 L"", | 740 L"", |
709 L"download"}, | 741 L"download"}, |
710 {"view-cache:", | 742 {"view-cache:", |
711 L"", | 743 "", |
| 744 "", |
712 L"", | 745 L"", |
713 L"download"}, | 746 L"download"}, |
714 {"http://www.google.com/", | 747 {"http://www.google.com/", |
715 L"Content-disposition: attachment; filename =\"test.html\"", | 748 "Content-disposition: attachment; filename =\"test.html\"", |
| 749 "", |
716 L"download", | 750 L"download", |
717 L"test.html"}, | 751 L"test.html"}, |
718 {"http://www.google.com/", | 752 {"http://www.google.com/", |
719 L"", | 753 "", |
| 754 "", |
720 L"download", | 755 L"download", |
721 L"download"}, | 756 L"download"}, |
722 {"http://www.google.com/", | 757 {"http://www.google.com/", |
723 L"Content-disposition: attachment; filename=\"../test.html\"", | 758 "Content-disposition: attachment; filename=\"../test.html\"", |
| 759 "", |
724 L"", | 760 L"", |
725 L"test.html"}, | 761 L"test.html"}, |
726 {"http://www.google.com/", | 762 {"http://www.google.com/", |
727 L"Content-disposition: attachment; filename=\"..\"", | 763 "Content-disposition: attachment; filename=\"..\"", |
| 764 "", |
728 L"download", | 765 L"download", |
729 L"download"}, | 766 L"download"}, |
730 {"http://www.google.com/test.html", | 767 {"http://www.google.com/test.html", |
731 L"Content-disposition: attachment; filename=\"..\"", | 768 "Content-disposition: attachment; filename=\"..\"", |
| 769 "", |
732 L"download", | 770 L"download", |
733 L"test.html"}, | 771 L"test.html"}, |
734 // Below is a small subset of cases taken from GetFileNameFromCD test above. | 772 // Below is a small subset of cases taken from GetFileNameFromCD test above. |
735 {"http://www.google.com/", | 773 {"http://www.google.com/", |
736 L"Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" | 774 "Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" |
737 L"%EC%98%88%EC%88%A0.jpg\"", | 775 "%EC%98%88%EC%88%A0.jpg\"", |
| 776 "", |
738 L"", | 777 L"", |
739 L"\uc608\uc220 \uc608\uc220.jpg"}, | 778 L"\uc608\uc220 \uc608\uc220.jpg"}, |
740 {"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", | 779 {"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", |
741 L"", | 780 "", |
| 781 "", |
742 L"download", | 782 L"download", |
743 L"\uc608\uc220 \uc608\uc220.jpg"}, | 783 L"\uc608\uc220 \uc608\uc220.jpg"}, |
744 {"http://www.google.com/", | 784 {"http://www.google.com/", |
745 L"Content-disposition: attachment;", | 785 "Content-disposition: attachment;", |
| 786 "", |
746 L"\uB2E4\uC6B4\uB85C\uB4DC", | 787 L"\uB2E4\uC6B4\uB85C\uB4DC", |
747 L"\uB2E4\uC6B4\uB85C\uB4DC"}, | 788 L"\uB2E4\uC6B4\uB85C\uB4DC"}, |
748 {"http://www.google.com/", | 789 {"http://www.google.com/", |
749 L"Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" | 790 "Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" |
750 L"D13=2Epng?=\"", | 791 "D13=2Epng?=\"", |
| 792 "", |
751 L"download", | 793 L"download", |
752 L"\u82b8\u88533.png"}, | 794 L"\u82b8\u88533.png"}, |
| 795 {"http://www.example.com/images?id=3", |
| 796 "Content-Disposition: attachment; filename=caf\xc3\xa9.png", |
| 797 "iso-8859-1", |
| 798 L"", |
| 799 L"caf\u00e9.png"}, |
| 800 {"http://www.example.com/images?id=3", |
| 801 "Content-Disposition: attachment; filename=caf\xe5.png", |
| 802 "windows-1253", |
| 803 L"", |
| 804 L"caf\u03b5.png"}, |
| 805 {"http://www.example.com/file?id=3", |
| 806 "Content-Disposition: attachment; name=\xcf\xc2\xd4\xd8.zip", |
| 807 "GBK", |
| 808 L"", |
| 809 L"\u4e0b\u8f7d.zip"}, |
753 // Invalid C-D header. Extracts filename from url. | 810 // Invalid C-D header. Extracts filename from url. |
754 {"http://www.google.com/test.html", | 811 {"http://www.google.com/test.html", |
755 L"Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", | 812 "Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", |
| 813 "", |
756 L"", | 814 L"", |
757 L"test.html"}, | 815 L"test.html"}, |
758 }; | 816 }; |
759 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 817 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
760 std::wstring filename = net::GetSuggestedFilename( | 818 std::wstring filename = net::GetSuggestedFilename( |
761 GURL(test_cases[i].url), test_cases[i].content_disp_header, | 819 GURL(test_cases[i].url), test_cases[i].content_disp_header, |
762 test_cases[i].default_filename); | 820 test_cases[i].referrer_charset, test_cases[i].default_filename); |
763 EXPECT_EQ(std::wstring(test_cases[i].expected_filename), filename); | 821 EXPECT_EQ(std::wstring(test_cases[i].expected_filename), filename); |
764 } | 822 } |
765 } | 823 } |
766 | 824 |
767 // This is currently a windows specific function. | 825 // This is currently a windows specific function. |
768 #if defined(OS_WIN) | 826 #if defined(OS_WIN) |
769 namespace { | 827 namespace { |
770 | 828 |
771 struct GetDirectoryListingEntryCase { | 829 struct GetDirectoryListingEntryCase { |
772 const char* name; | 830 const char* name; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 } | 942 } |
885 } | 943 } |
886 | 944 |
887 TEST(NetUtilTest, GetHostName) { | 945 TEST(NetUtilTest, GetHostName) { |
888 // We can't check the result of GetHostName() directly, since the result | 946 // We can't check the result of GetHostName() directly, since the result |
889 // will differ across machines. Our goal here is to simply exercise the | 947 // will differ across machines. Our goal here is to simply exercise the |
890 // code path, and check that things "look about right". | 948 // code path, and check that things "look about right". |
891 std::string hostname = net::GetHostName(); | 949 std::string hostname = net::GetHostName(); |
892 EXPECT_FALSE(hostname.empty()); | 950 EXPECT_FALSE(hostname.empty()); |
893 } | 951 } |
OLD | NEW |