// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/base/net_util.h" #include "base/string_util.h" #include "googleurl/src/gurl.h" #include "net/base/escape.h" namespace net { bool FileURLToFilePath(const GURL& url, std::wstring* file_path) { file_path->clear(); if (!url.is_valid()) return false; // Firefox seems to ignore the "host" of a file url if there is one. That is, // file://foo/bar.txt maps to /bar.txt. std::string path = url.path(); if (path.empty()) return false; // GURL stores strings as percent-encoded 8-bit, this will undo if possible. path = UnescapeURLComponent(path, UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); // Collapse multiple path slashes into a single path slash. std::string new_path; do { new_path = path; ReplaceSubstringsAfterOffset(&new_path, 0, "//", "/"); path.swap(new_path); } while (new_path != path); // TODO(tc): This should actually be 8-bit to wide. We may lose data if the // string isn't UTF-8. file_path->assign(UTF8ToWide(path)); return !file_path->empty(); } } // namespace net