15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Filter performs filtering on data streams. Sample usage: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IStream* pre_filter_source; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Filter* filter = Filter::Factory(filter_type, size); 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int pre_filter_data_len = filter->stream_buffer_size(); 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pre_filter_source->read(filter->stream_buffer(), pre_filter_data_len); 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filter->FlushStreamBuffer(pre_filter_data_len); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// char post_filter_buf[kBufferSize]; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int post_filter_data_len = kBufferSize; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filter->ReadFilteredData(post_filter_buf, &post_filter_data_len); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To filter a data stream, the caller first gets filter's stream_buffer_ 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through its accessor and fills in stream_buffer_ with pre-filter data, next 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calls FlushStreamBuffer to notify Filter, then calls ReadFilteredData 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// repeatedly to get all the filtered data. After all data have been fitlered 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and read out, the caller may fill in stream_buffer_ again. This 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WriteBuffer-Flush-Read cycle is repeated until reaching the end of data 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stream. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The lifetime of a Filter instance is completely controlled by its caller. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NET_FILTER_FILTER_H__ 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define NET_FILTER_FILTER_H__ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class URLRequestContext; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBuffer; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Define an interface class that allows access to contextual information 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// supplied by the owner of this filter. In the case where there are a chain of 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filters, there is only one owner of all the chained filters, and that context 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is passed to the constructor of all those filters. To be clear, the context 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does NOT reflect the position in a chain, or the fact that there are prior 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or later filters in a chain. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE FilterContext { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enum to control what histograms are emitted near end-of-life of this 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum StatisticSelector { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SDCH_DECODE, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SDCH_PASSTHROUGH, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SDCH_EXPERIMENT_DECODE, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SDCH_EXPERIMENT_HOLDBACK, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FilterContext(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What mime type was specified in the header for this data? 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only makes senses for some types of contexts, and returns false 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when not applicable. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetMimeType(std::string* mime_type) const = 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What URL was used to access this data? 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false if gurl is not present. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetURL(GURL* gurl) const = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // What Content-Disposition header came with this data? 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Return false if no header was present. 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool GetContentDisposition(std::string* disposition) const = 0; 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When was this data requested from a server? 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::Time GetRequestTime() const = 0; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is data supplied from cache, or fresh across the net? 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsCachedContent() const = 0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Is this a download? 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsDownload() const = 0; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Was this data flagged as a response to a request with an SDCH dictionary? 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool SdchResponseExpected() const = 0; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // How many bytes were read from the net or cache so far (and potentially 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pushed into a filter for processing)? 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64 GetByteReadCount() const = 0; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What response code was received with the associated network transaction? 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example: 200 is ok. 4xx are error codes. etc. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetResponseCode() const = 0; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The URLRequestContext associated with the request. 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual const URLRequestContext* GetURLRequestContext() const = 0; 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following method forces the context to emit a specific set of 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // statistics as selected by the argument. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RecordPacketStats(StatisticSelector statistic) const = 0; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE Filter { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return values of function ReadFilteredData. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum FilterStatus { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read filtered data successfully 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_OK, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read filtered data successfully, and the data in the buffer has been 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consumed by the filter, but more data is needed in order to continue 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filtering. At this point, the caller is free to reuse the filter 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer to provide more data. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_NEED_MORE_DATA, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read filtered data successfully, and filter reaches the end of the data 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_DONE, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is an error during filtering. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_ERROR 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies type of filters that can be created. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum FilterType { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_DEFLATE, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_GZIP, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_GZIP_HELPING_SDCH, // Gzip possible, but pass through allowed. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_SDCH, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_SDCH_POSSIBLE, // Sdch possible, but pass through allowed. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILTER_TYPE_UNSUPPORTED, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Filter(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a Filter object. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: Filter_types specifies the type of filter created; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filter_context allows filters to acquire additional details needed for 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // construction and operation, such as a specification of requisite input 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // buffer size. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If success, the function returns the pointer to the Filter object created. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If failed or a filter is not needed, the function returns NULL. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: filter_types is an array of filter types (content encoding types as 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided in an HTTP header), which will be chained together serially to do 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // successive filtering of data. The types in the vector are ordered based on 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encoding order, and the filters are chained to operate in the reverse 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (decoding) order. For example, types[0] = FILTER_TYPE_SDCH, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types[1] = FILTER_TYPE_GZIP will cause data to first be gunzip filtered, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the resulting output from that filter will be sdch decoded. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* Factory(const std::vector<FilterType>& filter_types, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilterContext& filter_context); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A simpler version of Factory() which creates a single, unchained 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter of type FILTER_TYPE_GZIP, or NULL if the filter could not be 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* GZipFactory(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External call to obtain data from this filter chain. If ther is no 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // next_filter_, then it obtains data from this specific filter. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilterStatus ReadData(char* dest_buffer, int* dest_len); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the stream_buffer_. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IOBuffer* stream_buffer() const { return stream_buffer_.get(); } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the maximum size of stream_buffer_ in number of chars. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stream_buffer_size() const { return stream_buffer_size_; } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the total number of chars remaining in stream_buffer_ to be 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filtered. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the function returns 0 then all data has been filtered, and the caller 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is safe to copy new data into stream_buffer_. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stream_data_len() const { return stream_data_len_; } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flushes stream_buffer_ for next round of filtering. After copying data to 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream_buffer_, the caller should call this function to notify Filter to 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // start filtering. Then after this function is called, the caller can get 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // post-filtered data using ReadFilteredData. The caller must not write to 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream_buffer_ and call this function again before stream_buffer_ is 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // emptied out by ReadFilteredData. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The input stream_data_len is the length (in number of chars) of valid 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data in stream_buffer_. It can not be greater than stream_buffer_size_. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The function returns true if success, and false otherwise. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool FlushStreamBuffer(int stream_data_len); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Translate the text of a filter name (from Content-Encoding header) into a 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FilterType. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static FilterType ConvertEncodingToType(const std::string& filter_type); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given a array of encoding_types, try to do some error recovery adjustment 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the list. This includes handling known bugs in the Apache server (where 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redundant gzip encoding is specified), as well as issues regarding SDCH 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encoding, where various proxies and anti-virus products modify or strip the 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encodings. These fixups require context, which includes whether this 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response was made to an SDCH request (i.e., an available dictionary was 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // advertised in the GET), as well as the mime type of the content. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void FixupEncodingTypes(const FilterContext& filter_context, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FilterType>* encoding_types); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class GZipUnitTest; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SdchFilterChainingTest; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Filter(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters the data stored in stream_buffer_ and writes the output into the 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dest_buffer passed in. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Upon entry, *dest_len is the total size (in number of chars) of the 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destination buffer. Upon exit, *dest_len is the actual number of chars 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // written into the destination buffer. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function will fail if there is no pre-filter data in the 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream_buffer_. On the other hand, *dest_len can be 0 upon successful 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return. For example, a decoding filter may process some pre-filter data 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but not produce output yet. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FilterStatus ReadFilteredData(char* dest_buffer, int* dest_len) = 0; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy pre-filter data directly to destination buffer without decoding. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilterStatus CopyOut(char* dest_buffer, int* dest_len); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilterStatus last_status() const { return last_status_; } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Buffer to hold the data to be filtered (the input queue). 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<IOBuffer> stream_buffer_; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maximum size of stream_buffer_ in number of chars. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stream_buffer_size_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to the next data in stream_buffer_ to be filtered. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* next_stream_data_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Total number of remaining chars in stream_buffer_ to be filtered. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stream_data_len_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocates and initializes stream_buffer_ and stream_buffer_size_. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitBuffer(int size); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A factory helper for creating filters for within a chain of potentially 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // multiple encodings. If a chain of filters is created, then this may be 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called multiple times during the filter creation process. In most simple 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cases, this is only called once. Returns NULL and cleans up (deleting 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filter_list) if a new filter can't be constructed. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* PrependNewFilter(FilterType type_id, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilterContext& filter_context, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Filter* filter_list); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper methods for PrependNewFilter. If initialization is successful, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they return a fully initialized Filter. Otherwise, return NULL. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* InitGZipFilter(FilterType type_id, int buffer_size); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* InitSdchFilter(FilterType type_id, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilterContext& filter_context, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to empty our output into the next filter's input. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PushDataIntoNextFilter(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a filter with an internal buffer of the given size. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only meant to be called by unit tests that need to control the buffer size. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Filter* FactoryForTests(const std::vector<FilterType>& filter_types, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilterContext& filter_context, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An optional filter to process output from this filter. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Filter> next_filter_; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remember what status or local filter last returned so we can better handle 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chained filters. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilterStatus last_status_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Filter); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // NET_FILTER_FILTER_H__ 285