Chromium Code Reviews| 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 718b4542d4790836675ce642c19050584cb5c5e3..5f8a6bb906840227c5c8e731e581a6f99dff69cf 100644 |
| --- a/net/url_request/url_request_http_job.cc |
| +++ b/net/url_request/url_request_http_job.cc |
| @@ -134,8 +134,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); |
| } |
| @@ -143,12 +142,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()); |
|
mmenke
2012/07/18 16:21:53
nit: 4-space indent.
shalev
2012/07/23 21:00:21
Done.
|
| +} |
| + |
| + |
| +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), |
| @@ -178,10 +197,18 @@ URLRequestHttpJob::URLRequestHttpJob(URLRequest* request) |
| ALLOW_THIS_IN_INITIALIZER_LIST(on_headers_received_callback_( |
| base::Bind(&URLRequestHttpJob::OnHeadersReceivedCallback, |
| base::Unretained(this)))), |
| - awaiting_callback_(false) { |
| - URLRequestThrottlerManager* manager = request->context()->throttler_manager(); |
| - if (manager) |
| - throttling_entry_ = manager->RegisterRequestUrl(request->url()); |
| + awaiting_callback_(false), |
| + 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_); |
| + if (throttler_manager) |
| + throttling_entry_ = throttler_manager->RegisterRequestUrl(request->url()); |
| ResetTimer(); |
| } |
| @@ -255,8 +282,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 |
| @@ -293,20 +320,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( |
| - &transaction_); |
| + rv = http_transaction_factory_->CreateTransaction(&transaction_); |
| if (rv == OK) { |
| if (!throttling_entry_ || |
| !throttling_entry_->ShouldRejectRequest(*request_)) { |
| @@ -395,20 +416,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_); |
| } |
| } |
| @@ -421,10 +439,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(), |
| @@ -441,7 +457,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())); |
| @@ -518,7 +534,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(); |
| @@ -537,7 +553,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); |
| } |
| @@ -605,27 +621,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)) { |
|
mmenke
2012/07/18 16:21:53
nit: Since this is a continuation of the function
shalev
2012/07/23 21:00:21
Done.
|
| // |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; |
| @@ -635,34 +651,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; |
| @@ -674,7 +690,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); |
| } |
| } |
| @@ -693,29 +709,27 @@ 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) { |
| @@ -740,12 +754,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) { |
| @@ -837,11 +850,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(); |