Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: net/filter/filter.cc

Issue 206503006: Fix content-encoding handling with buggy servers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkgr
Patch Set: Use GenerateFileName instead Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/filter/filter.h ('k') | net/filter/filter_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/filter/filter.h" 5 #include "net/filter/filter.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "net/base/io_buffer.h" 9 #include "net/base/io_buffer.h"
10 #include "net/base/mime_util.h" 10 #include "net/base/mime_util.h"
11 #include "net/base/net_util.h"
11 #include "net/filter/gzip_filter.h" 12 #include "net/filter/gzip_filter.h"
12 #include "net/filter/sdch_filter.h" 13 #include "net/filter/sdch_filter.h"
13 14
14 namespace { 15 namespace {
15 16
16 // Filter types (using canonical lower case only): 17 // Filter types (using canonical lower case only):
17 const char kDeflate[] = "deflate"; 18 const char kDeflate[] = "deflate";
18 const char kGZip[] = "gzip"; 19 const char kGZip[] = "gzip";
19 const char kXGZip[] = "x-gzip"; 20 const char kXGZip[] = "x-gzip";
20 const char kSdch[] = "sdch"; 21 const char kSdch[] = "sdch";
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 if (LowerCaseEqualsASCII(mime_type, kApplicationXGzip) || 164 if (LowerCaseEqualsASCII(mime_type, kApplicationXGzip) ||
164 LowerCaseEqualsASCII(mime_type, kApplicationGzip) || 165 LowerCaseEqualsASCII(mime_type, kApplicationGzip) ||
165 LowerCaseEqualsASCII(mime_type, kApplicationXGunzip)) 166 LowerCaseEqualsASCII(mime_type, kApplicationXGunzip))
166 // The server has told us that it sent us gziped content with a gzip 167 // The server has told us that it sent us gziped content with a gzip
167 // content encoding. Sadly, Apache mistakenly sets these headers for all 168 // content encoding. Sadly, Apache mistakenly sets these headers for all
168 // .gz files. We match Firefox's nsHttpChannel::ProcessNormal and ignore 169 // .gz files. We match Firefox's nsHttpChannel::ProcessNormal and ignore
169 // the Content-Encoding here. 170 // the Content-Encoding here.
170 encoding_types->clear(); 171 encoding_types->clear();
171 172
172 GURL url; 173 GURL url;
174 std::string disposition;
173 success = filter_context.GetURL(&url); 175 success = filter_context.GetURL(&url);
174 DCHECK(success); 176 DCHECK(success);
175 base::FilePath filename = 177 filter_context.GetContentDisposition(&disposition);
176 base::FilePath().AppendASCII(url.ExtractFileName()); 178 // Don't supply a MIME type here, since that may cause disk IO.
177 base::FilePath::StringType extension = filename.Extension(); 179 base::FilePath filepath = GenerateFileName(url, disposition, "UTF-8", "",
180 "", "");
181 base::FilePath::StringType extension = filepath.Extension();
178 182
179 if (filter_context.IsDownload()) { 183 if (filter_context.IsDownload()) {
180 // We don't want to decompress gzipped files when the user explicitly 184 // We don't want to decompress gzipped files when the user explicitly
181 // asks to download them. 185 // asks to download them.
182 // For the case of svgz files, we use the extension to distinguish 186 // For the case of svgz files, we use the extension to distinguish
183 // between svgz files and svg files compressed with gzip by the server. 187 // between svgz files and svg files compressed with gzip by the server.
184 // When viewing a .svgz file, we need to uncompress it, but we don't 188 // When viewing a .svgz file, we need to uncompress it, but we don't
185 // want to do that when downloading. 189 // want to do that when downloading.
186 // See Firefox's nonDecodableExtensions in nsExternalHelperAppService.cpp 190 // See Firefox's nonDecodableExtensions in nsExternalHelperAppService.cpp
187 if (EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) || 191 if (EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) ||
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 398
395 void Filter::PushDataIntoNextFilter() { 399 void Filter::PushDataIntoNextFilter() {
396 IOBuffer* next_buffer = next_filter_->stream_buffer(); 400 IOBuffer* next_buffer = next_filter_->stream_buffer();
397 int next_size = next_filter_->stream_buffer_size(); 401 int next_size = next_filter_->stream_buffer_size();
398 last_status_ = ReadFilteredData(next_buffer->data(), &next_size); 402 last_status_ = ReadFilteredData(next_buffer->data(), &next_size);
399 if (FILTER_ERROR != last_status_) 403 if (FILTER_ERROR != last_status_)
400 next_filter_->FlushStreamBuffer(next_size); 404 next_filter_->FlushStreamBuffer(next_size);
401 } 405 }
402 406
403 } // namespace net 407 } // namespace net
OLDNEW
« no previous file with comments | « net/filter/filter.h ('k') | net/filter/filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698