Index: net/url_request/url_request_http_job.cc |
=================================================================== |
--- net/url_request/url_request_http_job.cc (revision 14822) |
+++ net/url_request/url_request_http_job.cc (working copy) |
@@ -10,6 +10,7 @@ |
#include "base/file_util.h" |
#include "base/file_version_info.h" |
#include "base/message_loop.h" |
+#include "base/rand_util.h" |
#include "base/string_util.h" |
#include "net/base/cookie_monster.h" |
#include "net/base/filter.h" |
@@ -63,10 +64,19 @@ |
ALLOW_THIS_IN_INITIALIZER_LIST( |
read_callback_(this, &URLRequestHttpJob::OnReadCompleted)), |
read_in_progress_(false), |
- context_(request->context()) { |
+ context_(request->context()), |
+ sdch_dictionary_advertised_(false), |
+ sdch_test_activated_(false), |
+ sdch_test_control_(false) { |
} |
URLRequestHttpJob::~URLRequestHttpJob() { |
+ DCHECK(!sdch_test_control_ || !sdch_test_activated_); |
+ if (sdch_test_control_) |
+ RecordPacketStats(SDCH_EXPERIMENT_HOLDBACK); |
+ if (sdch_test_activated_) |
+ RecordPacketStats(SDCH_EXPERIMENT_DECODE); |
+ |
if (sdch_dictionary_url_.is_valid()) { |
// Prior to reaching the destructor, request_ has been set to a NULL |
// pointer, so request_->url() is no longer valid in the destructor, and we |
@@ -215,8 +225,7 @@ |
} |
bool URLRequestHttpJob::IsSdchResponse() const { |
- return response_info_ && |
- (request_info_.load_flags & net::LOAD_SDCH_DICTIONARY_ADVERTISED); |
+ return sdch_dictionary_advertised_; |
} |
bool URLRequestHttpJob::IsRedirectResponse(GURL* location, |
@@ -546,29 +555,54 @@ |
} |
void URLRequestHttpJob::AddExtraHeaders() { |
+ // TODO(jar): Consider optimizing away SDCH advertising bytes when the URL is |
+ // probably an img or such (and SDCH encoding is not likely). |
+ bool advertise_sdch = SdchManager::Global() && |
+ SdchManager::Global()->IsInSupportedDomain(request_->url()); |
+ std::string avail_dictionaries; |
+ if (advertise_sdch) { |
+ SdchManager::Global()->GetAvailDictionaryList(request_->url(), |
+ &avail_dictionaries); |
+ |
+ // The AllowLatencyExperiment() is only true if we've successfully done a |
+ // full SDCH compression recently in this browser session for this host. |
+ // Note that for this path, there might be no applicable dictionaries, and |
+ // hence we can't participate in the experiment. |
+ if (!avail_dictionaries.empty() && |
+ SdchManager::Global()->AllowLatencyExperiment(request_->url())) { |
+ // We are participating in the test (or control), and hence we'll |
+ // eventually record statistics via either SDCH_EXPERIMENT_DECODE or |
+ // SDCH_EXPERIMENT_HOLDBACK, and we'll need some packet timing data. |
+ EnablePacketCounting(kSdchPacketHistogramCount); |
+ if (base::RandDouble() < .5) { |
+ sdch_test_control_ = true; |
+ advertise_sdch = false; |
+ } else { |
+ sdch_test_activated_ = true; |
+ } |
+ } |
+ } |
+ |
// Supply Accept-Encoding headers first so that it is more likely that they |
// will be in the first transmitted packet. This can sometimes make it easier |
// to filter and analyze the streams to assure that a proxy has not damaged |
// these headers. Some proxies deliberately corrupt Accept-Encoding headers. |
- if (!SdchManager::Global() || |
- !SdchManager::Global()->IsInSupportedDomain(request_->url())) { |
+ if (!advertise_sdch) { |
// Tell the server what compression formats we support (other than SDCH). |
request_info_.extra_headers += "Accept-Encoding: gzip,deflate,bzip2\r\n"; |
} else { |
- // Supply SDCH related headers, as well as accepting that encoding. |
- // Tell the server what compression formats we support. |
+ // Include SDCH in acceptable list. |
request_info_.extra_headers += "Accept-Encoding: " |
"gzip,deflate,bzip2,sdch\r\n"; |
- |
- // TODO(jar): See if it is worth optimizing away these bytes when the URL is |
- // probably an img or such. (and SDCH encoding is not likely). |
- std::string avail_dictionaries; |
- SdchManager::Global()->GetAvailDictionaryList(request_->url(), |
- &avail_dictionaries); |
if (!avail_dictionaries.empty()) { |
request_info_.extra_headers += "Avail-Dictionary: " |
+ avail_dictionaries + "\r\n"; |
- request_info_.load_flags |= net::LOAD_SDCH_DICTIONARY_ADVERTISED; |
+ sdch_dictionary_advertised_ = true; |
+ // Since we're tagging this transaction as advertising a dictionary, we'll |
+ // definately employ an SDCH filter (or tentative sdch filter) when we get |
+ // a response. When done, we'll record histograms via SDCH_DECODE or |
+ // SDCH_PASSTHROUGH. Hence we need to record packet arrival times. |
+ EnablePacketCounting(kSdchPacketHistogramCount); |
} |
} |