From 237f690f18704f7fa9cf8137ec2113a40a978698 Mon Sep 17 00:00:00 2001 From: Thomas Zahner Date: Tue, 12 Mar 2024 08:49:46 +0100 Subject: [PATCH] Add quirks to request chain --- lychee-lib/src/client.rs | 5 +---- lychee-lib/src/quirks/mod.rs | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lychee-lib/src/client.rs b/lychee-lib/src/client.rs index fa469d5..66b4266 100644 --- a/lychee-lib/src/client.rs +++ b/lychee-lib/src/client.rs @@ -660,7 +660,7 @@ impl Client { Err(e) => return e.into(), }; - let mut chain: Chain = vec![]; + let mut chain: Chain = vec![Box::new(self.quirks.clone())]; if let Some(c) = credentials { chain.push(Box::new(BasicAuth::new(c.clone()))); @@ -668,9 +668,6 @@ impl Client { let request = traverse(chain, request); - // todo: quirks middleware - let request = self.quirks.apply(request); - match self.reqwest_client.execute(request).await { Ok(ref response) => Status::new(response, self.accepted.clone()), Err(e) => e.into(), diff --git a/lychee-lib/src/quirks/mod.rs b/lychee-lib/src/quirks/mod.rs index 7f30cba..76ffe8f 100644 --- a/lychee-lib/src/quirks/mod.rs +++ b/lychee-lib/src/quirks/mod.rs @@ -1,3 +1,4 @@ +use crate::chain::Chainable; use header::HeaderValue; use http::header; use once_cell::sync::Lazy; @@ -71,11 +72,11 @@ impl Default for Quirks { } } -impl Quirks { - /// Apply quirks to a given request. Only the first quirk regex pattern +impl Chainable for Quirks { + /// Handle quirks in a given request. Only the first quirk regex pattern /// matching the URL will be applied. The rest will be discarded for /// simplicity reasons. This limitation might be lifted in the future. - pub(crate) fn apply(&self, request: Request) -> Request { + fn handle(&mut self, request: Request) -> Request { for quirk in &self.quirks { if quirk.pattern.is_match(request.url().as_str()) { return (quirk.rewrite)(request); @@ -92,6 +93,8 @@ mod tests { use http::{header, Method}; use reqwest::{Request, Url}; + use crate::chain::Chainable; + use super::Quirks; #[derive(Debug)] @@ -113,7 +116,7 @@ mod tests { fn test_cratesio_request() { let url = Url::parse("https://crates.io/crates/lychee").unwrap(); let request = Request::new(Method::GET, url); - let modified = Quirks::default().apply(request); + let modified = Quirks::default().handle(request); assert_eq!( modified.headers().get(header::ACCEPT).unwrap(), @@ -125,7 +128,7 @@ mod tests { fn test_youtube_video_request() { let url = Url::parse("https://www.youtube.com/watch?v=NlKuICiT470&list=PLbWDhxwM_45mPVToqaIZNbZeIzFchsKKQ&index=7").unwrap(); let request = Request::new(Method::GET, url); - let modified = Quirks::default().apply(request); + let modified = Quirks::default().handle(request); let expected_url = Url::parse("https://img.youtube.com/vi/NlKuICiT470/0.jpg").unwrap(); assert_eq!( @@ -138,7 +141,7 @@ mod tests { fn test_youtube_video_shortlink_request() { let url = Url::parse("https://youtu.be/Rvu7N4wyFpk?t=42").unwrap(); let request = Request::new(Method::GET, url); - let modified = Quirks::default().apply(request); + let modified = Quirks::default().handle(request); let expected_url = Url::parse("https://img.youtube.com/vi/Rvu7N4wyFpk/0.jpg").unwrap(); assert_eq!( @@ -151,7 +154,7 @@ mod tests { fn test_non_video_youtube_url_untouched() { let url = Url::parse("https://www.youtube.com/channel/UCaYhcUwRBNscFNUKTjgPFiA").unwrap(); let request = Request::new(Method::GET, url.clone()); - let modified = Quirks::default().apply(request); + let modified = Quirks::default().handle(request); assert_eq!(MockRequest(modified), MockRequest::new(Method::GET, url)); } @@ -160,7 +163,7 @@ mod tests { fn test_no_quirk_applied() { let url = Url::parse("https://endler.dev").unwrap(); let request = Request::new(Method::GET, url.clone()); - let modified = Quirks::default().apply(request); + let modified = Quirks::default().handle(request); assert_eq!(MockRequest(modified), MockRequest::new(Method::GET, url)); }