about summary refs log tree commit diff
path: root/src/indieauth.rs
diff options
context:
space:
mode:
authorVika <vika@fireburn.ru>2022-02-21 21:46:25 +0300
committerVika <vika@fireburn.ru>2022-02-21 22:17:30 +0300
commita6b0c696bb28ab991b5cd71369f868c49773abd2 (patch)
tree72e8f63d735770d2203e42096fbd968e3412aa09 /src/indieauth.rs
parenteb6d5015eec34a1a65fb2d4d54b5201d4aef2728 (diff)
Make the HTTP client a generic
This adds the ability to use mocks that don't actually touch the
network and alternative transports such as using OpenSSL instead of
rustls (but rustls is still superior).
Diffstat (limited to 'src/indieauth.rs')
-rw-r--r--src/indieauth.rs12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/indieauth.rs b/src/indieauth.rs
index 8f3ef8f..bcc8bbe 100644
--- a/src/indieauth.rs
+++ b/src/indieauth.rs
@@ -90,10 +90,8 @@ impl User {
     }
 }
 
-// TODO: consider making this a generic
-type HttpClient = hyper::Client<hyper_rustls::HttpsConnector<hyper::client::HttpConnector<hyper::client::connect::dns::GaiResolver>>, hyper::Body>;
-
-pub fn require_token(token_endpoint: String, http: HttpClient) -> impl Filter<Extract = (User,), Error = Rejection> {
+pub fn require_token<T>(token_endpoint: String, http: hyper::Client<T, hyper::Body>) -> impl Filter<Extract = (User,), Error = Rejection> + Clone
+where T: hyper::client::connect::Connect + Clone + Send + Sync + 'static {
     // It might be OK to panic here, because we're still inside the initialisation sequence for now.
     // Proper error handling on the top of this should be used though.
     let token_endpoint_uri = hyper::Uri::try_from(&token_endpoint)
@@ -101,7 +99,6 @@ pub fn require_token(token_endpoint: String, http: HttpClient) -> impl Filter<Ex
     warp::any()
         .map(move || token_endpoint_uri.clone())
         .and(warp::any().map(move || http.clone()))
-        .and_then(|token_endpoint, http: HttpClient, token| async move {
         .and(warp::header::<String>("Authorization").recover(|err: Rejection| async move {
             if err.find::<MissingHeader>().is_some() {
                 Err(IndieAuthError {
@@ -113,6 +110,7 @@ pub fn require_token(token_endpoint: String, http: HttpClient) -> impl Filter<Ex
                 Err(err)
             }
         }).unify())
+        .and_then(|token_endpoint, http: hyper::Client<T, hyper::Body>, token| async move {
             let request = hyper::Request::builder()
                 .method(hyper::Method::GET)
                 .uri(token_endpoint)
@@ -197,7 +195,7 @@ pub fn require_token(token_endpoint: String, http: HttpClient) -> impl Filter<Ex
 
 #[cfg(test)]
 mod tests {
-    use super::{HttpClient, User, IndieAuthError, require_token};
+    use super::{User, IndieAuthError, require_token};
     use httpmock::prelude::*;
     
     #[test]
@@ -212,7 +210,7 @@ mod tests {
         assert!(!user.check_scope("delete"));
     }
 
-    fn get_http_client() -> HttpClient {
+    fn get_http_client() -> hyper::Client<impl hyper::client::connect::Connect + Clone + Send + Sync + 'static, hyper::Body> {
         let builder = hyper::Client::builder();
         let https = hyper_rustls::HttpsConnectorBuilder::new()
             .with_webpki_roots()