Chromium Code Reviews| Index: net/filter/sdch_filter.cc |
| diff --git a/net/filter/sdch_filter.cc b/net/filter/sdch_filter.cc |
| index df72367c1dd7729a8ba353ac37b70af4e56089b7..4e223078f36a6ffac59586c7c8bfc49d38f87441 100644 |
| --- a/net/filter/sdch_filter.cc |
| +++ b/net/filter/sdch_filter.cc |
| @@ -244,7 +244,7 @@ Filter::FilterStatus SdchFilter::ReadFilteredData(char* dest_buffer, |
| // The common cause is a restart of the browser, where we try to render |
| // cached content that was saved when we had a dictionary. |
| cause = RESPONSE_NO_DICTIONARY; |
| - } else if (filter_context_.SdchResponseExpected()) { |
| + } else if (filter_context_.SdchDictionariesAdvertised()) { |
| // This is a very corrupt SDCH request response. We can't decode it. |
| // We'll use a meta-refresh, and get content without asking for SDCH. |
| // This will also progressively disable SDCH for this domain. |
| @@ -391,19 +391,44 @@ Filter::FilterStatus SdchFilter::InitializeDictionary() { |
| else |
| next_stream_data_ = NULL; |
| - DCHECK(!dictionary_.get()); |
| + DCHECK(!dictionary_); |
| dictionary_hash_is_plausible_ = true; // Assume plausible, but check. |
| if ('\0' == dictionary_hash_[kServerIdLength - 1]) { |
| - SdchManager* manager(url_request_context_->sdch_manager()); |
| - manager->GetVcdiffDictionary( |
| - std::string(dictionary_hash_, 0, kServerIdLength - 1), |
| - url_, &dictionary_); |
| + std::string server_hash(dictionary_hash_, 0, kServerIdLength - 1); |
| + SdchManager::DictionarySet* handle = |
| + filter_context_.SdchDictionariesAdvertised(); |
| + if (handle) |
| + dictionary_ = handle->Dictionary(server_hash); |
| + if (!dictionary_) { |
| + // This is a hack. Naively, the dictionaries available for |
| + // decoding should be only the ones advertised. However, there are |
| + // cases, specifically resources encoded with old dictionaries living |
| + // in the cache, that mean the full set of dictionaries should be made |
| + // available for decoding. It's not known how often this happens; |
| + // if it happens rarely enough, this code can be removed. |
| + // |
| + // TODO(rdsmith): Long-term, a better solution is necessary, since |
| + // an entry in the cache being encoded with the dictionary doesn't |
| + // guarantee that the dictionary is present. That solution probably |
| + // involves storing unencoded resources in the cache, but might |
| + // involve evicting encoded resources on dictionary removal. |
|
Ryan Sleevi
2014/11/14 03:21:25
Whenever someone adds a TODO like this, I like to
Randy Smith (Not in Mondays)
2014/11/17 17:04:22
I've added a pointer to the relevant bug in the TO
|
| + unexpected_dictionary_handle_ = |
| + url_request_context_->sdch_manager()->GetDictionarySetByHash( |
| + url_, server_hash); |
| + if (unexpected_dictionary_handle_.get()) { |
| + dictionary_ = unexpected_dictionary_handle_->Dictionary(server_hash); |
| + SdchManager::SdchErrorRecovery( |
| + filter_context_.IsCachedContent() ? |
| + SdchManager::UNADVERTISED_SDCH_DICTIONARY_USED_CACHED : |
| + SdchManager::UNADVERTISED_SDCH_DICTIONARY_USED); |
| + } |
| + } |
| } else { |
| dictionary_hash_is_plausible_ = false; |
| } |
| - if (!dictionary_.get()) { |
| + if (!dictionary_) { |
| DCHECK(dictionary_hash_.size() == kServerIdLength); |
| // Since dictionary was not found, check to see if hash was even plausible. |
| for (size_t i = 0; i < kServerIdLength - 1; ++i) { |