Index: trunk/src/net/url_request/url_request_file_job.cc |
=================================================================== |
--- trunk/src/net/url_request/url_request_file_job.cc (revision 188924) |
+++ trunk/src/net/url_request/url_request_file_job.cc (working copy) |
@@ -62,6 +62,34 @@ |
weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
} |
+// static |
+URLRequestJob* URLRequestFileJob::Factory(URLRequest* request, |
+ NetworkDelegate* network_delegate, |
+ const std::string& scheme) { |
+ base::FilePath file_path; |
+ const bool is_file = FileURLToFilePath(request->url(), &file_path); |
+ |
+ // Check file access permissions. |
+ if (!network_delegate || |
+ !network_delegate->CanAccessFile(*request, file_path)) { |
+ return new URLRequestErrorJob(request, network_delegate, ERR_ACCESS_DENIED); |
+ } |
+ // We need to decide whether to create URLRequestFileJob for file access or |
+ // URLRequestFileDirJob for directory access. To avoid accessing the |
+ // filesystem, we only look at the path string here. |
+ // The code in the URLRequestFileJob::Start() method discovers that a path, |
+ // which doesn't end with a slash, should really be treated as a directory, |
+ // and it then redirects to the URLRequestFileDirJob. |
+ if (is_file && |
+ file_util::EndsWithSeparator(file_path) && |
+ file_path.IsAbsolute()) |
+ return new URLRequestFileDirJob(request, network_delegate, file_path); |
+ |
+ // Use a regular file request job for all non-directories (including invalid |
+ // file names). |
+ return new URLRequestFileJob(request, network_delegate, file_path); |
+} |
+ |
void URLRequestFileJob::Start() { |
FileMetaInfo* meta_info = new FileMetaInfo(); |
base::WorkerPool::PostTaskAndReply( |