Commit bb4b6625 authored by Yoichi Osato's avatar Yoichi Osato Committed by Commit Bot

Restruct ResourceRequest splitting blink::ResourceRequestHead

Since in some cases the request body was not accessed after copying,
this CL introduces ResourceRequestHead class which represents request
without request body.
The existing ResourceRequest occurrence not using request body will
be migrated to ResourceRequestHead.

Previous discussion:
"Restruct blink::ResourceRequest for streaming body upload"
http://bit.ly/2OdzJ1e

Brief summary:
class ResourceRequestHead {
 KURL kurl;
 ...
};

class ResourceRequest : public ResourceRequestHead {
 scoped_refptr<EncodedFormData> http_body_;
};

Bug: 787704
Change-Id: Ifedfeac31843cbcd5c9966fda9ac062fde26921d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2032451
Commit-Queue: Yoichi Osato <yoichio@chromium.org>
Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#740533}
parent 6b0a0e0a
...@@ -54,40 +54,25 @@ namespace blink { ...@@ -54,40 +54,25 @@ namespace blink {
class EncodedFormData; class EncodedFormData;
// A ResourceRequest is a "request" object for ResourceLoader. Conceptually // ResourceRequestHead represents request without request body.
// it is https://fetch.spec.whatwg.org/#concept-request, but it contains // See ResourceRequest below to see what request is.
// a lot of blink specific fields. WebURLRequest is the "public version" // ResourceRequestHead is implicitly copyable while ResourceRequest is not.
// of this class and WebURLLoader needs it. See WebURLRequest and // TODO(yoichio) : Migrate existing ResourceRequest occurrence not using request
// WrappedResourceRequest. // body to ResourceRequestHead.
// class PLATFORM_EXPORT ResourceRequestHead {
// This class is thread-bound. Do not copy/pass an instance across threads. DISALLOW_NEW();
class PLATFORM_EXPORT ResourceRequest final {
USING_FAST_MALLOC(ResourceRequest);
public: public:
enum class RedirectStatus : uint8_t { kFollowedRedirect, kNoRedirect }; enum class RedirectStatus : uint8_t { kFollowedRedirect, kNoRedirect };
ResourceRequest(); ResourceRequestHead();
explicit ResourceRequest(const String& url_string); explicit ResourceRequestHead(const KURL&);
explicit ResourceRequest(const KURL&);
ResourceRequest(const ResourceRequest&) = delete;
ResourceRequest(ResourceRequest&&);
ResourceRequest& operator=(ResourceRequest&&);
~ResourceRequest(); explicit ResourceRequestHead(const ResourceRequestHead&);
ResourceRequestHead& operator=(const ResourceRequestHead&);
explicit ResourceRequestHead(ResourceRequestHead&&);
ResourceRequestHead& operator=(ResourceRequestHead&&);
// TODO(yoichio): Use move semantics as much as possible. ~ResourceRequestHead();
// See crbug.com/787704.
void CopyFrom(const ResourceRequest&);
// Constructs a new ResourceRequest for a redirect from this instance.
std::unique_ptr<ResourceRequest> CreateRedirectRequest(
const KURL& new_url,
const AtomicString& new_method,
const net::SiteForCookies& new_site_for_cookies,
const String& new_referrer,
network::mojom::ReferrerPolicy new_referrer_policy,
bool skip_service_worker) const;
bool IsNull() const; bool IsNull() const;
...@@ -187,9 +172,6 @@ class PLATFORM_EXPORT ResourceRequest final { ...@@ -187,9 +172,6 @@ class PLATFORM_EXPORT ResourceRequest final {
SetHttpHeaderField(http_names::kAccept, http_accept); SetHttpHeaderField(http_names::kAccept, http_accept);
} }
EncodedFormData* HttpBody() const;
void SetHttpBody(scoped_refptr<EncodedFormData>);
bool AllowStoredCredentials() const; bool AllowStoredCredentials() const;
void SetAllowStoredCredentials(bool allow_credentials); void SetAllowStoredCredentials(bool allow_credentials);
...@@ -452,8 +434,6 @@ class PLATFORM_EXPORT ResourceRequest final { ...@@ -452,8 +434,6 @@ class PLATFORM_EXPORT ResourceRequest final {
bool CanDisplay(const KURL&) const; bool CanDisplay(const KURL&) const;
private: private:
ResourceRequest& operator=(const ResourceRequest&);
const CacheControlHeader& GetCacheControlHeader() const; const CacheControlHeader& GetCacheControlHeader() const;
bool NeedsHTTPOrigin() const; bool NeedsHTTPOrigin() const;
...@@ -473,7 +453,6 @@ class PLATFORM_EXPORT ResourceRequest final { ...@@ -473,7 +453,6 @@ class PLATFORM_EXPORT ResourceRequest final {
AtomicString http_method_; AtomicString http_method_;
HTTPHeaderMap http_header_fields_; HTTPHeaderMap http_header_fields_;
scoped_refptr<EncodedFormData> http_body_;
bool allow_stored_credentials_ : 1; bool allow_stored_credentials_ : 1;
bool report_upload_progress_ : 1; bool report_upload_progress_ : 1;
bool report_raw_headers_ : 1; bool report_raw_headers_ : 1;
...@@ -546,6 +525,56 @@ class PLATFORM_EXPORT ResourceRequest final { ...@@ -546,6 +525,56 @@ class PLATFORM_EXPORT ResourceRequest final {
base::Optional<base::UnguessableToken> recursive_prefetch_token_; base::Optional<base::UnguessableToken> recursive_prefetch_token_;
}; };
// A ResourceRequest is a "request" object for ResourceLoader. Conceptually
// it is https://fetch.spec.whatwg.org/#concept-request, but it contains
// a lot of blink specific fields. WebURLRequest is the "public version"
// of this class and WebURLLoader needs it. See WebURLRequest and
// WrappedResourceRequest.
//
// This class is thread-bound. Do not copy/pass an instance across threads.
//
// Although request consists head and body, ResourceRequest is implemented by
// inheriting ResourceRequestHead due in order to make it possible to use
// property accessors through both ResourceRequestHead and ResourceRequest while
// avoiding duplicate accessor definitions.
// For those who want to add a new property in request, please implement its
// member and accessors in ResourceRequestHead instead of ResourceRequest.
class PLATFORM_EXPORT ResourceRequest final : public ResourceRequestHead {
USING_FAST_MALLOC(ResourceRequest);
public:
ResourceRequest();
explicit ResourceRequest(const String& url_string);
explicit ResourceRequest(const KURL&);
ResourceRequest(const ResourceRequest&) = delete;
ResourceRequest(ResourceRequest&&);
ResourceRequest& operator=(ResourceRequest&&);
~ResourceRequest();
// TODO(yoichio): Use move semantics as much as possible.
// See crbug.com/787704.
void CopyFrom(const ResourceRequest&);
// Constructs a new ResourceRequest for a redirect from this instance.
std::unique_ptr<ResourceRequest> CreateRedirectRequest(
const KURL& new_url,
const AtomicString& new_method,
const net::SiteForCookies& new_site_for_cookies,
const String& new_referrer,
network::mojom::ReferrerPolicy new_referrer_policy,
bool skip_service_worker) const;
EncodedFormData* HttpBody() const;
void SetHttpBody(scoped_refptr<EncodedFormData>);
private:
ResourceRequest& operator=(const ResourceRequest&);
scoped_refptr<EncodedFormData> http_body_;
};
} // namespace blink } // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_REQUEST_H_ #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_RESOURCE_REQUEST_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment