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