| OLD | NEW |
| 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/filename_util_unsafe.h" | 9 #include "net/base/filename_util_unsafe.h" |
| 10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 | 131 |
| 132 next_stream_data_ = stream_buffer()->data(); | 132 next_stream_data_ = stream_buffer()->data(); |
| 133 stream_data_len_ = stream_data_len; | 133 stream_data_len_ = stream_data_len; |
| 134 return true; | 134 return true; |
| 135 } | 135 } |
| 136 | 136 |
| 137 // static | 137 // static |
| 138 Filter::FilterType Filter::ConvertEncodingToType( | 138 Filter::FilterType Filter::ConvertEncodingToType( |
| 139 const std::string& filter_type) { | 139 const std::string& filter_type) { |
| 140 FilterType type_id; | 140 FilterType type_id; |
| 141 if (LowerCaseEqualsASCII(filter_type, kDeflate)) { | 141 if (base::LowerCaseEqualsASCII(filter_type, kDeflate)) { |
| 142 type_id = FILTER_TYPE_DEFLATE; | 142 type_id = FILTER_TYPE_DEFLATE; |
| 143 } else if (LowerCaseEqualsASCII(filter_type, kGZip) || | 143 } else if (base::LowerCaseEqualsASCII(filter_type, kGZip) || |
| 144 LowerCaseEqualsASCII(filter_type, kXGZip)) { | 144 base::LowerCaseEqualsASCII(filter_type, kXGZip)) { |
| 145 type_id = FILTER_TYPE_GZIP; | 145 type_id = FILTER_TYPE_GZIP; |
| 146 } else if (LowerCaseEqualsASCII(filter_type, kSdch)) { | 146 } else if (base::LowerCaseEqualsASCII(filter_type, kSdch)) { |
| 147 type_id = FILTER_TYPE_SDCH; | 147 type_id = FILTER_TYPE_SDCH; |
| 148 } else { | 148 } else { |
| 149 // Note we also consider "identity" and "uncompressed" UNSUPPORTED as | 149 // Note we also consider "identity" and "uncompressed" UNSUPPORTED as |
| 150 // filter should be disabled in such cases. | 150 // filter should be disabled in such cases. |
| 151 type_id = FILTER_TYPE_UNSUPPORTED; | 151 type_id = FILTER_TYPE_UNSUPPORTED; |
| 152 } | 152 } |
| 153 return type_id; | 153 return type_id; |
| 154 } | 154 } |
| 155 | 155 |
| 156 // static | 156 // static |
| 157 void Filter::FixupEncodingTypes( | 157 void Filter::FixupEncodingTypes( |
| 158 const FilterContext& filter_context, | 158 const FilterContext& filter_context, |
| 159 std::vector<FilterType>* encoding_types) { | 159 std::vector<FilterType>* encoding_types) { |
| 160 std::string mime_type; | 160 std::string mime_type; |
| 161 bool success = filter_context.GetMimeType(&mime_type); | 161 bool success = filter_context.GetMimeType(&mime_type); |
| 162 DCHECK(success || mime_type.empty()); | 162 DCHECK(success || mime_type.empty()); |
| 163 | 163 |
| 164 if ((1 == encoding_types->size()) && | 164 if ((1 == encoding_types->size()) && |
| 165 (FILTER_TYPE_GZIP == encoding_types->front())) { | 165 (FILTER_TYPE_GZIP == encoding_types->front())) { |
| 166 if (LowerCaseEqualsASCII(mime_type, kApplicationXGzip) || | 166 if (base::LowerCaseEqualsASCII(mime_type, kApplicationXGzip) || |
| 167 LowerCaseEqualsASCII(mime_type, kApplicationGzip) || | 167 base::LowerCaseEqualsASCII(mime_type, kApplicationGzip) || |
| 168 LowerCaseEqualsASCII(mime_type, kApplicationXGunzip)) | 168 base::LowerCaseEqualsASCII(mime_type, kApplicationXGunzip)) |
| 169 // The server has told us that it sent us gziped content with a gzip | 169 // The server has told us that it sent us gziped content with a gzip |
| 170 // content encoding. Sadly, Apache mistakenly sets these headers for all | 170 // content encoding. Sadly, Apache mistakenly sets these headers for all |
| 171 // .gz files. We match Firefox's nsHttpChannel::ProcessNormal and ignore | 171 // .gz files. We match Firefox's nsHttpChannel::ProcessNormal and ignore |
| 172 // the Content-Encoding here. | 172 // the Content-Encoding here. |
| 173 encoding_types->clear(); | 173 encoding_types->clear(); |
| 174 | 174 |
| 175 GURL url; | 175 GURL url; |
| 176 std::string disposition; | 176 std::string disposition; |
| 177 success = filter_context.GetURL(&url); | 177 success = filter_context.GetURL(&url); |
| 178 DCHECK(success); | 178 DCHECK(success); |
| 179 filter_context.GetContentDisposition(&disposition); | 179 filter_context.GetContentDisposition(&disposition); |
| 180 // Don't supply a MIME type here, since that may cause disk IO. | 180 // Don't supply a MIME type here, since that may cause disk IO. |
| 181 base::FilePath::StringType extension = | 181 base::FilePath::StringType extension = |
| 182 GenerateFileExtensionUnsafe(url, disposition, "UTF-8", "", "", ""); | 182 GenerateFileExtensionUnsafe(url, disposition, "UTF-8", "", "", ""); |
| 183 | 183 |
| 184 if (filter_context.IsDownload()) { | 184 if (filter_context.IsDownload()) { |
| 185 // We don't want to decompress gzipped files when the user explicitly | 185 // We don't want to decompress gzipped files when the user explicitly |
| 186 // asks to download them. | 186 // asks to download them. |
| 187 // For the case of svgz files, we use the extension to distinguish | 187 // For the case of svgz files, we use the extension to distinguish |
| 188 // between svgz files and svg files compressed with gzip by the server. | 188 // between svgz files and svg files compressed with gzip by the server. |
| 189 // When viewing a .svgz file, we need to uncompress it, but we don't | 189 // When viewing a .svgz file, we need to uncompress it, but we don't |
| 190 // want to do that when downloading. | 190 // want to do that when downloading. |
| 191 // See Firefox's nonDecodableExtensions in nsExternalHelperAppService.cpp | 191 // See Firefox's nonDecodableExtensions in nsExternalHelperAppService.cpp |
| 192 if (EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) || | 192 if (EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) || |
| 193 LowerCaseEqualsASCII(extension, ".tgz") || | 193 base::LowerCaseEqualsASCII(extension, ".tgz") || |
| 194 LowerCaseEqualsASCII(extension, ".svgz")) | 194 base::LowerCaseEqualsASCII(extension, ".svgz")) |
| 195 encoding_types->clear(); | 195 encoding_types->clear(); |
| 196 } else { | 196 } else { |
| 197 // When the user does not explicitly ask to download a file, if we get a | 197 // When the user does not explicitly ask to download a file, if we get a |
| 198 // supported mime type, then we attempt to decompress in order to view it. | 198 // supported mime type, then we attempt to decompress in order to view it. |
| 199 // However, if it's not a supported mime type, then we will attempt to | 199 // However, if it's not a supported mime type, then we will attempt to |
| 200 // download it, and in that case, don't decompress .gz/.tgz files. | 200 // download it, and in that case, don't decompress .gz/.tgz files. |
| 201 if ((EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) || | 201 if ((EndsWith(extension, FILE_PATH_LITERAL(".gz"), false) || |
| 202 LowerCaseEqualsASCII(extension, ".tgz")) && | 202 base::LowerCaseEqualsASCII(extension, ".tgz")) && |
| 203 !IsSupportedMimeType(mime_type)) | 203 !IsSupportedMimeType(mime_type)) |
| 204 encoding_types->clear(); | 204 encoding_types->clear(); |
| 205 } | 205 } |
| 206 } | 206 } |
| 207 | 207 |
| 208 // If the request was for SDCH content, then we might need additional fixups. | 208 // If the request was for SDCH content, then we might need additional fixups. |
| 209 if (!filter_context.IsSdchResponse()) { | 209 if (!filter_context.IsSdchResponse()) { |
| 210 // It was not an SDCH request, so we'll just record stats. | 210 // It was not an SDCH request, so we'll just record stats. |
| 211 if (1 < encoding_types->size()) { | 211 if (1 < encoding_types->size()) { |
| 212 // Multiple filters were intended to only be used for SDCH (thus far!) | 212 // Multiple filters were intended to only be used for SDCH (thus far!) |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 | 400 |
| 401 void Filter::PushDataIntoNextFilter() { | 401 void Filter::PushDataIntoNextFilter() { |
| 402 IOBuffer* next_buffer = next_filter_->stream_buffer(); | 402 IOBuffer* next_buffer = next_filter_->stream_buffer(); |
| 403 int next_size = next_filter_->stream_buffer_size(); | 403 int next_size = next_filter_->stream_buffer_size(); |
| 404 last_status_ = ReadFilteredData(next_buffer->data(), &next_size); | 404 last_status_ = ReadFilteredData(next_buffer->data(), &next_size); |
| 405 if (FILTER_ERROR != last_status_) | 405 if (FILTER_ERROR != last_status_) |
| 406 next_filter_->FlushStreamBuffer(next_size); | 406 next_filter_->FlushStreamBuffer(next_size); |
| 407 } | 407 } |
| 408 | 408 |
| 409 } // namespace net | 409 } // namespace net |
| OLD | NEW |