| Index: net/url_request/url_request_http_job.cc
|
| ===================================================================
|
| --- net/url_request/url_request_http_job.cc (revision 4002)
|
| +++ net/url_request/url_request_http_job.cc (working copy)
|
| @@ -10,6 +10,7 @@
|
| #include "base/message_loop.h"
|
| #include "base/string_util.h"
|
| #include "net/base/cookie_monster.h"
|
| +#include "net/base/filter.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/base/net_util.h"
|
| @@ -162,67 +163,24 @@
|
| }
|
|
|
| bool URLRequestHttpJob::GetContentEncodings(
|
| - std::vector<std::string>* encoding_types) {
|
| + std::vector<Filter::FilterType>* encoding_types) {
|
| DCHECK(transaction_.get());
|
| -
|
| if (!response_info_)
|
| return false;
|
| + DCHECK(encoding_types->empty());
|
|
|
| std::string encoding_type;
|
| void* iter = NULL;
|
| while (response_info_->headers->EnumerateHeader(&iter, "Content-Encoding",
|
| &encoding_type)) {
|
| - encoding_types->push_back(StringToLowerASCII(encoding_type));
|
| + encoding_types->push_back(Filter::ConvertEncodingToType(encoding_type));
|
| }
|
|
|
| - // TODO(jar): Transition to returning enums, rather than strings, and perform
|
| - // all content encoding fixups here, rather than doing some in the
|
| - // FilterFactor(). Note that enums generated can be more specific than mere
|
| - // restatement of strings. For example, rather than just having a GZIP
|
| - // encoding we can have a GZIP_OPTIONAL encoding to help with odd SDCH related
|
| - // fixups.
|
| -
|
| - // TODO(jar): Refactor code so that content-encoding error recovery is
|
| - // testable via unit tests.
|
| -
|
| - if (!IsSdchResponse())
|
| - return !encoding_types->empty();
|
| -
|
| - // If content encoding included SDCH, then everything is fine.
|
| - if (!encoding_types->empty() && ("sdch" == encoding_types->front()))
|
| - return !encoding_types->empty();
|
| -
|
| - // SDCH "search results" protective hack: To make sure we don't break the only
|
| - // currently deployed SDCH enabled server, be VERY cautious about proxies that
|
| - // strip all content-encoding to not include sdch. IF we don't see content
|
| - // encodings that seem to match what we'd expect from a server that asked us
|
| - // to use a dictionary (and we advertised said dictionary in the GET), then
|
| - // we set the encoding to (try to) use SDCH to decode. Note that SDCH will
|
| - // degrade into a pass-through filter if it doesn't have a viable dictionary
|
| - // hash in its header. Also note that a solo "sdch" will implicitly create
|
| - // a "sdch,gzip" decoding filter, where the gzip portion will degrade to a
|
| - // pass through if a gzip header is not encountered. Hence we can replace
|
| - // "gzip" with "sdch" and "everything will work."
|
| - // The one failure mode comes when we advertise a dictionary, and the server
|
| - // tries to *send* a gzipped file (not gzip encode content), and then we could
|
| - // do a gzip decode :-(. Since current server support does not ever see such
|
| - // a transfer, we are safe (for now).
|
| -
|
| - std::string mime_type;
|
| - GetMimeType(&mime_type);
|
| - if (std::string::npos != mime_type.find_first_of("text/html")) {
|
| - // Suspicious case: Advertised dictionary, but server didn't use sdch, even
|
| - // though it is text_html content.
|
| - if (encoding_types->empty())
|
| - SdchManager::SdchErrorRecovery(SdchManager::ADDED_CONTENT_ENCODING);
|
| - else if (encoding_types->size() == 1)
|
| - SdchManager::SdchErrorRecovery(SdchManager::FIXED_CONTENT_ENCODING);
|
| - else
|
| - SdchManager::SdchErrorRecovery(SdchManager::FIXED_CONTENT_ENCODINGS);
|
| - encoding_types->clear();
|
| - encoding_types->push_back("sdch"); // Handle SDCH/GZIP-opt encoding.
|
| + if (!encoding_types->empty()) {
|
| + std::string mime_type;
|
| + GetMimeType(&mime_type);
|
| + Filter::FixupEncodingTypes(IsSdchResponse(), mime_type, encoding_types);
|
| }
|
| -
|
| return !encoding_types->empty();
|
| }
|
|
|
| @@ -534,6 +492,39 @@
|
| }
|
|
|
| void URLRequestHttpJob::AddExtraHeaders() {
|
| + // 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())) {
|
| + // 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.
|
| + 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;
|
| + }
|
| +
|
| + scoped_ptr<FileVersionInfo> file_version_info(
|
| + FileVersionInfo::CreateFileVersionInfoForCurrentModule());
|
| + request_info_.extra_headers += "X-SDCH: Chrome ";
|
| + request_info_.extra_headers +=
|
| + WideToASCII(file_version_info->product_version());
|
| + request_info_.extra_headers += "\r\n";
|
| + }
|
| +
|
| URLRequestContext* context = request_->context();
|
| if (context) {
|
| // Add in the cookie header. TODO might we need more than one header?
|
| @@ -553,36 +544,6 @@
|
| request_info_.extra_headers += "Accept-Charset: " +
|
| context->accept_charset() + "\r\n";
|
| }
|
| -
|
| - if (!SdchManager::Global() ||
|
| - !SdchManager::Global()->IsInSupportedDomain(request_->url())) {
|
| - // Tell the server what compression formats we support (other than SDCH).
|
| - request_info_.extra_headers += "Accept-Encoding: gzip,deflate,bzip2\r\n";
|
| - return;
|
| - }
|
| -
|
| - // Supply SDCH related headers, as well as accepting that encoding.
|
| -
|
| - // 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;
|
| - }
|
| -
|
| - scoped_ptr<FileVersionInfo> file_version_info(
|
| - FileVersionInfo::CreateFileVersionInfoForCurrentModule());
|
| - request_info_.extra_headers += "X-SDCH: Chrome ";
|
| - request_info_.extra_headers +=
|
| - WideToASCII(file_version_info->product_version());
|
| - request_info_.extra_headers += "\r\n";
|
| -
|
| - // Tell the server what compression formats we support.
|
| - request_info_.extra_headers += "Accept-Encoding: gzip,deflate,bzip2,sdch\r\n";
|
| }
|
|
|
| void URLRequestHttpJob::FetchResponseCookies() {
|
|
|