| Index: net/url_request/url_request_http_job.cc
|
| diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
|
| index 06214e63d21fcd065d60b8af0bf314c8eb819e3f..0fb9d13e3ad3b91d338c9d233aed37919ed29b25 100644
|
| --- a/net/url_request/url_request_http_job.cc
|
| +++ b/net/url_request/url_request_http_job.cc
|
| @@ -172,8 +172,7 @@ URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request,
|
| const std::string& scheme) {
|
| DCHECK(scheme == "http" || scheme == "https");
|
|
|
| - if (!request->context() ||
|
| - !request->context()->http_transaction_factory()) {
|
| + if (!request->context()->http_transaction_factory()) {
|
| NOTREACHED() << "requires a valid context";
|
| return new URLRequestErrorJob(request, ERR_INVALID_ARGUMENT);
|
| }
|
| @@ -181,12 +180,32 @@ URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request,
|
| GURL redirect_url;
|
| if (request->GetHSTSRedirect(&redirect_url))
|
| return new URLRequestRedirectJob(request, redirect_url);
|
| - return new URLRequestHttpJob(request);
|
| -}
|
| -
|
| -
|
| -URLRequestHttpJob::URLRequestHttpJob(URLRequest* request)
|
| - : URLRequestJob(request, request->context()->network_delegate()),
|
| + return new URLRequestHttpJob(
|
| + request,
|
| + request->context()->http_transaction_factory(),
|
| + request->context()->network_delegate(),
|
| + request->context()->throttler_manager(),
|
| + request->context()->accept_language(),
|
| + request->context()->accept_charset(),
|
| + request->context()->cookie_store(),
|
| + request->context()->fraudulent_certificate_reporter(),
|
| + request->context()->ssl_config_service(),
|
| + request->context()->transport_security_state());
|
| +}
|
| +
|
| +
|
| +URLRequestHttpJob::URLRequestHttpJob(
|
| + URLRequest* request,
|
| + HttpTransactionFactory* http_transaction_factory,
|
| + NetworkDelegate* network_delegate,
|
| + URLRequestThrottlerManager* throttler_manager,
|
| + const std::string& accept_language,
|
| + const std::string& accept_charset,
|
| + CookieStore* cookie_store,
|
| + FraudulentCertificateReporter* fraudulent_certificate_reporter,
|
| + SSLConfigService* ssl_config_service,
|
| + TransportSecurityState* transport_security_state)
|
| + : URLRequestJob(request, network_delegate),
|
| response_info_(NULL),
|
| response_cookies_save_index_(0),
|
| proxy_auth_state_(AUTH_STATE_DONT_NEED_AUTH),
|
| @@ -217,7 +236,16 @@ URLRequestHttpJob::URLRequestHttpJob(URLRequest* request)
|
| base::Bind(&URLRequestHttpJob::OnHeadersReceivedCallback,
|
| base::Unretained(this)))),
|
| awaiting_callback_(false),
|
| - http_transaction_delegate_(new HttpTransactionDelegateImpl(request)) {
|
| + http_transaction_delegate_(new HttpTransactionDelegateImpl(request)),
|
| + http_transaction_factory_(http_transaction_factory),
|
| + network_delegate_(network_delegate),
|
| + accept_language_(accept_language),
|
| + accept_charset_(accept_charset),
|
| + cookie_store_(cookie_store),
|
| + fraudulent_certificate_reporter_(fraudulent_certificate_reporter),
|
| + ssl_config_service_(ssl_config_service),
|
| + transport_security_state_(transport_security_state) {
|
| + DCHECK(http_transaction_factory_);
|
| URLRequestThrottlerManager* manager = request->context()->throttler_manager();
|
| if (manager)
|
| throttling_entry_ = manager->RegisterRequestUrl(request->url());
|
| @@ -294,8 +322,8 @@ void URLRequestHttpJob::DestroyTransaction() {
|
| }
|
|
|
| void URLRequestHttpJob::StartTransaction() {
|
| - if (request_->context() && request_->context()->network_delegate()) {
|
| - int rv = request_->context()->network_delegate()->NotifyBeforeSendHeaders(
|
| + if (network_delegate_) {
|
| + int rv = network_delegate_->NotifyBeforeSendHeaders(
|
| request_, notify_before_headers_sent_callback_,
|
| &request_info_.extra_headers);
|
| // If an extension blocks the request, we rely on the callback to
|
| @@ -332,19 +360,14 @@ void URLRequestHttpJob::StartTransactionInternal() {
|
|
|
| int rv;
|
|
|
| - if (request_->context() && request_->context()->network_delegate()) {
|
| - request_->context()->network_delegate()->NotifySendHeaders(
|
| - request_, request_info_.extra_headers);
|
| - }
|
| + if (network_delegate_)
|
| + network_delegate_->NotifySendHeaders(request_, request_info_.extra_headers);
|
|
|
| if (transaction_.get()) {
|
| rv = transaction_->RestartWithAuth(auth_credentials_, start_callback_);
|
| auth_credentials_ = AuthCredentials();
|
| } else {
|
| - DCHECK(request_->context());
|
| - DCHECK(request_->context()->http_transaction_factory());
|
| -
|
| - rv = request_->context()->http_transaction_factory()->CreateTransaction(
|
| + rv = http_transaction_factory_->CreateTransaction(
|
| &transaction_, http_transaction_delegate_.get());
|
| if (rv == OK) {
|
| if (!throttling_entry_ ||
|
| @@ -434,20 +457,17 @@ void URLRequestHttpJob::AddExtraHeaders() {
|
| }
|
| }
|
|
|
| - const URLRequestContext* context = request_->context();
|
| - if (context) {
|
| - // Only add default Accept-Language and Accept-Charset if the request
|
| - // didn't have them specified.
|
| - if (!context->accept_language().empty()) {
|
| - request_info_.extra_headers.SetHeaderIfMissing(
|
| - HttpRequestHeaders::kAcceptLanguage,
|
| - context->accept_language());
|
| - }
|
| - if (!context->accept_charset().empty()) {
|
| - request_info_.extra_headers.SetHeaderIfMissing(
|
| - HttpRequestHeaders::kAcceptCharset,
|
| - context->accept_charset());
|
| - }
|
| + // Only add default Accept-Language and Accept-Charset if the request
|
| + // didn't have them specified.
|
| + if (!accept_language_.empty()) {
|
| + request_info_.extra_headers.SetHeaderIfMissing(
|
| + HttpRequestHeaders::kAcceptLanguage,
|
| + accept_language_);
|
| + }
|
| + if (!accept_charset_.empty()) {
|
| + request_info_.extra_headers.SetHeaderIfMissing(
|
| + HttpRequestHeaders::kAcceptCharset,
|
| + accept_charset_);
|
| }
|
| }
|
|
|
| @@ -460,10 +480,8 @@ void URLRequestHttpJob::AddCookieHeaderAndStart() {
|
| if (!request_)
|
| return;
|
|
|
| - CookieStore* cookie_store =
|
| - request_->context()->cookie_store();
|
| - if (cookie_store && !(request_info_.load_flags & LOAD_DO_NOT_SEND_COOKIES)) {
|
| - net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster();
|
| + if (cookie_store_ && !(request_info_.load_flags & LOAD_DO_NOT_SEND_COOKIES)) {
|
| + net::CookieMonster* cookie_monster = cookie_store_->GetCookieMonster();
|
| if (cookie_monster) {
|
| cookie_monster->GetAllCookiesForURLAsync(
|
| request_->url(),
|
| @@ -480,7 +498,7 @@ void URLRequestHttpJob::AddCookieHeaderAndStart() {
|
| void URLRequestHttpJob::DoLoadCookies() {
|
| CookieOptions options;
|
| options.set_include_httponly();
|
| - request_->context()->cookie_store()->GetCookiesWithInfoAsync(
|
| + cookie_store_->GetCookiesWithInfoAsync(
|
| request_->url(), options,
|
| base::Bind(&URLRequestHttpJob::OnCookiesLoaded,
|
| weak_factory_.GetWeakPtr()));
|
| @@ -557,7 +575,7 @@ void URLRequestHttpJob::SaveNextCookie() {
|
| new SharedBoolean(true);
|
|
|
| if (!(request_info_.load_flags & LOAD_DO_NOT_SAVE_COOKIES) &&
|
| - request_->context()->cookie_store() &&
|
| + cookie_store_ &&
|
| response_cookies_.size() > 0) {
|
| CookieOptions options;
|
| options.set_include_httponly();
|
| @@ -576,7 +594,7 @@ void URLRequestHttpJob::SaveNextCookie() {
|
| if (CanSetCookie(
|
| response_cookies_[response_cookies_save_index_], &options)) {
|
| callback_pending->data = true;
|
| - request_->context()->cookie_store()->SetCookieWithOptionsAsync(
|
| + cookie_store_->SetCookieWithOptionsAsync(
|
| request_->url(), response_cookies_[response_cookies_save_index_],
|
| options, callback);
|
| }
|
| @@ -644,27 +662,27 @@ void URLRequestHttpJob::FetchResponseCookies(
|
| void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() {
|
| DCHECK(response_info_);
|
|
|
| - const URLRequestContext* ctx = request_->context();
|
| const SSLInfo& ssl_info = response_info_->ssl_info;
|
|
|
| // Only accept strict transport security headers on HTTPS connections that
|
| // have no certificate errors.
|
| if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) ||
|
| - !ctx || !ctx->transport_security_state()) {
|
| + !transport_security_state_) {
|
| return;
|
| }
|
|
|
| - TransportSecurityState* security_state = ctx->transport_security_state();
|
| TransportSecurityState::DomainState domain_state;
|
| const std::string& host = request_info_.url.host();
|
|
|
| bool sni_available =
|
| - SSLConfigService::IsSNIAvailable(ctx->ssl_config_service());
|
| - if (!security_state->GetDomainState(host, sni_available, &domain_state))
|
| + SSLConfigService::IsSNIAvailable(ssl_config_service_);
|
| + if (!transport_security_state_->GetDomainState(
|
| + host, sni_available, &domain_state)) {
|
| // |GetDomainState| may have altered |domain_state| while searching. If
|
| // not found, start with a fresh state.
|
| domain_state.upgrade_mode =
|
| TransportSecurityState::DomainState::MODE_FORCE_HTTPS;
|
| + }
|
|
|
| HttpResponseHeaders* headers = GetResponseHeaders();
|
| std::string value;
|
| @@ -674,34 +692,34 @@ void URLRequestHttpJob::ProcessStrictTransportSecurityHeader() {
|
| while (headers->EnumerateHeader(&iter, "Strict-Transport-Security", &value)) {
|
| TransportSecurityState::DomainState domain_state;
|
| if (domain_state.ParseSTSHeader(now, value))
|
| - security_state->EnableHost(host, domain_state);
|
| + transport_security_state_->EnableHost(host, domain_state);
|
| }
|
| }
|
|
|
| void URLRequestHttpJob::ProcessPublicKeyPinsHeader() {
|
| DCHECK(response_info_);
|
|
|
| - const URLRequestContext* ctx = request_->context();
|
| const SSLInfo& ssl_info = response_info_->ssl_info;
|
|
|
| // Only accept public key pins headers on HTTPS connections that have no
|
| // certificate errors.
|
| if (!ssl_info.is_valid() || IsCertStatusError(ssl_info.cert_status) ||
|
| - !ctx || !ctx->transport_security_state()) {
|
| + !transport_security_state_) {
|
| return;
|
| }
|
|
|
| - TransportSecurityState* security_state = ctx->transport_security_state();
|
| TransportSecurityState::DomainState domain_state;
|
| const std::string& host = request_info_.url.host();
|
|
|
| bool sni_available =
|
| - SSLConfigService::IsSNIAvailable(ctx->ssl_config_service());
|
| - if (!security_state->GetDomainState(host, sni_available, &domain_state))
|
| + SSLConfigService::IsSNIAvailable(ssl_config_service_);
|
| + if (!transport_security_state_->GetDomainState(
|
| + host, sni_available, &domain_state)) {
|
| // |GetDomainState| may have altered |domain_state| while searching. If
|
| // not found, start with a fresh state.
|
| domain_state.upgrade_mode =
|
| TransportSecurityState::DomainState::MODE_DEFAULT;
|
| + }
|
|
|
| HttpResponseHeaders* headers = GetResponseHeaders();
|
| void* iter = NULL;
|
| @@ -713,7 +731,7 @@ void URLRequestHttpJob::ProcessPublicKeyPinsHeader() {
|
| // correctly), but does not completely overwrite it. It just updates the
|
| // dynamic pinning metadata.
|
| if (domain_state.ParsePinsHeader(now, value, ssl_info))
|
| - security_state->EnableHost(host, domain_state);
|
| + transport_security_state_->EnableHost(host, domain_state);
|
| }
|
| }
|
|
|
| @@ -732,29 +750,26 @@ void URLRequestHttpJob::OnStartCompleted(int result) {
|
| // Clear the IO_PENDING status
|
| SetStatus(URLRequestStatus());
|
|
|
| - const URLRequestContext* context = request_->context();
|
| -
|
| if (result == ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN &&
|
| transaction_->GetResponseInfo() != NULL) {
|
| - FraudulentCertificateReporter* reporter =
|
| - context->fraudulent_certificate_reporter();
|
| - if (reporter != NULL) {
|
| + if (fraudulent_certificate_reporter_) {
|
| const SSLInfo& ssl_info = transaction_->GetResponseInfo()->ssl_info;
|
| bool sni_available = SSLConfigService::IsSNIAvailable(
|
| - context->ssl_config_service());
|
| + ssl_config_service_);
|
| const std::string& host = request_->url().host();
|
|
|
| - reporter->SendReport(host, ssl_info, sni_available);
|
| + fraudulent_certificate_reporter_->SendReport(
|
| + host, ssl_info, sni_available);
|
| }
|
| }
|
|
|
| if (result == OK) {
|
| scoped_refptr<HttpResponseHeaders> headers = GetResponseHeaders();
|
| - if (context && context->network_delegate()) {
|
| + if (network_delegate_) {
|
| // Note that |this| may not be deleted until
|
| // |on_headers_received_callback_| or
|
| // |NetworkDelegate::URLRequestDestroyed()| has been called.
|
| - int error = context->network_delegate()->
|
| + int error = network_delegate_->
|
| NotifyHeadersReceived(request_, on_headers_received_callback_,
|
| headers, &override_response_headers_);
|
| if (error != net::OK) {
|
| @@ -779,12 +794,11 @@ void URLRequestHttpJob::OnStartCompleted(int result) {
|
| // what we should do.
|
|
|
| TransportSecurityState::DomainState domain_state;
|
| - const URLRequestContext* context = request_->context();
|
| const bool fatal =
|
| - context->transport_security_state() &&
|
| - context->transport_security_state()->GetDomainState(
|
| + transport_security_state_ &&
|
| + transport_security_state_->GetDomainState(
|
| request_info_.url.host(),
|
| - SSLConfigService::IsSNIAvailable(context->ssl_config_service()),
|
| + SSLConfigService::IsSNIAvailable(ssl_config_service_),
|
| &domain_state);
|
| NotifySSLCertificateError(transaction_->GetResponseInfo()->ssl_info, fatal);
|
| } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
|
| @@ -876,11 +890,10 @@ void URLRequestHttpJob::Start() {
|
| referrer.spec());
|
| }
|
|
|
| - if (request_->context()) {
|
| - request_info_.extra_headers.SetHeaderIfMissing(
|
| - HttpRequestHeaders::kUserAgent,
|
| - request_->context()->GetUserAgent(request_->url()));
|
| - }
|
| + // TODO(shalev): Fix this to not go through URLRequestContext.
|
| + request_info_.extra_headers.SetHeaderIfMissing(
|
| + HttpRequestHeaders::kUserAgent,
|
| + request_->context()->GetUserAgent(request_->url()));
|
|
|
| AddExtraHeaders();
|
| AddCookieHeaderAndStart();
|
|
|