1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/url_request/file_protocol_handler.h" 6 7 #include "base/logging.h" 8 #include "base/task_runner.h" 9 #include "net/base/net_errors.h" 10 #include "net/base/net_util.h" 11 #include "net/url_request/url_request.h" 12 #include "net/url_request/url_request_error_job.h" 13 #include "net/url_request/url_request_file_dir_job.h" 14 #include "net/url_request/url_request_file_job.h" 15 16 namespace net { 17 18 FileProtocolHandler::FileProtocolHandler( 19 const scoped_refptr<base::TaskRunner>& file_task_runner) 20 : file_task_runner_(file_task_runner) {} 21 22 FileProtocolHandler::~FileProtocolHandler() {} 23 24 URLRequestJob* FileProtocolHandler::MaybeCreateJob( 25 URLRequest* request, NetworkDelegate* network_delegate) const { 26 base::FilePath file_path; 27 const bool is_file = FileURLToFilePath(request->url(), &file_path); 28 29 // Check file access permissions. 30 if (!network_delegate || 31 !network_delegate->CanAccessFile(*request, file_path)) { 32 return new URLRequestErrorJob(request, network_delegate, ERR_ACCESS_DENIED); 33 } 34 35 // We need to decide whether to create URLRequestFileJob for file access or 36 // URLRequestFileDirJob for directory access. To avoid accessing the 37 // filesystem, we only look at the path string here. 38 // The code in the URLRequestFileJob::Start() method discovers that a path, 39 // which doesn't end with a slash, should really be treated as a directory, 40 // and it then redirects to the URLRequestFileDirJob. 41 if (is_file && 42 file_path.EndsWithSeparator() && 43 file_path.IsAbsolute()) { 44 return new URLRequestFileDirJob(request, network_delegate, file_path); 45 } 46 47 // Use a regular file request job for all non-directories (including invalid 48 // file names). 49 return new URLRequestFileJob(request, network_delegate, file_path, 50 file_task_runner_); 51 } 52 53 bool FileProtocolHandler::IsSafeRedirectTarget(const GURL& location) const { 54 return false; 55 } 56 57 } // namespace net 58