From f4437ea7b1c2a208fe07d17184d473b32b176ce4 Mon Sep 17 00:00:00 2001 From: knight42 Date: Sun, 22 Oct 2017 13:01:35 +0800 Subject: [PATCH] feat: set default headers --- src/async_impl/client.rs | 53 ++++++++++++++++++++++++++-------------- src/client.rs | 46 +++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index 32ab23d..9d1d57c 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -63,6 +63,7 @@ pub struct ClientBuilder { struct Config { gzip: bool, + headers: Headers, hostname_verification: bool, proxies: Vec, redirect_policy: RedirectPolicy, @@ -76,18 +77,25 @@ impl ClientBuilder { /// Constructs a new `ClientBuilder` pub fn new() -> ClientBuilder { match TlsConnector::builder() { - Ok(tls_connector_builder) => ClientBuilder { - config: Some(Config { - gzip: true, - hostname_verification: true, - proxies: Vec::new(), - redirect_policy: RedirectPolicy::default(), - referer: true, - timeout: None, - tls: tls_connector_builder, - dns_threads: 4, - }), - err: None, + Ok(tls_connector_builder) => { + let mut headers = Headers::with_capacity(2); + headers.set(UserAgent::new(DEFAULT_USER_AGENT)); + headers.set(Accept::star()); + + ClientBuilder { + config: Some(Config { + gzip: true, + headers: headers, + hostname_verification: true, + proxies: Vec::new(), + redirect_policy: RedirectPolicy::default(), + referer: true, + timeout: None, + tls: tls_connector_builder, + dns_threads: 4, + }), + err: None, + } }, Err(e) => ClientBuilder { config: None, @@ -131,6 +139,7 @@ impl ClientBuilder { inner: Arc::new(ClientRef { gzip: config.gzip, hyper: hyper_client, + headers: config.headers, proxies: proxies, redirect_policy: config.redirect_policy, referer: config.referer, @@ -189,6 +198,15 @@ impl ClientBuilder { self } + /// Sets the default headers for every request. + #[inline] + pub fn default_headers(&mut self, headers: Headers) -> &mut ClientBuilder { + if let Some(config) = config_mut(&mut self.config, &self.err) { + config.headers.extend(headers.iter()); + } + self + } + /// Enable auto gzip decompression by checking the ContentEncoding response header. /// /// Default is enabled. @@ -372,17 +390,13 @@ impl Client { let ( method, url, - mut headers, + user_headers, body ) = request::pieces(req); - if !headers.has::() { - headers.set(UserAgent::new(DEFAULT_USER_AGENT)); - } + let mut headers = self.inner.headers.clone(); // default headers + headers.extend(user_headers.iter()); - if !headers.has::() { - headers.set(Accept::star()); - } if self.inner.gzip && !headers.has::() && !headers.has::() { @@ -442,6 +456,7 @@ impl fmt::Debug for ClientBuilder { struct ClientRef { gzip: bool, + headers: Headers, hyper: HyperClient, proxies: Arc>, redirect_policy: RedirectPolicy, diff --git a/src/client.rs b/src/client.rs index 480c8d7..11f154d 100644 --- a/src/client.rs +++ b/src/client.rs @@ -8,7 +8,7 @@ use futures::sync::{mpsc, oneshot}; use request::{self, Request, RequestBuilder}; use response::{self, Response}; -use {async_impl, Certificate, Identity, Method, IntoUrl, Proxy, RedirectPolicy, wait}; +use {async_impl, header, Certificate, Identity, Method, IntoUrl, Proxy, RedirectPolicy, wait}; /// A `Client` to make Requests with. /// @@ -167,6 +167,50 @@ impl ClientBuilder { self } + /// Sets the default headers for every request. + /// + /// # Example + /// + /// ```rust + /// use reqwest::header; + /// # fn build_client() -> Result<(), Box> { + /// let mut headers = header::Headers::new(); + /// headers.set(header::Authorization("secret".to_string())); + /// + /// // get a client builder + /// let client = reqwest::Client::builder() + /// .default_headers(headers) + /// .build()?; + /// let res = client.get("https://www.rust-lang.org").send()?; + /// # Ok(()) + /// # } + /// ``` + /// + /// Override the default headers: + /// + /// ```rust + /// use reqwest::header; + /// # fn build_client() -> Result<(), Box> { + /// let mut headers = header::Headers::new(); + /// headers.set(header::Authorization("secret".to_string())); + /// + /// // get a client builder + /// let client = reqwest::Client::builder() + /// .default_headers(headers) + /// .build()?; + /// let res = client + /// .get("https://www.rust-lang.org") + /// .header(header::Authorization("token".to_string())) + /// .send()?; + /// # Ok(()) + /// # } + /// ``` + #[inline] + pub fn default_headers(&mut self, headers: header::Headers) -> &mut ClientBuilder { + self.inner.default_headers(headers); + self + } + /// Enable auto gzip decompression by checking the ContentEncoding response header. /// /// Default is enabled.