1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/download/download_util.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_POSIX) && !defined(OS_MACOSX)
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <locale.h>
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/test/test_file_util.h"
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h"
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define JPEG_EXT L".jpg"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define HTML_EXT L".htm"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TXT_EXT L".txt"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TAR_EXT L".tar"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(OS_MACOSX)
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define JPEG_EXT L".jpeg"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define HTML_EXT L".html"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TXT_EXT L".txt"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TAR_EXT L".tar"
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define JPEG_EXT L".jpg"
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define HTML_EXT L".html"
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TXT_EXT L".txt"
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define TAR_EXT L".tar"
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace {
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst struct {
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const char* disposition;
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const char* url;
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const char* mime_type;
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const wchar_t* expected_name;
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} kGenerateFileNameTestCases[] = {
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // No 'filename' keyword in the disposition, use the URL
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"a_file_name.txt",
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/my_download.txt",
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my_download.txt"},
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Disposition has relative paths, remove directory separators
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=../../../../././../a_file_name.txt",
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/my_download.txt",
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"_.._.._.._._._.._a_file_name.txt"},
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Disposition has parent directories, remove directory separators
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=dir1/dir2/a_file_name.txt",
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/my_download.txt",
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"dir1_dir2_a_file_name.txt"},
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Disposition has relative paths, remove directory separators
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  {"filename=..\\..\\..\\..\\.\\.\\..\\a_file_name.txt",
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   "http://www.evil.com/my_download.txt",
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   "text/plain",
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"_.._.._.._._._.._a_file_name.txt"},
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Disposition has parent directories, remove directory separators
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  {"filename=dir1\\dir2\\a_file_name.txt",
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   "http://www.evil.com/my_download.txt",
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   "text/plain",
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"dir1_dir2_a_file_name.txt"},
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // No useful information in disposition or URL, use default
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"", "http://www.truncated.com/path/", "text/plain",
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download" TXT_EXT
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A normal avi should get .avi and not .avi.avi
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"", "https://blah.google.com/misc/2.avi", "video/x-msvideo", L"2.avi"},
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Spaces in the disposition file name
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=My Downloaded File.exe",
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.frontpagehacker.com/a_download.exe",
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/octet-stream",
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"My Downloaded File.exe"},
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=my-cat",
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/my-cat",
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my-cat" JPEG_EXT
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=my-cat",
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/my-cat",
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my-cat.txt"},
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=my-cat",
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/my-cat",
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/html",
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my-cat" HTML_EXT
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=my-cat",
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/my-cat",
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my-cat"},
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=my-cat.jpg",
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/my-cat.jpg",
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"my-cat.jpg"},
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // .exe tests.
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=evil.exe",
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.exe",
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   L"evil.exe"},
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=ok.exe",
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/ok.exe",
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"ok.exe"},
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {"filename=evil.dll",
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   "http://www.goodguy.com/evil.dll",
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   L"evil.dll"},
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {"filename=evil",
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.exe",
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/rss+xml",
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   L"evil"},
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Test truncation of trailing dots and spaces
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=evil.exe ",
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.exe ",
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"evil.exe"},
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=evil.exe.",
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.exe.",
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"evil.exe"},
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=evil.exe.  .  .",
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.exe.  .  .",
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"evil.exe"},
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=evil.",
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/evil.",
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"evil"},
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=. . . . .",
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/. . . . .",
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "binary/octet-stream",
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download"},
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // OS_WIN
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=utils.js",
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/utils.js",
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-javascript",
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"utils.js"},
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=contacts.js",
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/contacts.js",
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/json",
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"contacts.js"},
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=utils.js",
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/utils.js",
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/javascript",
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"utils.js"},
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=utils.js",
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/utils.js",
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/javascript;version=2",
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"utils.js"},
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=utils.js",
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/utils.js",
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/ecmascript",
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"utils.js"},
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=utils.js",
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/utils.js",
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/ecmascript;version=4",
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"utils.js"},
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=program.exe",
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/program.exe",
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"program.exe"},
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=../foo.txt",
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/../foo.txt",
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"_foo.txt"},
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=..\\foo.txt",
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/..\\foo.txt",
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen   L"_foo.txt"
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=.hidden",
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/.hidden",
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"hidden" TXT_EXT
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=trailing.",
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/trailing.",
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"trailing"
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=trailing.",
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/trailing.",
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"trailing" TXT_EXT
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=.",
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/.",
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download"},
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=..",
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/..",
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download"},
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=...",
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/...",
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "dance/party",
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download"},
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Note that this one doesn't have "filename=" on it.
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"a_file_name.txt",
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/",
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download" JPEG_EXT
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=",
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.evil.com/",
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download" JPEG_EXT
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=simple",
255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/simple",
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/octet-stream",
257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"simple"},
258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=COM1",
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/COM1",
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_COM1"
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"COM1"
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=COM4.txt",
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/COM4.txt",
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_COM4.txt"
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"COM4.txt"
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=lpt1.TXT",
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/lpt1.TXT",
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_lpt1.TXT"
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"lpt1.TXT"
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=clock$.txt",
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/clock$.txt",
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_clock$.txt"
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"clock$.txt"
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=mycom1.foo",
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.goodguy.com/mycom1.foo",
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"mycom1.foo"},
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=Setup.exe.local",
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.badguy.com/Setup.exe.local",
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.download"
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.local"
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=Setup.exe.local.local",
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.badguy.com/Setup.exe.local",
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.local.download"
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.local.local"
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=Setup.exe.lnk",
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.badguy.com/Setup.exe.lnk",
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.download"
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Setup.exe.lnk"
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=Desktop.ini",
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.badguy.com/Desktop.ini",
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_Desktop.ini"
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Desktop.ini"
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=Thumbs.db",
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.badguy.com/Thumbs.db",
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/foo-bar",
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"_Thumbs.db"
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"Thumbs.db"
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=source.jpg",
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.hotmail.com",
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-javascript",
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"source.jpg"
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // NetUtilTest.{GetSuggestedFilename, GetFileNameFromCD} test these
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // more thoroughly. Tested below are a small set of samples.
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"attachment; filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"",
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.examples.com/",
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"\uc608\uc220 \uc608\uc220.jpg"},
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"attachment; name=abc de.pdf",
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.examples.com/q.cgi?id=abc",
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/octet-stream",
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"abc de.pdf"},
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"",
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/path",
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/png",
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"\x82b8\x8853" L"3.png"},
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The following two have invalid CD headers and filenames come
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // from the URL.
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"attachment; filename==?iiso88591?Q?caf=EG?=",
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/test%20123",
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"test 123" JPEG_EXT
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"malformed_disposition",
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"\uc608\uc220 \uc608\uc220.jpg"},
389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invalid C-D. No filename from URL. Falls back to 'download'.
391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"attachment; filename==?iso88591?Q?caf=E3?",
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.google.com/path1/path2/",
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "image/jpeg",
394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download" JPEG_EXT
395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Issue=5772.
398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"",
399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/foo.tar.gz",
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-tar",
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"foo.tar.gz"},
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Issue=52250.
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"",
405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/foo.tgz",
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-tar",
407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"foo.tgz"},
408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Issue=7337.
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"",
411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://maged.lordaeron.org/blank.reg",
412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/x-registry",
413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"blank.reg"},
414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"",
416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/bar.tar",
417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-tar",
418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"bar.tar"},
419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"",
421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/bar.bogus",
422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "application/x-tar",
423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   L"bar.bogus"
424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  },
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // http://code.google.com/p/chromium/issues/detail?id=20337
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {"filename=.download.txt",
428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "http://www.example.com/.download.txt",
429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   "text/plain",
430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   L"download.txt"},
431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue=56855.
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  {"",
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   "http://www.example.com/bar.sh",
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   "application/x-sh",
436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   L"bar.sh"
437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  },
438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Tests to ensure that the file names we generate from hints from the server
441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// (content-disposition, URL name, etc) don't cause security holes.
442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST(DownloadUtilTest, GenerateFileName) {
443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_POSIX) && !defined(OS_MACOSX)
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // This test doesn't run when the locale is not UTF-8 because some of the
445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // string conversions fail. This is OK (we have the default value) but they
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // don't match our expectations.
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string locale = setlocale(LC_CTYPE, NULL);
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  StringToLowerASCII(&locale);
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_NE(std::string::npos, locale.find("utf-8"))
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      << "Your locale (" << locale << ") must be set to UTF-8 "
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      << "for this test to pass!";
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kGenerateFileNameTestCases); ++i) {
455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FilePath generated_name;
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_util::GenerateFileName(GURL(kGenerateFileNameTestCases[i].url),
457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    kGenerateFileNameTestCases[i].disposition,
458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "",
459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    kGenerateFileNameTestCases[i].mime_type,
460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &generated_name);
461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    EXPECT_EQ(kGenerateFileNameTestCases[i].expected_name,
462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              file_util::FilePathAsWString(generated_name)) << i;
463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kGenerateFileNameTestCases); ++i) {
466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FilePath generated_name;
467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_util::GenerateFileName(GURL(kGenerateFileNameTestCases[i].url),
468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    kGenerateFileNameTestCases[i].disposition,
469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "GBK",
470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    kGenerateFileNameTestCases[i].mime_type,
471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &generated_name);
472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    EXPECT_EQ(kGenerateFileNameTestCases[i].expected_name,
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              file_util::FilePathAsWString(generated_name)) << i;
474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A couple of cases with raw 8bit characters in C-D.
477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {
478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FilePath generated_name;
479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_util::GenerateFileName(GURL("http://www.example.com/images?id=3"),
480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "attachment; filename=caf\xc3\xa9.png",
481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "iso-8859-1",
482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "image/png",
483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &generated_name);
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    EXPECT_EQ(L"caf\u00e9.png", file_util::FilePathAsWString(generated_name));
485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  {
488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FilePath generated_name;
489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_util::GenerateFileName(GURL("http://www.example.com/images?id=3"),
490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "attachment; filename=caf\xe5.png",
491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "windows-1253",
492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    "image/png",
493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    &generated_name);
494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    EXPECT_EQ(L"caf\u03b5.png", file_util::FilePathAsWString(generated_name));
495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst struct {
499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const FilePath::CharType* path;
500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const char* mime_type;
501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const FilePath::CharType* expected_path;
502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} kSafeFilenameCases[] = {
503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_WIN)
504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\bar.htm"),
505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\foo\\bar.htm") },
507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\bar.html"),
508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\foo\\bar.html") },
510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\bar"),
511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\foo\\bar.htm") },
513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\bar.html"),
515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/png",
516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("C:\\bar.html") },
517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\bar"),
518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/png",
519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\bar.png") },
520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("C:\\foo\\bar.exe") },
524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/gif",
526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("C:\\foo\\bar.exe") },
527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\google.com"),
529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("C:\\foo\\google.com") },
531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\con.htm"),
533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\foo\\_con.htm") },
535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("C:\\foo\\con"),
536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("C:\\foo\\_con.htm") },
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else  // !defined(OS_WIN)
539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/bar.htm"),
540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/foo/bar.htm") },
542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/bar.html"),
543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/foo/bar.html") },
545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/bar"),
546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/foo/bar.html") },
548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/bar.html"),
550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/png",
551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("/bar.html") },
552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/bar"),
553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/png",
554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/bar.png") },
555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/bar.exe"),
557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "image/gif",
558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("/foo/bar.exe") },
559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/google.com"),
561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    FILE_PATH_LITERAL("/foo/google.com") },
563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/con.htm"),
565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/foo/con.htm") },
567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  { FILE_PATH_LITERAL("/foo/con"),
568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    "text/html",
569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FILE_PATH_LITERAL("/foo/con.html") },
570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // !defined(OS_WIN)
571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST(DownloadUtilTest, GenerateSafeFileName) {
574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kSafeFilenameCases); ++i) {
575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    FilePath path(kSafeFilenameCases[i].path);
576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    download_util::GenerateSafeFileName(kSafeFilenameCases[i].mime_type, &path);
577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(kSafeFilenameCases[i].expected_path, path.value()) << i;
578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
583