diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index d7af5880279..53aef95b765 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -80,16 +80,13 @@ class CustomProtocolRequestJob : public AdapterRequestJob { registry_(registry) { } - // AdapterRequestJob: - void GetJobTypeInUI() override { + void GetJobTypeInUI(const Protocol::JsProtocolHandler& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); v8::Locker locker(registry_->isolate()); v8::HandleScope handle_scope(registry_->isolate()); // Call the JS handler. - Protocol::JsProtocolHandler callback = - registry_->GetProtocolHandler(request()->url().scheme()); v8::Local result = callback.Run(request()); // Determine the type of the job we are going to create. @@ -172,6 +169,14 @@ class CustomProtocolRequestJob : public AdapterRequestJob { GetWeakPtr(), net::ERR_NOT_IMPLEMENTED)); } + // AdapterRequestJob: + void GetJobType() override { + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(&CustomProtocolRequestJob::GetJobTypeInUI, + base::Unretained(this), + registry_->GetProtocolHandler(request()->url().scheme()))); + } + private: Protocol* registry_; // Weak, the Protocol class is expected to live forever. }; diff --git a/atom/browser/net/adapter_request_job.cc b/atom/browser/net/adapter_request_job.cc index d9c9b467d48..5c41c6f65aa 100644 --- a/atom/browser/net/adapter_request_job.cc +++ b/atom/browser/net/adapter_request_job.cc @@ -27,11 +27,7 @@ AdapterRequestJob::AdapterRequestJob(ProtocolHandler* protocol_handler, void AdapterRequestJob::Start() { DCHECK(!real_job_.get()); - content::BrowserThread::PostTask( - content::BrowserThread::UI, - FROM_HERE, - base::Bind(&AdapterRequestJob::GetJobTypeInUI, - weak_factory_.GetWeakPtr())); + GetJobType(); } void AdapterRequestJob::Kill() { @@ -43,7 +39,11 @@ bool AdapterRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read) { DCHECK(!real_job_.get()); - return real_job_->ReadRawData(buf, buf_size, bytes_read); + // Read post-filtered data if available. + if (real_job_->HasFilter()) + return real_job_->Read(buf, buf_size, bytes_read); + else + return real_job_->ReadRawData(buf, buf_size, bytes_read); } bool AdapterRequestJob::IsRedirectResponse(GURL* location, @@ -75,6 +75,11 @@ int AdapterRequestJob::GetResponseCode() const { return real_job_->GetResponseCode(); } +void AdapterRequestJob::GetLoadTimingInfo( + net::LoadTimingInfo* load_timing_info) const { + real_job_->GetLoadTimingInfo(load_timing_info); +} + base::WeakPtr AdapterRequestJob::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } @@ -131,10 +136,13 @@ void AdapterRequestJob::CreateHttpJobAndStart( void AdapterRequestJob::CreateJobFromProtocolHandlerAndStart() { real_job_ = protocol_handler_->MaybeCreateJob(request(), network_delegate()); - if (!real_job_.get()) + if (!real_job_.get()) { CreateErrorJobAndStart(net::ERR_NOT_IMPLEMENTED); - else + } else { + // Copy headers from original request. + real_job_->SetExtraRequestHeaders(request()->extra_request_headers()); real_job_->Start(); + } } } // namespace atom diff --git a/atom/browser/net/adapter_request_job.h b/atom/browser/net/adapter_request_job.h index 768718584d0..b1d28b1446c 100644 --- a/atom/browser/net/adapter_request_job.h +++ b/atom/browser/net/adapter_request_job.h @@ -46,13 +46,15 @@ class AdapterRequestJob : public net::URLRequestJob { bool GetCharset(std::string* charset) override; void GetResponseInfo(net::HttpResponseInfo* info) override; int GetResponseCode() const override; + void GetLoadTimingInfo( + net::LoadTimingInfo* load_timing_info) const override; base::WeakPtr GetWeakPtr(); ProtocolHandler* default_protocol_handler() { return protocol_handler_; } // Override this function to determine which job should be started. - virtual void GetJobTypeInUI() = 0; + virtual void GetJobType() = 0; void CreateErrorJobAndStart(int error_code); void CreateStringJobAndStart(const std::string& mime_type,