15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_content_disposition.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FileNameCDCase { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* header; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* referrer_charset; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* expected; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpContentDispositionTest, Filename) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileNameCDCase tests[] = { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test various forms of C-D header fields emitted by web servers. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"abcde.pdf\"", "", L"abcde.pdf"}, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; name=\"abcde.pdf\"", "", L"abcde.pdf"}, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=abcde.pdf", "", L"abcde.pdf"}, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; name=abcde.pdf", "", L"abcde.pdf"}, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=abc,de.pdf", "", L"abc,de.pdf"}, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename=abcde.pdf", "", L"abcde.pdf"}, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename= abcde.pdf", "", L"abcde.pdf"}, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename =abcde.pdf", "", L"abcde.pdf"}, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename = abcde.pdf", "", L"abcde.pdf"}, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename\t=abcde.pdf", "", L"abcde.pdf"}, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename \t\t =abcde.pdf", "", L"abcde.pdf"}, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"name=abcde.pdf", "", L"abcde.pdf"}, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"abc%20de.pdf\"", "", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"abc de.pdf"}, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unbalanced quotation mark 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"filename=\"abcdef.pdf", "", L"abcdef.pdf"}, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whitespaces are converted to a space. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"abc \t\nde.pdf\"", "", 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"abc de.pdf"}, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // %-escaped UTF-8 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"%EC%98%88%EC%88%A0%20" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%EC%98%88%EC%88%A0.jpg\"", "", L"\xc608\xc220 \xc608\xc220.jpg"}, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"%F0%90%8C%B0%F0%90%8C%B1" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abc.jpg\"", "", L"\U00010330\U00010331abc.jpg"}, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"%EC%98%88%EC%88%A0 \n" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%EC%98%88%EC%88%A0.jpg\"", "", L"\xc608\xc220 \xc608\xc220.jpg"}, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RFC 2047 with various charsets and Q/B encodings 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "D13=2Epng?=\"", "", L"\x82b8\x8853" L"3.png"}, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?eUc-Kr?b?v7m8+iAzLnBuZw==?=", 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"\xc608\xc220 3.png"}, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?utf-8?Q?=E8=8A=B8=E8" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "=A1=93_3=2Epng?=", "", L"\x82b8\x8853 3.png"}, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?utf-8?Q?=F0=90=8C=B0" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "_3=2Epng?=", "", L"\U00010330 3.png"}, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"=?iso88591?Q?caf=e9_=2epng?=\"", 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"caf\x00e9 .png"}, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Space after an encoded word should be removed. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"=?iso88591?Q?caf=E9_?= .png\"", 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"caf\x00e9 .png"}, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two encoded words with different charsets (not very likely to be emitted 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by web servers in the wild). Spaces between them are removed. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename=\"=?euc-kr?b?v7m8+iAz?=" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " =?ksc5601?q?=BF=B9=BC=FA=2Epng?=\"", "", 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\xc608\xc220 3\xc608\xc220.png"}, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"=?windows-1252?Q?caf=E9?=" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " =?iso-8859-7?b?4eI=?= .png\"", "", L"caf\x00e9\x03b1\x03b2.png"}, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-ASCII string is passed through and treated as UTF-8 as long as 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's valid as UTF-8 and regardless of |referrer_charset|. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=caf\xc3\xa9.png", 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "iso-8859-1", L"caf\x00e9.png"}, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=caf\xc3\xa9.png", 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"caf\x00e9.png"}, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-ASCII/Non-UTF-8 string. Fall back to the referrer charset. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=caf\xe5.png", 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "windows-1253", L"caf\x03b5.png"}, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-ASCII/Non-UTF-8 string. Fall back to the native codepage. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): We need to set the OS default codepage 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to a specific value before testing. On Windows, we can use 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetThreadLocale(). 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\xb0\xa1\xb0\xa2.png", 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"\xac00\xac01.png"}, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failure cases 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid hex-digit "G" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?iiso88591?Q?caf=EG?=", "", 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L""}, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incomplete RFC 2047 encoded-word (missing '='' at the end) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?iso88591?Q?caf=E3?", "", L""}, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extra character at the end of an encoded word 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?iso88591?Q?caf=E3?==", 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extra token at the end of an encoded word 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?iso88591?Q?caf=E3?=?", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?iso88591?Q?caf=E3?=?=", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incomplete hex-escaped chars 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?windows-1252?Q?=63=61=E?=", 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=%EC%98%88%EC%88%A", "", L""}, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // %-escaped non-UTF-8 encoding is an "error" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=%B7%DD%BD%D1.png", "", L""}, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Two RFC 2047 encoded words in a row without a space is an error. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename==?windows-1252?Q?caf=E3?=" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "=?iso-8859-7?b?4eIucG5nCg==?=", "", L""}, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RFC 5987 tests with Filename* : see http://tools.ietf.org/html/rfc5987 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=foo.html", "", L""}, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=foo'.html", "", L""}, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=''foo'.html", "", L""}, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=''foo.html'", "", L""}, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=''f\"oo\".html'", "", L""}, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=bogus_charset''foo.html'", 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*='en'foo.html'", "", L""}, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=iso-8859-1'en'foo.html", "", 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html"}, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=utf-8'en'foo.html", "", 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html"}, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // charset cannot be omitted. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*='es'f\xfa.html'", "", L""}, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-ASCII bytes are not allowed. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=iso-8859-1'es'f\xfa.html", "", 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L""}, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=utf-8'es'f\xce\xba.html", "", 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L""}, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jshin): Space should be %-encoded, but currently, we allow 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // spaces. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename*=iso88591''cafe foo.png", "", 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"cafe foo.png"}, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filename* tests converted from Q-encoded tests above. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=EUC-JP''%B7%DD%BD%D13%2Epng", 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L"\x82b8\x8853" L"3.png"}, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=utf-8''" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%E8%8A%B8%E8%A1%93%203%2Epng", "", L"\x82b8\x8853 3.png"}, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=utf-8''%F0%90%8C%B0 3.png", "", 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\U00010330 3.png"}, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"inline; filename*=Euc-Kr'ko'%BF%B9%BC%FA%2Epng", "", 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\xc608\xc220.png"}, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=windows-1252''caf%E9.png", "", 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"caf\x00e9.png"}, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple filename, filename*, name parameters specified. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; name=\"foo\"; filename=\"bar\"", "", L"bar"}, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"bar\"; name=\"foo\"", "", L"bar"}, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"bar\"; filename*=utf-8''baz", "", L"baz"}, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/ filename* test cases. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithisofn2231iso 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=iso-8859-1''foo-%E4.html", "", 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xe4.html"}, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231utf8 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UTF-8''foo-%c3%a4-%e2%82%ac.html", "", L"foo-\xe4-\x20ac.html"}, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231noc : no encoding specified but UTF-8 is used. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=''foo-%c3%a4-%e2%82%ac.html", 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231utf8comp 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=UTF-8''foo-a%cc%88.html", "", 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xe4.html"}, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ICU_SHOULD_FAIL_CONVERSION_ON_INVALID_CHARACTER 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This does not work because we treat ISO-8859-1 synonymous with 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows-1252 per HTML5. For HTTP, in theory, we're not 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supposed to. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231utf8-bad 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "iso-8859-1''foo-%c3%a4-%e2%82%ac.html", "", L""}, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231ws1 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename *=UTF-8''foo-%c3%a4.html", "", 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L""}, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231ws2 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*= UTF-8''foo-%c3%a4.html", "", 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xe4.html"}, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231ws3 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename* =UTF-8''foo-%c3%a4.html", "", 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xe4.html"}, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attwithfn2231quot 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=\"UTF-8''foo-%c3%a4.html\"", 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", L""}, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attfnboth 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename=\"foo-ae.html\"; " 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filename*=UTF-8''foo-%c3%a4.html", "", L"foo-\xe4.html"}, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attfnboth2 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; filename*=UTF-8''foo-%c3%a4.html; " 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "filename=\"foo-ae.html\"", "", L"foo-\xe4.html"}, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attnewandfn 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {"attachment; foobar=x; filename=\"foo.html\"", "", 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html"}, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpContentDisposition header(tests[i].header, tests[i].referrer_charset); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToWide(header.filename())) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Failed on input: " << tests[i].header; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test cases from http://greenbytes.de/tech/tc2231/ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpContentDispositionTest, tc2231) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct FileNameCDCase { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* header; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::Type expected_type; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* expected_filename; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#inlonly 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "inline", 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#inlonlyquoted 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\"inline\"", 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#inlwithasciifilename 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "inline; filename=\"foo.html\"", 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#inlwithfnattach 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "inline; filename=\"Not an attachment!\"", 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"Not an attachment!" 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "inline; filename=\"foo.pdf\"", 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.pdf" 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attonly 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment", 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attonlyquoted 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\"attachment\"", 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attonly403 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abarth): This isn't testable in this unit test. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attonlyucase 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ATTACHMENT", 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilename 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo.html\"", 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifnescapedchar 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"f\\oo.html\"", 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifnescapedquote 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"\\\"quoting\\\" tested.html\"", 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\"quoting\" tested.html" 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithquotedsemicolon 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"Here's a semicolon;.html\"", 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"Here's a semicolon;.html" 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfilenameandextparam 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; foo=\"bar\"; filename=\"foo.html\"", 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfilenameandextparamescaped 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; foo=\"\\\"\\\\\";filename=\"foo.html\"", 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilenameucase 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; FILENAME=\"foo.html\"", 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilenamenq 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo.html", 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilenamenqs 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo.html ;", 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attemptyparam 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; ;filename=foo", 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo" 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilenamenqws 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo bar.html", 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo bar.html" 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfntokensq 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename='foo.bar'", 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.bar" // Should be L"'foo.bar'" 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ICU_SHOULD_FAIL_CONVERSION_ON_INVALID_CHARACTER 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithisofnplain 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo-\xE4html\"", 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" // Should be L"foo-\xE4.html" 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithutf8fnplain 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: We'll UTF-8 decode the file name, even though tc2231 says not to. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo-\xC3\xA4.html\"", 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xE4.html" 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfnrawpctenca 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo-%41.html\"", 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-A.html" // Should be L"foo-%41.html" 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfnusingpct 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"50%.html\"", 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"50%.html" 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfnrawpctencaq 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo-%\\41.html\"", 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-A.html" // Should be L"foo-%41.html" 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithnamepct 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; name=\"foo-%41.html\"", 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-A.html" // Should be L"foo-%41.html" 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ICU_SHOULD_FAIL_CONVERSION_ON_INVALID_CHARACTER 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfilenamepctandiso 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"\xE4-%41.html\"", 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" // Should be L"\xE4-%41.htm" 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithfnrawpctenclong 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo-%c3%a4-%e2%82%ac.html\"", 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xE4-\u20AC.html" // Should be L"foo-%c3%a4-%e2%82%ac.html" 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwithasciifilenamews1 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename =\"foo.html\"", 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attwith2filenames 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo.html\"; filename=\"bar.html\"", 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attfnbrokentoken 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo[1](2).html", 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo[1](2).html" 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef ICU_SHOULD_FAIL_CONVERSION_ON_INVALID_CHARACTER 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attfnbrokentokeniso 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo-\xE4.html", 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attfnbrokentokenutf 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo-\xC3\xA4.html", 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo-\xE4.html" 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmissingdisposition 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "filename=foo.html", 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmissingdisposition2 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "x=y; filename=foo.html", 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmissingdisposition3 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "\"foo; filename=bar;baz\"; filename=qux", 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" // Firefox gets qux 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmissingdisposition4 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "filename=foo.html, filename=bar.html", 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html, filename=bar.html" 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#emptydisposition 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "; filename=foo.html", 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attandinline 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "inline; attachment; filename=foo.html", 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attandinline2 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; inline; filename=foo.html", 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attbrokenquotedfn 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"foo.html\".txt", 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html\".txt" 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attbrokenquotedfn2 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"bar", 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"bar" 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attbrokenquotedfn3 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo\"bar;baz\"qux", 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo\"bar;baz\"qux" 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmultinstances 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=foo.html, attachment; filename=bar.html", 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html, attachment" 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attmissingdelim 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; foo=foo filename=bar", 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attreversed 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: tc2231 says we should fail to parse this header. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "filename=foo.html; attachment", 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::INLINE, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attconfusedparam 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; xfilename=foo.html", 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attabspath 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"/foo.html\"", 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"/foo.html" 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attabspathwin 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; filename=\"\\\\foo.html\"", 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\\foo.html" 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#dispext 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "foobar", 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#dispextbadfn 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; example=\"filename=example.txt\"", 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"" 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://greenbytes.de/tech/tc2231/#attnewandfn 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "attachment; foobar=x; filename=\"foo.html\"", 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpContentDisposition::ATTACHMENT, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.html" 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abarth): Add the filename* tests, but check 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HttpContentDispositionTest.Filename for overlap. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abarth): http://greenbytes.de/tech/tc2231/#attrfc2047token 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abarth): http://greenbytes.de/tech/tc2231/#attrfc2047quoted 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpContentDisposition header(tests[i].header, std::string()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_type, header.type()) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Failed on input: " << tests[i].header; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_filename, UTF8ToWide(header.filename())) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Failed on input: " << tests[i].header; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(HttpContentDispositionTest, ParseResult) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct ParseResultTestCase { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* header; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_flags; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } kTestCases[] = { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Basic feature tests 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "", HttpContentDisposition::INVALID }, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "example=x", HttpContentDisposition::INVALID }, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; filename=", HttpContentDisposition::HAS_DISPOSITION_TYPE }, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; name=", HttpContentDisposition::HAS_DISPOSITION_TYPE }, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; filename*=", HttpContentDisposition::HAS_DISPOSITION_TYPE }, 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; filename==?utf-8?Q?\?=", 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_DISPOSITION_TYPE }, 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=x", HttpContentDisposition::HAS_FILENAME }, 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "example; filename=x", 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_DISPOSITION_TYPE | 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_UNKNOWN_DISPOSITION_TYPE | 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME}, 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; filename=x", 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_DISPOSITION_TYPE | 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME }, 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; filename=x; name=y", 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_DISPOSITION_TYPE | 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NAME }, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "attachment; name=y; filename*=utf-8''foo; name=x", 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_DISPOSITION_TYPE | 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_EXT_FILENAME | 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NAME }, 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Feature tests for 'filename' attribute. 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=foo\xcc\x88", 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NON_ASCII_STRINGS }, 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=foo%cc%88", 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_PERCENT_ENCODED_STRINGS }, 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename==?utf-8?Q?foo?=", 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_RFC2047_ENCODED_STRINGS }, 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=\"=?utf-8?Q?foo?=\"", 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_RFC2047_ENCODED_STRINGS }, 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename==?utf-8?Q?foo?", HttpContentDisposition::INVALID }, 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "name=foo\xcc\x88", 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NAME }, 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shouldn't set |has_non_ascii_strings| based on 'name' attribute. 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=x; name=foo\xcc\x88", 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NAME }, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?=", 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_FILENAME | 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NON_ASCII_STRINGS | 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_PERCENT_ENCODED_STRINGS | 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_RFC2047_ENCODED_STRINGS }, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If 'filename' attribute is invalid, should set any flags based on it. 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?", 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::INVALID }, 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "filename=foo\xcc\x88 foo%cc%88 =?utf-8?Q?foo?; name=x", 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition::HAS_NAME }, 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ParseResultTestCase& test_case = kTestCases[i]; 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HttpContentDisposition content_disposition(test_case.header, "utf-8"); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = content_disposition.parse_result_flags(); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SCOPED_TRACE(testing::Message() << "Test case " << i 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " with header " << test_case.header); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_case.expected_flags, result); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 591