diff --git a/atom/browser/net/adapter_request_job.cc b/atom/browser/net/adapter_request_job.cc index 6b5b905aba2e..f57592392ec8 100644 --- a/atom/browser/net/adapter_request_job.cc +++ b/atom/browser/net/adapter_request_job.cc @@ -6,6 +6,8 @@ #include "base/threading/sequenced_worker_pool.h" #include "atom/browser/net/url_request_string_job.h" +#include "atom/browser/net/asar/url_request_asar_job.h" +#include "atom/common/asar/asar_util.h" #include "content/public/browser/browser_thread.h" #include "net/base/net_errors.h" #include "net/url_request/url_request_error_job.h" @@ -88,13 +90,33 @@ void AdapterRequestJob::CreateStringJobAndStart(const std::string& mime_type, void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); - real_job_ = new net::URLRequestFileJob( - request(), - network_delegate(), - path, - content::BrowserThread::GetBlockingPool()-> - GetTaskRunnerWithShutdownBehavior( - base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); + base::FilePath asar_path, relative_path; + if (!asar::GetAsarArchivePath(path, &asar_path, &relative_path)) { + real_job_ = new net::URLRequestFileJob( + request(), + network_delegate(), + path, + content::BrowserThread::GetBlockingPool()-> + GetTaskRunnerWithShutdownBehavior( + base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); + } else { + auto archive = asar::GetOrCreateAsarArchive(asar_path); + if (!archive) + real_job_ = new net::URLRequestErrorJob( + request(), + network_delegate(), + net::ERR_FILE_NOT_FOUND); + + real_job_ = new asar::URLRequestAsarJob( + request(), + network_delegate(), + archive, + relative_path, + content::BrowserThread::GetBlockingPool()-> + GetTaskRunnerWithShutdownBehavior( + base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); + } + real_job_->Start(); } diff --git a/spec/api-protocol-spec.coffee b/spec/api-protocol-spec.coffee index b0b152aa5fd9..bf7408df2b26 100644 --- a/spec/api-protocol-spec.coffee +++ b/spec/api-protocol-spec.coffee @@ -74,6 +74,23 @@ describe 'protocol module', -> assert false, 'Got error: ' + errorType + ' ' + error protocol.unregisterProtocol 'atom-file-job' + it 'returns RequestFileJob should send file from asar archive', (done) -> + p = path.join __dirname, 'fixtures', 'asar', 'a.asar', 'file1' + job = new protocol.RequestFileJob(p) + handler = remote.createFunctionWithReturnValue job + protocol.registerProtocol 'atom-file-job', handler + + $.ajax + url: 'atom-file-job://' + p + success: (data) -> + content = require('fs').readFileSync(p) + assert.equal data, String(content) + protocol.unregisterProtocol 'atom-file-job' + done() + error: (xhr, errorType, error) -> + assert false, 'Got error: ' + errorType + ' ' + error + protocol.unregisterProtocol 'atom-file-job' + describe 'protocol.isHandledProtocol', -> it 'returns true if the scheme can be handled', -> assert.equal protocol.isHandledProtocol('file'), true