| Index: headless/public/util/generic_url_request_job.h
|
| diff --git a/headless/public/util/generic_url_request_job.h b/headless/public/util/generic_url_request_job.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2890a6eba65b92cab4537989a63326a594016933
|
| --- /dev/null
|
| +++ b/headless/public/util/generic_url_request_job.h
|
| @@ -0,0 +1,128 @@
|
| +// Copyright 2016 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.
|
| +
|
| +#ifndef HEADLESS_PUBLIC_UTIL_GENERIC_URL_REQUEST_JOB_H_
|
| +#define HEADLESS_PUBLIC_UTIL_GENERIC_URL_REQUEST_JOB_H_
|
| +
|
| +#include <stddef.h>
|
| +#include <functional>
|
| +#include <memory>
|
| +#include <string>
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "headless/public/util/managed_dispatch_url_request_job.h"
|
| +#include "headless/public/util/url_fetcher.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/url_request/url_request.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace net {
|
| +class HttpResponseHeaders;
|
| +class IOBuffer;
|
| +} // namespace net
|
| +
|
| +namespace headless {
|
| +
|
| +class URLRequestDispatcher;
|
| +
|
| +// Intended for use in a protocol handler, this ManagedDispatchURLRequestJob has
|
| +// the following features:
|
| +//
|
| +// 1. The delegate can extension observe / cancel and redirect requests
|
| +// 2. The delegate can optionally provide the results, otherwise the specifed
|
| +// fetcher is invoked.
|
| +class GenericURLRequestJob : public ManagedDispatchURLRequestJob,
|
| + public URLFetcher::ResultListener {
|
| + public:
|
| + enum class RewriteResult { kAllow, kDeny, kFailure };
|
| + using RewriteCallback =
|
| + std::function<void(RewriteResult result, const GURL& url)>;
|
| +
|
| + struct HttpResponse {
|
| + GURL final_url;
|
| + int http_response_code;
|
| +
|
| + // The HTTP headers and response body. Note the lifetime of |response_data|
|
| + // is expected to outlive the GenericURLRequestJob.
|
| + const char* response_data; // NOT OWNED
|
| + size_t response_data_size;
|
| + };
|
| +
|
| + class Delegate {
|
| + public:
|
| + // Allows the delegate to rewrite the URL for a given request. Return true
|
| + // to signal that the rewrite is in progress and |callback| will be called
|
| + // with the result, or false to indicate that no rewriting is necessary.
|
| + // Called on an arbitrary thread.
|
| + virtual bool BlockOrRewriteRequest(const GURL& url,
|
| + const std::string& referrer,
|
| + RewriteCallback callback) = 0;
|
| +
|
| + // Allows the delegate to synchronously fulfill a request with a reply.
|
| + // Called on an arbitrary thread.
|
| + virtual const HttpResponse* MaybeMatchResource(
|
| + const GURL& url,
|
| + const net::HttpRequestHeaders& request_headers) = 0;
|
| +
|
| + // Signals that a resource load has finished. Called on an arbitrary thread.
|
| + virtual void OnResourceLoadComplete(const GURL& final_url,
|
| + const std::string& mime_type,
|
| + int http_response_code) = 0;
|
| +
|
| + protected:
|
| + virtual ~Delegate() {}
|
| + };
|
| +
|
| + // NOTE |url_request_dispatcher| and |delegate| must outlive the
|
| + // GenericURLRequestJob.
|
| + GenericURLRequestJob(net::URLRequest* request,
|
| + net::NetworkDelegate* network_delegate,
|
| + URLRequestDispatcher* url_request_dispatcher,
|
| + std::unique_ptr<URLFetcher> url_fetcher,
|
| + Delegate* delegate);
|
| + ~GenericURLRequestJob() override;
|
| +
|
| + // net::URLRequestJob implementation:
|
| + void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
|
| + void Start() override;
|
| + int ReadRawData(net::IOBuffer* buf, int buf_size) override;
|
| + int GetResponseCode() const override;
|
| + void GetResponseInfo(net::HttpResponseInfo* info) override;
|
| + bool GetMimeType(std::string* mime_type) const override;
|
| + bool GetCharset(std::string* charset) override;
|
| +
|
| + // URLFetcher::FetchResultListener implementation:
|
| + void OnStartError(net::Error error) override;
|
| + void OnFetchComplete(const GURL& final_url,
|
| + int http_response_code,
|
| + scoped_refptr<net::HttpResponseHeaders> response_headers,
|
| + const char* body,
|
| + size_t body_size) override;
|
| +
|
| + private:
|
| + void PrepareCookies(const GURL& rewritten_url,
|
| + const url::Origin& site_for_cookies);
|
| +
|
| + void OnCookiesAvailable(const GURL& rewritten_url,
|
| + const net::CookieList& cookie_list);
|
| +
|
| + std::unique_ptr<URLFetcher> url_fetcher_;
|
| + net::HttpRequestHeaders extra_request_headers_;
|
| + scoped_refptr<net::HttpResponseHeaders> response_headers_;
|
| + Delegate* delegate_; // Not owned.
|
| + const char* body_ = nullptr; // Not owned.
|
| + int http_response_code_ = 0;
|
| + size_t body_size_ = 0;
|
| + size_t read_offset_ = 0;
|
| +
|
| + base::WeakPtrFactory<GenericURLRequestJob> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GenericURLRequestJob);
|
| +};
|
| +
|
| +} // namespace headless
|
| +
|
| +#endif // HEADLESS_PUBLIC_UTIL_GENERIC_URL_REQUEST_JOB_H_
|
|
|