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 4261b9227fe2e903f187f0575c8bb263ae82d81e..33a508849f4a7b8a35b9468de762cbb3d804d3ad 100644 |
--- a/net/url_request/url_request_http_job.cc |
+++ b/net/url_request/url_request_http_job.cc |
@@ -24,6 +24,7 @@ |
#include "net/base/net_util.h" |
#include "net/base/network_delegate.h" |
#include "net/base/sdch_manager.h" |
+#include "net/base/sdch_net_log_params.h" |
#include "net/cert/cert_status_flags.h" |
#include "net/cookies/cookie_store.h" |
#include "net/http/http_content_disposition.h" |
@@ -70,6 +71,7 @@ class URLRequestHttpJob::HttpFilterContext : public FilterContext { |
int GetResponseCode() const override; |
const URLRequestContext* GetURLRequestContext() const override; |
void RecordPacketStats(StatisticSelector statistic) const override; |
+ const BoundNetLog& GetNetLog() const override; |
// Method to allow us to reset filter context for a response that should have |
// been SDCH encoded when there is an update due to an explicit HTTP header. |
@@ -78,6 +80,10 @@ class URLRequestHttpJob::HttpFilterContext : public FilterContext { |
private: |
URLRequestHttpJob* job_; |
+ // URLRequestHttpJob may be detached from URLRequest, but we still need to |
+ // return something. |
+ BoundNetLog dummy_log_; |
+ |
DISALLOW_COPY_AND_ASSIGN(HttpFilterContext); |
}; |
@@ -147,6 +153,10 @@ void URLRequestHttpJob::HttpFilterContext::RecordPacketStats( |
job_->RecordPacketStats(statistic); |
} |
+const BoundNetLog& URLRequestHttpJob::HttpFilterContext::GetNetLog() const { |
+ return job_->request() ? job_->request()->net_log() : dummy_log_; |
+} |
+ |
// TODO(darin): make sure the port blocking code is not lost |
// static |
URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request, |
@@ -321,21 +331,42 @@ void URLRequestHttpJob::NotifyHeadersComplete() { |
ProcessPublicKeyPinsHeader(); |
SdchManager* sdch_manager(request()->context()->sdch_manager()); |
- if (sdch_manager && sdch_manager->IsInSupportedDomain(request_->url())) { |
- const std::string name = "Get-Dictionary"; |
- std::string url_text; |
- void* iter = NULL; |
- // TODO(jar): We need to not fetch dictionaries the first time they are |
- // seen, but rather wait until we can justify their usefulness. |
- // For now, we will only fetch the first dictionary, which will at least |
- // require multiple suggestions before we get additional ones for this site. |
- // Eventually we should wait until a dictionary is requested several times |
- // before we even download it (so that we don't waste memory or bandwidth). |
- if (GetResponseHeaders()->EnumerateHeader(&iter, name, &url_text)) { |
- // Resolve suggested URL relative to request url. |
- GURL sdch_dictionary_url = request_->url().Resolve(url_text); |
- if (sdch_dictionary_url.is_valid()) { |
- sdch_manager->OnGetDictionary(request_->url(), sdch_dictionary_url); |
+ if (sdch_manager) { |
+ SdchProblemCode rv = sdch_manager->IsInSupportedDomain(request()->url()); |
+ if (rv != SDCH_OK) { |
+ // If SDCH is just disabled, it is not a real error. |
+ if (rv != SDCH_DISABLED && rv != SDCH_SECURE_SCHEME_NOT_SUPPORTED) { |
+ SdchManager::SdchErrorRecovery(rv); |
+ request()->net_log().AddEvent( |
+ NetLog::TYPE_SDCH_DECODING_ERROR, |
+ base::Bind(&NetLogSdchResourceProblemCallback, rv)); |
+ } |
+ } else { |
+ const std::string name = "Get-Dictionary"; |
+ std::string url_text; |
+ void* iter = NULL; |
+ // TODO(jar): We need to not fetch dictionaries the first time they are |
+ // seen, but rather wait until we can justify their usefulness. |
+ // For now, we will only fetch the first dictionary, which will at least |
+ // require multiple suggestions before we get additional ones for this |
+ // site. Eventually we should wait until a dictionary is requested |
+ // several times |
+ // before we even download it (so that we don't waste memory or |
+ // bandwidth). |
+ if (GetResponseHeaders()->EnumerateHeader(&iter, name, &url_text)) { |
+ // Resolve suggested URL relative to request url. |
+ GURL sdch_dictionary_url = request_->url().Resolve(url_text); |
+ if (sdch_dictionary_url.is_valid()) { |
+ rv = sdch_manager->OnGetDictionary(request_->url(), |
+ sdch_dictionary_url); |
+ if (rv != SDCH_OK) { |
+ SdchManager::SdchErrorRecovery(rv); |
+ request_->net_log().AddEvent( |
+ NetLog::TYPE_SDCH_DICTIONARY_ERROR, |
+ base::Bind(&NetLogSdchDictionaryFetchProblemCallback, rv, |
+ sdch_dictionary_url, false)); |
+ } |
+ } |
} |
} |
} |
@@ -483,13 +514,24 @@ void URLRequestHttpJob::AddExtraHeaders() { |
// simple_data_source. |
if (!request_info_.extra_headers.HasHeader( |
HttpRequestHeaders::kAcceptEncoding)) { |
- bool advertise_sdch = sdch_manager && |
- // We don't support SDCH responses to POST as there is a possibility |
- // of having SDCH encoded responses returned (e.g. by the cache) |
- // which we cannot decode, and in those situations, we will need |
- // to retransmit the request without SDCH, which is illegal for a POST. |
- request()->method() != "POST" && |
- sdch_manager->IsInSupportedDomain(request_->url()); |
+ // We don't support SDCH responses to POST as there is a possibility |
+ // of having SDCH encoded responses returned (e.g. by the cache) |
+ // which we cannot decode, and in those situations, we will need |
+ // to retransmit the request without SDCH, which is illegal for a POST. |
+ bool advertise_sdch = sdch_manager != NULL && request()->method() != "POST"; |
+ if (advertise_sdch) { |
+ SdchProblemCode rv = sdch_manager->IsInSupportedDomain(request()->url()); |
+ if (rv != SDCH_OK) { |
+ advertise_sdch = false; |
+ // If SDCH is just disabled, it is not a real error. |
+ if (rv != SDCH_DISABLED && rv != SDCH_SECURE_SCHEME_NOT_SUPPORTED) { |
+ SdchManager::SdchErrorRecovery(rv); |
+ request()->net_log().AddEvent( |
+ NetLog::TYPE_SDCH_DECODING_ERROR, |
+ base::Bind(&NetLogSdchResourceProblemCallback, rv)); |
+ } |
+ } |
+ } |
std::string avail_dictionaries; |
if (advertise_sdch) { |
sdch_manager->GetAvailDictionaryList(request_->url(), |