| Index: content/browser/loader/resource_loader.cc
|
| diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc
|
| index eee044c6aaf87a0119371de0a8722a239657692f..c831fc848ffb7a052e37201a6cb49e7c95f673fe 100644
|
| --- a/content/browser/loader/resource_loader.cc
|
| +++ b/content/browser/loader/resource_loader.cc
|
| @@ -19,20 +19,21 @@
|
| #include "content/browser/loader/detachable_resource_handler.h"
|
| #include "content/browser/loader/resource_loader_delegate.h"
|
| #include "content/browser/loader/resource_request_info_impl.h"
|
| #include "content/browser/service_worker/service_worker_request_handler.h"
|
| #include "content/browser/ssl/ssl_client_auth_handler.h"
|
| #include "content/browser/ssl/ssl_manager.h"
|
| #include "content/browser/ssl/ssl_policy.h"
|
| #include "content/common/ssl_status_serialization.h"
|
| #include "content/public/browser/cert_store.h"
|
| #include "content/public/browser/resource_context.h"
|
| +#include "content/public/browser/resource_dispatcher_host_delegate.h"
|
| #include "content/public/browser/resource_dispatcher_host_login_delegate.h"
|
| #include "content/public/browser/signed_certificate_timestamp_store.h"
|
| #include "content/public/common/content_client.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "content/public/common/process_type.h"
|
| #include "content/public/common/resource_response.h"
|
| #include "content/public/common/security_style.h"
|
| #include "net/base/io_buffer.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/http/http_response_headers.h"
|
| @@ -75,40 +76,46 @@ void GetSSLStatusForRequest(const GURL& url,
|
| StoreSignedCertificateTimestamps(ssl_info.signed_certificate_timestamps,
|
| child_id, &signed_certificate_timestamp_ids);
|
|
|
| *ssl_status = SSLStatus(SSLPolicy::GetSecurityStyleForResource(
|
| url, cert_id, ssl_info.cert_status),
|
| cert_id, signed_certificate_timestamp_ids, ssl_info);
|
| }
|
|
|
| void PopulateResourceResponse(ResourceRequestInfoImpl* info,
|
| net::URLRequest* request,
|
| + ResourceDispatcherHostDelegate* host_delegate,
|
| + ResourceContext* resource_context,
|
| ResourceResponse* response) {
|
| response->head.request_time = request->request_time();
|
| response->head.response_time = request->response_time();
|
| response->head.headers = request->response_headers();
|
| request->GetCharset(&response->head.charset);
|
| response->head.content_length = request->GetExpectedContentSize();
|
| request->GetMimeType(&response->head.mime_type);
|
| net::HttpResponseInfo response_info = request->response_info();
|
| response->head.was_fetched_via_spdy = response_info.was_fetched_via_spdy;
|
| response->head.was_npn_negotiated = response_info.was_npn_negotiated;
|
| response->head.npn_negotiated_protocol =
|
| response_info.npn_negotiated_protocol;
|
| response->head.connection_info = response_info.connection_info;
|
| response->head.was_fetched_via_proxy = request->was_fetched_via_proxy();
|
| response->head.proxy_server = response_info.proxy_server;
|
| response->head.socket_address = request->GetSocketAddress();
|
| const content::ResourceRequestInfo* request_info =
|
| content::ResourceRequestInfo::ForRequest(request);
|
| if (request_info)
|
| response->head.is_using_lofi = request_info->IsUsingLoFi();
|
| + response->head.used_data_reduction_proxy =
|
| + resource_context && host_delegate &&
|
| + host_delegate->UsedDataReductionProxy(request->proxy_server(),
|
| + resource_context);
|
| if (ServiceWorkerRequestHandler* handler =
|
| ServiceWorkerRequestHandler::GetHandler(request)) {
|
| handler->GetExtraResponseInfo(&response->head);
|
| }
|
| AppCacheInterceptor::GetExtraResponseInfo(
|
| request, &response->head.appcache_id,
|
| &response->head.appcache_manifest_url);
|
| if (info->is_load_timing_enabled())
|
| request->GetLoadTimingInfo(&response->head.load_timing);
|
|
|
| @@ -126,25 +133,29 @@ void PopulateResourceResponse(ResourceRequestInfoImpl* info,
|
| DCHECK_EQ(request->ssl_info().security_bits, -1);
|
| DCHECK_EQ(request->ssl_info().key_exchange_info, 0);
|
| DCHECK(!request->ssl_info().connection_status);
|
| }
|
| }
|
|
|
| } // namespace
|
|
|
| ResourceLoader::ResourceLoader(scoped_ptr<net::URLRequest> request,
|
| scoped_ptr<ResourceHandler> handler,
|
| - ResourceLoaderDelegate* delegate)
|
| + ResourceLoaderDelegate* delegate,
|
| + ResourceDispatcherHostDelegate* host_delegate,
|
| + ResourceContext* resource_context)
|
| : deferred_stage_(DEFERRED_NONE),
|
| request_(std::move(request)),
|
| handler_(std::move(handler)),
|
| delegate_(delegate),
|
| + host_delegate_(host_delegate),
|
| + resource_context_(resource_context),
|
| is_transferring_(false),
|
| times_cancelled_before_request_start_(0),
|
| started_request_(false),
|
| times_cancelled_after_request_start_(0),
|
| weak_ptr_factory_(this) {
|
| request_->set_delegate(this);
|
| handler_->SetController(this);
|
| }
|
|
|
| ResourceLoader::~ResourceLoader() {
|
| @@ -259,21 +270,22 @@ void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused,
|
|
|
| delegate_->DidReceiveRedirect(this, redirect_info.new_url);
|
|
|
| if (delegate_->HandleExternalProtocol(this, redirect_info.new_url)) {
|
| // The request is complete so we can remove it.
|
| CancelAndIgnore();
|
| return;
|
| }
|
|
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse());
|
| - PopulateResourceResponse(info, request_.get(), response.get());
|
| + PopulateResourceResponse(info, request_.get(), host_delegate_,
|
| + resource_context_, response.get());
|
| if (!handler_->OnRequestRedirected(redirect_info, response.get(), defer)) {
|
| Cancel();
|
| } else if (*defer) {
|
| deferred_stage_ = DEFERRED_REDIRECT; // Follow redirect when resumed.
|
| }
|
| }
|
|
|
| void ResourceLoader::OnAuthRequired(net::URLRequest* unused,
|
| net::AuthChallengeInfo* auth_info) {
|
| DCHECK_EQ(request_.get(), unused);
|
| @@ -531,21 +543,22 @@ void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) {
|
| // this request.
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| }
|
|
|
| void ResourceLoader::CompleteResponseStarted() {
|
| ResourceRequestInfoImpl* info = GetRequestInfo();
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse());
|
| - PopulateResourceResponse(info, request_.get(), response.get());
|
| + PopulateResourceResponse(info, request_.get(), host_delegate_,
|
| + resource_context_, response.get());
|
|
|
| delegate_->DidReceiveResponse(this);
|
|
|
| // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()"));
|
|
|
| bool defer = false;
|
| if (!handler_->OnResponseStarted(response.get(), &defer)) {
|
| Cancel();
|
|
|