Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Unified Diff: headless/public/util/generic_url_request_job.h

Issue 2260793002: Headless utility classes for making deterministic protocol handlers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « headless/public/util/expedited_dispatcher_test.cc ('k') | headless/public/util/generic_url_request_job.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « headless/public/util/expedited_dispatcher_test.cc ('k') | headless/public/util/generic_url_request_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698