diff options
author | Lucas Fantacuci <lucasfantacuci@gmail.com> | 2018-12-21 17:38:22 -0200 |
---|---|---|
committer | Lucas Sanches Fantacuci <lucasfantacuci@gmail.com> | 2019-04-10 14:01:30 -0300 |
commit | 6b2be9b31de1503e90a62cc7d597dc4bd467d998 (patch) | |
tree | 869e624bc018c9a7f97d40dccea6883f66d400da /components/net_traits/request.rs | |
parent | dd2deeabca7eeb40e6a8fe0c1ee4550d64e0c235 (diff) | |
download | servo-6b2be9b31de1503e90a62cc7d597dc4bd467d998.tar.gz servo-6b2be9b31de1503e90a62cc7d597dc4bd467d998.zip |
Implementing the builder pattern for RequestInit
Diffstat (limited to 'components/net_traits/request.rs')
-rw-r--r-- | components/net_traits/request.rs | 179 |
1 files changed, 138 insertions, 41 deletions
diff --git a/components/net_traits/request.rs b/components/net_traits/request.rs index 2c32b666f52..e56f45a8511 100644 --- a/components/net_traits/request.rs +++ b/components/net_traits/request.rs @@ -8,7 +8,6 @@ use http::HeaderMap; use hyper::Method; use msg::constellation_msg::PipelineId; use servo_url::{ImmutableOrigin, ServoUrl}; -use std::default::Default; /// An [initiator](https://fetch.spec.whatwg.org/#concept-request-initiator) #[derive(Clone, Copy, MallocSizeOf, PartialEq)] @@ -136,7 +135,7 @@ pub enum CorsSettings { } #[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] -pub struct RequestInit { +pub struct RequestBuilder { #[serde( deserialize_with = "::hyper_serde::deserialize", serialize_with = "::hyper_serde::serialize" @@ -172,11 +171,11 @@ pub struct RequestInit { pub url_list: Vec<ServoUrl>, } -impl Default for RequestInit { - fn default() -> RequestInit { - RequestInit { +impl RequestBuilder { + pub fn new(url: ServoUrl) -> RequestBuilder { + RequestBuilder { method: Method::GET, - url: ServoUrl::parse("about:blank").unwrap(), + url: url, headers: HeaderMap::new(), unsafe_request: false, body: None, @@ -197,6 +196,139 @@ impl Default for RequestInit { url_list: vec![], } } + + pub fn method(mut self, method: Method) -> RequestBuilder { + self.method = method; + self + } + + pub fn headers(mut self, headers: HeaderMap) -> RequestBuilder { + self.headers = headers; + self + } + + pub fn unsafe_request(mut self, unsafe_request: bool) -> RequestBuilder { + self.unsafe_request = unsafe_request; + self + } + + pub fn body(mut self, body: Option<Vec<u8>>) -> RequestBuilder { + self.body = body; + self + } + + pub fn service_workers_mode( + mut self, + service_workers_mode: ServiceWorkersMode, + ) -> RequestBuilder { + self.service_workers_mode = service_workers_mode; + self + } + + pub fn destination(mut self, destination: Destination) -> RequestBuilder { + self.destination = destination; + self + } + + pub fn synchronous(mut self, synchronous: bool) -> RequestBuilder { + self.synchronous = synchronous; + self + } + + pub fn mode(mut self, mode: RequestMode) -> RequestBuilder { + self.mode = mode; + self + } + + pub fn cache_mode(mut self, cache_mode: CacheMode) -> RequestBuilder { + self.cache_mode = cache_mode; + self + } + + pub fn use_cors_preflight(mut self, use_cors_preflight: bool) -> RequestBuilder { + self.use_cors_preflight = use_cors_preflight; + self + } + + pub fn credentials_mode(mut self, credentials_mode: CredentialsMode) -> RequestBuilder { + self.credentials_mode = credentials_mode; + self + } + + pub fn use_url_credentials(mut self, use_url_credentials: bool) -> RequestBuilder { + self.use_url_credentials = use_url_credentials; + self + } + + pub fn origin(mut self, origin: ImmutableOrigin) -> RequestBuilder { + self.origin = origin; + self + } + + pub fn referrer_url(mut self, referrer_url: Option<ServoUrl>) -> RequestBuilder { + self.referrer_url = referrer_url; + self + } + + pub fn referrer_policy(mut self, referrer_policy: Option<ReferrerPolicy>) -> RequestBuilder { + self.referrer_policy = referrer_policy; + self + } + + pub fn pipeline_id(mut self, pipeline_id: Option<PipelineId>) -> RequestBuilder { + self.pipeline_id = pipeline_id; + self + } + + pub fn redirect_mode(mut self, redirect_mode: RedirectMode) -> RequestBuilder { + self.redirect_mode = redirect_mode; + self + } + + pub fn integrity_metadata(mut self, integrity_metadata: String) -> RequestBuilder { + self.integrity_metadata = integrity_metadata; + self + } + + pub fn url_list(mut self, url_list: Vec<ServoUrl>) -> RequestBuilder { + self.url_list = url_list; + self + } + + pub fn build(self) -> Request { + let mut request = Request::new( + self.url.clone(), + Some(Origin::Origin(self.origin)), + self.pipeline_id, + ); + request.method = self.method; + request.headers = self.headers; + request.unsafe_request = self.unsafe_request; + request.body = self.body; + request.service_workers_mode = self.service_workers_mode; + request.destination = self.destination; + request.synchronous = self.synchronous; + request.mode = self.mode; + request.use_cors_preflight = self.use_cors_preflight; + request.credentials_mode = self.credentials_mode; + request.use_url_credentials = self.use_url_credentials; + request.cache_mode = self.cache_mode; + request.referrer = if let Some(url) = self.referrer_url { + Referrer::ReferrerUrl(url) + } else { + Referrer::NoReferrer + }; + request.referrer_policy = self.referrer_policy; + request.redirect_mode = self.redirect_mode; + let mut url_list = self.url_list; + if url_list.is_empty() { + url_list.push(self.url); + } + request.redirect_count = url_list.len() as u32 - 1; + request.url_list = url_list; + request.integrity_metadata = self.integrity_metadata; + request + } } /// A [Request](https://fetch.spec.whatwg.org/#concept-request) as defined by @@ -294,41 +426,6 @@ impl Request { } } - pub fn from_init(init: RequestInit) -> Request { - let mut req = Request::new( - init.url.clone(), - Some(Origin::Origin(init.origin)), - init.pipeline_id, - ); - req.method = init.method; - req.headers = init.headers; - req.unsafe_request = init.unsafe_request; - req.body = init.body; - req.service_workers_mode = init.service_workers_mode; - req.destination = init.destination; - req.synchronous = init.synchronous; - req.mode = init.mode; - req.use_cors_preflight = init.use_cors_preflight; - req.credentials_mode = init.credentials_mode; - req.use_url_credentials = init.use_url_credentials; - req.cache_mode = init.cache_mode; - req.referrer = if let Some(url) = init.referrer_url { - Referrer::ReferrerUrl(url) - } else { - Referrer::NoReferrer - }; - req.referrer_policy = init.referrer_policy; - req.redirect_mode = init.redirect_mode; - let mut url_list = init.url_list; - if url_list.is_empty() { - url_list.push(init.url); - } - req.redirect_count = url_list.len() as u32 - 1; - req.url_list = url_list; - req.integrity_metadata = init.integrity_metadata; - req - } - /// <https://fetch.spec.whatwg.org/#concept-request-url> pub fn url(&self) -> ServoUrl { self.url_list.first().unwrap().clone() |