Add support for response filtering (issue #515).

- Add a new CefRequestHandler::GetResourceResponseFilter method and
  CefResponseFilter class.
This commit is contained in:
Marshall Greenblatt
2015-12-04 21:58:56 -05:00
parent 864db71f6b
commit f207a555a3
40 changed files with 1765 additions and 6 deletions

View File

@ -0,0 +1,60 @@
diff --git base/network_delegate.h base/network_delegate.h
index e8d82a3..8b536d7 100644
--- base/network_delegate.h
+++ base/network_delegate.h
@@ -35,6 +35,7 @@ namespace net {
// of net/base here, because we have a net_base library. Forward declarations
// are ok.
class CookieOptions;
+class Filter;
class HttpRequestHeaders;
class HttpResponseHeaders;
class ProxyInfo;
@@ -118,6 +119,13 @@ class NET_EXPORT NetworkDelegate : public base::NonThreadSafe {
const GURL& target_url,
const GURL& referrer_url) const;
+ // Optionally add a new filter to the filter list. Returns the first filter in
+ // the list.
+ virtual Filter* SetupFilter(URLRequest* request,
+ Filter* filter_list) {
+ return filter_list;
+ }
+
private:
// This is the interface for subclasses of NetworkDelegate to implement. These
// member functions will be called by the respective public notification
diff --git filter/filter.h filter/filter.h
index 1904a8c..8d5f1ec 100644
--- filter/filter.h
+++ filter/filter.h
@@ -57,6 +57,7 @@
#include "net/base/net_export.h"
#include "net/base/sdch_manager.h"
+class CefNetworkDelegate;
class GURL;
namespace net {
@@ -231,6 +232,7 @@ class NET_EXPORT_PRIVATE Filter {
std::string OrderedFilterList() const;
protected:
+ friend class ::CefNetworkDelegate;
friend class GZipUnitTest;
friend class SdchFilterChainingTest;
FRIEND_TEST_ALL_PREFIXES(FilterTest, ThreeFilterChain);
diff --git url_request/url_request_job.cc url_request/url_request_job.cc
index 641c07b..e613c86 100644
--- url_request/url_request_job.cc
+++ url_request/url_request_job.cc
@@ -466,6 +466,9 @@ void URLRequestJob::NotifyHeadersComplete() {
if (request_->status().is_success())
filter_.reset(SetupFilter());
+ if (network_delegate_)
+ filter_.reset(network_delegate_->SetupFilter(request_, filter_.release()));
+
if (!filter_.get()) {
std::string content_length;
request_->GetResponseHeaderByName("content-length", &content_length);