Home | History | Annotate | Download | only in url_request
      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/filename_util.h"
     10 #include "net/base/net_errors.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