Add quirks to request chain

This commit is contained in:
Thomas Zahner 2024-03-12 08:49:46 +01:00
parent 4d8a21c2dd
commit 237f690f18
2 changed files with 12 additions and 12 deletions

View file

@ -660,7 +660,7 @@ impl Client {
Err(e) => return e.into(),
};
let mut chain: Chain<reqwest::Request> = vec![];
let mut chain: Chain<reqwest::Request> = 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(),

View file

@ -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<Request> 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));
}