reqwest_oauth1/
client.rs

1// ----------------------------------------------------------------------------
2// This source code contains derived artifacts from seanmonstar's `reqwest`.
3// for further information(including license information),
4// please visit their repository: https://github.com/seanmonstar/reqwest .
5// ----------------------------------------------------------------------------
6
7pub use oauth1_request::signature_method::HmacSha1 as DefaultSM;
8use oauth1_request::signature_method::SignatureMethod;
9use reqwest::{IntoUrl, Method};
10
11#[cfg(feature = "blocking")]
12use reqwest::blocking::Client as ReqwestClient;
13
14#[cfg(not(feature = "blocking"))]
15use reqwest::Client as ReqwestClient;
16
17use crate::{OAuthParameters, RequestBuilder, SecretsProvider, Signer};
18
19/// Bridge trait from reqwest's `Client` from our `Client`.
20pub trait OAuthClientProvider {
21    fn oauth1<'a, T>(self, secrets: T) -> Client<Signer<'a, T, DefaultSM>>
22    where
23        Self: Sized,
24        T: SecretsProvider + Clone,
25    {
26        self.oauth1_with_params(secrets, OAuthParameters::new())
27    }
28
29    fn oauth1_with_params<'a, TSecrets, TSM>(
30        self,
31        secrets: TSecrets,
32        params: OAuthParameters<'a, TSM>,
33    ) -> Client<Signer<'a, TSecrets, TSM>>
34    where
35        Self: Sized,
36        TSecrets: SecretsProvider + Clone,
37        TSM: SignatureMethod + Clone;
38}
39
40/// Compatible interface with reqwest's [`Client`](https://docs.rs/reqwest/0.10.8/reqwest/struct.Client.html).
41#[derive(Debug)]
42pub struct Client<TSigner> {
43    inner: ReqwestClient,
44    signer: TSigner,
45}
46
47impl OAuthClientProvider for ReqwestClient {
48    fn oauth1_with_params<'a, TSecrets, TSM>(
49        self,
50        secrets: TSecrets,
51        parameters: OAuthParameters<'a, TSM>,
52    ) -> Client<Signer<'a, TSecrets, TSM>>
53    where
54        Self: Sized,
55        TSecrets: SecretsProvider + Clone,
56        TSM: SignatureMethod + Clone,
57    {
58        Client {
59            inner: self,
60            signer: Signer::new(secrets, parameters),
61        }
62    }
63}
64
65impl From<ReqwestClient> for Client<()> {
66    fn from(client: ReqwestClient) -> Self {
67        Client::new_with_client(client)
68    }
69}
70
71impl Client<()> {
72    /// Constructs a new `Client`.
73    ///
74    /// This method calls reqwest::Client::new() internally.
75    pub fn new() -> Self {
76        Client {
77            inner: ReqwestClient::new(),
78            signer: (),
79        }
80    }
81
82    /// Constructs a new `Client` with specifying inner `reqwest::Client`.
83    pub fn new_with_client(client: ReqwestClient) -> Self {
84        Client {
85            inner: client,
86            signer: (),
87        }
88    }
89}
90
91impl<T> Client<T>
92where
93    T: Clone,
94{
95    /// Convenience method to make a `GET` request to a URL.
96    ///
97    /// # Errors
98    ///
99    /// This method fails whenever supplied `Url` cannot be parsed.
100    pub fn get<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
101        self.request(Method::GET, url)
102    }
103
104    /// Convenience method to make a `POST` request to a URL.
105    ///
106    /// # Errors
107    ///
108    /// This method fails whenever supplied `Url` cannot be parsed.
109    pub fn post<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
110        self.request(Method::POST, url)
111    }
112
113    /// Convenience method to make a `PUT` request to a URL.
114    ///
115    /// # Errors
116    ///
117    /// This method fails whenever supplied `Url` cannot be parsed.
118    pub fn put<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
119        self.request(Method::PUT, url)
120    }
121
122    /// Convenience method to make a `PATCH` request to a URL.
123    ///
124    /// # Errors
125    ///
126    /// This method fails whenever supplied `Url` cannot be parsed.
127    pub fn patch<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
128        self.request(Method::PATCH, url)
129    }
130
131    /// Convenience method to make a `DELETE` request to a URL.
132    ///
133    /// # Errors
134    ///
135    /// This method fails whenever supplied `Url` cannot be parsed.
136    pub fn delete<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
137        self.request(Method::DELETE, url)
138    }
139
140    /// Convenience method to make a `HEAD` request to a URL.
141    ///
142    /// # Errors
143    ///
144    /// This method fails whenever supplied `Url` cannot be parsed.
145    pub fn head<U: IntoUrl + Clone>(&self, url: U) -> RequestBuilder<T> {
146        self.request(Method::HEAD, url)
147    }
148
149    /// Start building a `Request` with the `Method` and `Url`.
150    ///
151    /// Returns a `RequestBuilder<T>`, which will allow setting headers and
152    /// request body before sending.
153    ///
154    /// # Errors
155    ///
156    /// This method fails whenever supplied `Url` cannot be parsed.
157    pub fn request<U: IntoUrl + Clone>(&self, method: Method, url: U) -> RequestBuilder<T> {
158        RequestBuilder::new(&self.inner, method, url, self.signer.clone())
159    }
160}