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

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

Issue 693943003: Update from https://crrev.com/302630 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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 // The basic usage of the Filter interface is described in the comment at
6 // the beginning of filter.h. If Filter::Factory is passed a vector of
7 // size greater than 1, that interface is implemented by a series of filters
8 // connected in a chain. In such a case the first filter
9 // in the chain proxies calls to ReadData() so that its return values
10 // apply to the entire chain.
11 //
12 // In a filter chain, the data flows from first filter (held by the
13 // caller) down the chain. When ReadData() is called on any filter
14 // except for the last filter, it proxies the call down the chain,
15 // filling in the input buffers of subsequent filters if needed (==
16 // that filter's last_status() value is FILTER_NEED_MORE_DATA) and
17 // available (== the current filter has data it can output). The last
18 // Filter will then output data if possible, and return
19 // FILTER_NEED_MORE_DATA if not. Because the indirection pushes
20 // data along the filter chain at each level if it's available and the
21 // next filter needs it, a return value of FILTER_NEED_MORE_DATA from the
22 // final filter will apply to the entire chain.
23
5 #include "net/filter/filter.h" 24 #include "net/filter/filter.h"
6 25
7 #include "base/files/file_path.h" 26 #include "base/files/file_path.h"
8 #include "base/strings/string_util.h" 27 #include "base/strings/string_util.h"
9 #include "net/base/filename_util_unsafe.h" 28 #include "net/base/filename_util_unsafe.h"
10 #include "net/base/io_buffer.h" 29 #include "net/base/io_buffer.h"
11 #include "net/base/mime_util.h" 30 #include "net/base/mime_util.h"
12 #include "net/filter/gzip_filter.h" 31 #include "net/filter/gzip_filter.h"
13 #include "net/filter/sdch_filter.h" 32 #include "net/filter/sdch_filter.h"
14 #include "net/url_request/url_request_context.h" 33 #include "net/url_request/url_request_context.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 99 }
81 return filter_list; 100 return filter_list;
82 } 101 }
83 102
84 Filter::FilterStatus Filter::ReadData(char* dest_buffer, int* dest_len) { 103 Filter::FilterStatus Filter::ReadData(char* dest_buffer, int* dest_len) {
85 const int dest_buffer_capacity = *dest_len; 104 const int dest_buffer_capacity = *dest_len;
86 if (last_status_ == FILTER_ERROR) 105 if (last_status_ == FILTER_ERROR)
87 return last_status_; 106 return last_status_;
88 if (!next_filter_.get()) 107 if (!next_filter_.get())
89 return last_status_ = ReadFilteredData(dest_buffer, dest_len); 108 return last_status_ = ReadFilteredData(dest_buffer, dest_len);
109
110 // This filter needs more data, but it's not clear that the rest of
111 // the chain does; delegate the actual status return to the next filter.
90 if (last_status_ == FILTER_NEED_MORE_DATA && !stream_data_len()) 112 if (last_status_ == FILTER_NEED_MORE_DATA && !stream_data_len())
91 return next_filter_->ReadData(dest_buffer, dest_len); 113 return next_filter_->ReadData(dest_buffer, dest_len);
92 114
93 do { 115 do {
94 if (next_filter_->last_status() == FILTER_NEED_MORE_DATA) { 116 if (next_filter_->last_status() == FILTER_NEED_MORE_DATA) {
95 PushDataIntoNextFilter(); 117 PushDataIntoNextFilter();
96 if (FILTER_ERROR == last_status_) 118 if (FILTER_ERROR == last_status_)
97 return FILTER_ERROR; 119 return FILTER_ERROR;
98 } 120 }
99 *dest_len = dest_buffer_capacity; // Reset the input/output parameter. 121 *dest_len = dest_buffer_capacity; // Reset the input/output parameter.
(...skipping 24 matching lines...) Expand all
124 if (stream_data_len <= 0 || stream_data_len > stream_buffer_size_) 146 if (stream_data_len <= 0 || stream_data_len > stream_buffer_size_)
125 return false; 147 return false;
126 148
127 DCHECK(stream_buffer()); 149 DCHECK(stream_buffer());
128 // Bail out if there is more data in the stream buffer to be filtered. 150 // Bail out if there is more data in the stream buffer to be filtered.
129 if (!stream_buffer() || stream_data_len_) 151 if (!stream_buffer() || stream_data_len_)
130 return false; 152 return false;
131 153
132 next_stream_data_ = stream_buffer()->data(); 154 next_stream_data_ = stream_buffer()->data();
133 stream_data_len_ = stream_data_len; 155 stream_data_len_ = stream_data_len;
156 last_status_ = FILTER_OK;
134 return true; 157 return true;
135 } 158 }
136 159
137 // static 160 // static
138 Filter::FilterType Filter::ConvertEncodingToType( 161 Filter::FilterType Filter::ConvertEncodingToType(
139 const std::string& filter_type) { 162 const std::string& filter_type) {
140 FilterType type_id; 163 FilterType type_id;
141 if (LowerCaseEqualsASCII(filter_type, kDeflate)) { 164 if (LowerCaseEqualsASCII(filter_type, kDeflate)) {
142 type_id = FILTER_TYPE_DEFLATE; 165 type_id = FILTER_TYPE_DEFLATE;
143 } else if (LowerCaseEqualsASCII(filter_type, kGZip) || 166 } else if (LowerCaseEqualsASCII(filter_type, kGZip) ||
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 423
401 void Filter::PushDataIntoNextFilter() { 424 void Filter::PushDataIntoNextFilter() {
402 IOBuffer* next_buffer = next_filter_->stream_buffer(); 425 IOBuffer* next_buffer = next_filter_->stream_buffer();
403 int next_size = next_filter_->stream_buffer_size(); 426 int next_size = next_filter_->stream_buffer_size();
404 last_status_ = ReadFilteredData(next_buffer->data(), &next_size); 427 last_status_ = ReadFilteredData(next_buffer->data(), &next_size);
405 if (FILTER_ERROR != last_status_) 428 if (FILTER_ERROR != last_status_)
406 next_filter_->FlushStreamBuffer(next_size); 429 next_filter_->FlushStreamBuffer(next_size);
407 } 430 }
408 431
409 } // namespace net 432 } // 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