| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/url_request/url_request_filter.h" |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "net/base/request_priority.h" |
| #include "net/url_request/url_request.h" |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_interceptor.h" |
| #include "net/url_request/url_request_job.h" |
| #include "net/url_request/url_request_test_job.h" |
| #include "net/url_request/url_request_test_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace net { |
| |
| namespace { |
| |
| class TestURLRequestInterceptor : public URLRequestInterceptor { |
| public: |
| TestURLRequestInterceptor() : job_(nullptr) {} |
| ~TestURLRequestInterceptor() override {} |
| |
| // URLRequestInterceptor implementation: |
| URLRequestJob* MaybeInterceptRequest( |
| URLRequest* request, |
| NetworkDelegate* network_delegate) const override { |
| job_ = new URLRequestTestJob(request, network_delegate); |
| return job_; |
| } |
| |
| // Is |job| the URLRequestJob generated during interception? |
| bool WasLastJobCreated(URLRequestJob* job) const { |
| return job_ && job_ == job; |
| } |
| |
| private: |
| mutable URLRequestTestJob* job_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TestURLRequestInterceptor); |
| }; |
| |
| TEST(URLRequestFilter, BasicMatching) { |
| TestDelegate delegate; |
| TestURLRequestContext request_context; |
| URLRequestFilter* filter = URLRequestFilter::GetInstance(); |
| |
| const GURL kUrl1("http://foo.com/"); |
| std::unique_ptr<URLRequest> request1( |
| request_context.CreateRequest(kUrl1, DEFAULT_PRIORITY, &delegate)); |
| |
| const GURL kUrl2("http://bar.com/"); |
| std::unique_ptr<URLRequest> request2( |
| request_context.CreateRequest(kUrl2, DEFAULT_PRIORITY, &delegate)); |
| |
| // Check AddUrlInterceptor checks for invalid URLs. |
| EXPECT_FALSE(filter->AddUrlInterceptor( |
| GURL(), |
| std::unique_ptr<URLRequestInterceptor>(new TestURLRequestInterceptor()))); |
| |
| // Check URLRequestInterceptor URL matching. |
| filter->ClearHandlers(); |
| TestURLRequestInterceptor* interceptor = new TestURLRequestInterceptor(); |
| EXPECT_TRUE(filter->AddUrlInterceptor( |
| kUrl1, std::unique_ptr<URLRequestInterceptor>(interceptor))); |
| { |
| std::unique_ptr<URLRequestJob> found( |
| filter->MaybeInterceptRequest(request1.get(), NULL)); |
| EXPECT_TRUE(interceptor->WasLastJobCreated(found.get())); |
| } |
| EXPECT_EQ(filter->hit_count(), 1); |
| |
| // Check we don't match other URLs. |
| EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL); |
| EXPECT_EQ(1, filter->hit_count()); |
| |
| // Check we can remove URL matching. |
| filter->RemoveUrlHandler(kUrl1); |
| EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL); |
| EXPECT_EQ(1, filter->hit_count()); |
| |
| // Check hostname matching. |
| filter->ClearHandlers(); |
| EXPECT_EQ(0, filter->hit_count()); |
| interceptor = new TestURLRequestInterceptor(); |
| filter->AddHostnameInterceptor( |
| kUrl1.scheme(), kUrl1.host(), |
| std::unique_ptr<URLRequestInterceptor>(interceptor)); |
| { |
| std::unique_ptr<URLRequestJob> found( |
| filter->MaybeInterceptRequest(request1.get(), NULL)); |
| EXPECT_TRUE(interceptor->WasLastJobCreated(found.get())); |
| } |
| EXPECT_EQ(1, filter->hit_count()); |
| |
| // Check we don't match other hostnames. |
| EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL); |
| EXPECT_EQ(1, filter->hit_count()); |
| |
| // Check we can remove hostname matching. |
| filter->RemoveHostnameHandler(kUrl1.scheme(), kUrl1.host()); |
| EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL); |
| EXPECT_EQ(1, filter->hit_count()); |
| |
| filter->ClearHandlers(); |
| } |
| |
| } // namespace |
| |
| } // namespace net |