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