| Index: net/test/url_request/url_request_mock_data_job.cc
|
| diff --git a/net/test/url_request/url_request_mock_data_job.cc b/net/test/url_request/url_request_mock_data_job.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..54c174c091baa7ce0052291d041a052a8a86adea
|
| --- /dev/null
|
| +++ b/net/test/url_request/url_request_mock_data_job.cc
|
| @@ -0,0 +1,165 @@
|
| +// Copyright 2014 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/test/url_request/url_request_mock_data_job.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "net/base/io_buffer.h"
|
| +#include "net/base/url_util.h"
|
| +#include "net/http/http_request_headers.h"
|
| +#include "net/url_request/url_request_filter.h"
|
| +
|
| +namespace net {
|
| +namespace {
|
| +
|
| +const char kMockHostname[] = "mock.data";
|
| +
|
| +// Gets the data from URL of the form:
|
| +// scheme://kMockHostname/?data=abc&repeat_count=nnn.
|
| +std::string GetDataFromRequest(const net::URLRequest& request) {
|
| + std::string value;
|
| + if (!GetValueForKeyInQuery(request.url(), "data", &value))
|
| + return "default_data";
|
| + return value;
|
| +}
|
| +
|
| +// Gets the numeric repeat count from URL of the form:
|
| +// scheme://kMockHostname/?data=abc&repeat_count=nnn.
|
| +int GetRepeatCountFromRequest(const net::URLRequest& request) {
|
| + std::string value;
|
| + if (!GetValueForKeyInQuery(request.url(), "repeat", &value))
|
| + return 1;
|
| +
|
| + int repeat_count;
|
| + if (!base::StringToInt(value, &repeat_count))
|
| + return 1;
|
| +
|
| + DCHECK_GT(repeat_count, 0);
|
| +
|
| + return repeat_count;
|
| +}
|
| +
|
| +GURL GetMockUrl(const std::string& scheme,
|
| + const std::string& hostname,
|
| + const std::string& data,
|
| + int data_repeat_count) {
|
| + DCHECK_GT(data_repeat_count, 0);
|
| + std::string url(scheme + "://" + hostname + "/");
|
| + url.append("?data=");
|
| + url.append(data);
|
| + url.append("&repeat=");
|
| + url.append(base::IntToString(data_repeat_count));
|
| + return GURL(url);
|
| +}
|
| +
|
| +class MockJobInterceptor : public net::URLRequestInterceptor {
|
| + public:
|
| + MockJobInterceptor() {}
|
| + ~MockJobInterceptor() override {}
|
| +
|
| + // net::URLRequestInterceptor implementation
|
| + net::URLRequestJob* MaybeInterceptRequest(
|
| + net::URLRequest* request,
|
| + net::NetworkDelegate* network_delegate) const override {
|
| + return new URLRequestMockDataJob(request, network_delegate,
|
| + GetDataFromRequest(*request),
|
| + GetRepeatCountFromRequest(*request));
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(MockJobInterceptor);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +URLRequestMockDataJob::URLRequestMockDataJob(URLRequest* request,
|
| + NetworkDelegate* network_delegate,
|
| + const std::string& data,
|
| + int data_repeat_count)
|
| + : URLRequestJob(request, network_delegate),
|
| + data_offset_(0),
|
| + weak_factory_(this) {
|
| + DCHECK_GT(data_repeat_count, 0);
|
| + for (int i = 0; i < data_repeat_count; ++i) {
|
| + data_.append(data);
|
| + }
|
| +}
|
| +
|
| +void URLRequestMockDataJob::Start() {
|
| + // Start reading asynchronously so that all error reporting and data
|
| + // callbacks happen as they would for network requests.
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(&URLRequestMockDataJob::StartAsync,
|
| + weak_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| +URLRequestMockDataJob::~URLRequestMockDataJob() {
|
| +}
|
| +
|
| +bool URLRequestMockDataJob::ReadRawData(IOBuffer* buf,
|
| + int buf_size,
|
| + int* bytes_read) {
|
| + DCHECK(bytes_read);
|
| + *bytes_read = static_cast<int>(
|
| + std::min(static_cast<size_t>(buf_size), data_.length() - data_offset_));
|
| + memcpy(buf->data(), data_.c_str() + data_offset_, *bytes_read);
|
| + data_offset_ += *bytes_read;
|
| + return true;
|
| +}
|
| +
|
| +void URLRequestMockDataJob::StartAsync() {
|
| + if (!request_)
|
| + return;
|
| +
|
| + set_expected_content_size(data_.length());
|
| + NotifyHeadersComplete();
|
| +}
|
| +
|
| +// static
|
| +void URLRequestMockDataJob::AddUrlHandler() {
|
| + return AddUrlHandlerForHostname(kMockHostname);
|
| +}
|
| +
|
| +// static
|
| +void URLRequestMockDataJob::AddUrlHandlerForHostname(
|
| + const std::string& hostname) {
|
| + // Add |hostname| to net::URLRequestFilter for HTTP and HTTPS.
|
| + net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance();
|
| + filter->AddHostnameInterceptor("http", hostname,
|
| + make_scoped_ptr(new MockJobInterceptor()));
|
| + filter->AddHostnameInterceptor("https", hostname,
|
| + make_scoped_ptr(new MockJobInterceptor()));
|
| +}
|
| +
|
| +// static
|
| +GURL URLRequestMockDataJob::GetMockHttpUrl(const std::string& data,
|
| + int repeat_count) {
|
| + return GetMockHttpUrlForHostname(kMockHostname, data, repeat_count);
|
| +}
|
| +
|
| +// static
|
| +GURL URLRequestMockDataJob::GetMockHttpsUrl(const std::string& data,
|
| + int repeat_count) {
|
| + return GetMockHttpsUrlForHostname(kMockHostname, data, repeat_count);
|
| +}
|
| +
|
| +// static
|
| +GURL URLRequestMockDataJob::GetMockHttpUrlForHostname(
|
| + const std::string& hostname,
|
| + const std::string& data,
|
| + int repeat_count) {
|
| + return GetMockUrl("http", hostname, data, repeat_count);
|
| +}
|
| +
|
| +// static
|
| +GURL URLRequestMockDataJob::GetMockHttpsUrlForHostname(
|
| + const std::string& hostname,
|
| + const std::string& data,
|
| + int repeat_count) {
|
| + return GetMockUrl("https", hostname, data, repeat_count);
|
| +}
|
| +
|
| +} // namespace net
|
|
|