Chromium Code Reviews| Index: android_webview/browser/aw_request_handler.cc |
| diff --git a/android_webview/browser/aw_request_handler.cc b/android_webview/browser/aw_request_handler.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b813273dce6041b024a3b7a2eb33f758393a7158 |
| --- /dev/null |
| +++ b/android_webview/browser/aw_request_handler.cc |
| @@ -0,0 +1,75 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "android_webview/browser/aw_request_handler.h" |
| + |
| +#include "android_webview/browser/aw_contents_io_thread_client.h" |
| +#include "android_webview/browser/aw_web_resource_response.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/resource_request_info.h" |
| +#include "net/url_request/url_request.h" |
| +#include "net/url_request/url_request_job.h" |
| + |
| +namespace android_webview { |
| + |
| +AwRequestHandler::AwRequestHandler() { |
| +} |
| + |
| +AwRequestHandler::~AwRequestHandler() { |
| +} |
| + |
| +AndroidStreamReaderURLRequestJob* AwRequestHandler::MaybeInterceptRequest( |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| + if (job_.get()) return nullptr; |
|
boliu
2015/09/28 23:26:28
This probably deserves a comment. I think this is
mnaganov (inactive)
2015/09/29 00:14:06
Done.
|
| + |
| + if (!QueryForAwWebResourceResponse(request)) |
| + return nullptr; |
| + job_ = new AndroidStreamReaderURLRequestJob(request, network_delegate); |
| + return job_.get(); |
| +} |
| + |
| +bool AwRequestHandler::QueryForAwWebResourceResponse(net::URLRequest* request) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| + |
| + int render_process_id, render_frame_id; |
| + if (!content::ResourceRequestInfo::GetRenderFrameForRequest( |
| + request, &render_process_id, &render_frame_id)) { |
| + return false; |
| + } |
| + |
| + scoped_ptr<AwContentsIoThreadClient> io_thread_client = |
| + AwContentsIoThreadClient::FromID(render_process_id, render_frame_id); |
| + |
| + if (!io_thread_client.get()) |
| + return false; |
| + |
| + GURL referrer(request->referrer()); |
| + if (referrer.is_valid() && |
| + (!request->is_pending() || request->is_redirecting())) { |
| + request->SetExtraRequestHeaderByName(net::HttpRequestHeaders::kReferer, |
| + referrer.spec(), true); |
| + } |
| + io_thread_client->ShouldInterceptRequestAsync( |
| + request, |
| + base::Bind(&AwRequestHandler::QueryForAwWebResourceResponseDone, this)); |
| + return true; |
| +} |
| + |
| +void AwRequestHandler::QueryForAwWebResourceResponseDone( |
| + scoped_ptr<AwWebResourceResponse> response) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| + if (!job_.get()) return; |
| + |
| + if (response) { |
| + // The job will own the AwWebResourceResponse. |
| + AwWebResourceResponse::JobDeliverResponseFromEmbedder(job_.get(), |
| + response.Pass()); |
| + } else { |
| + job_->DeliverResponseFromNetwork(); |
| + } |
| +} |
| + |
| +} // namespace android_webview |