mirror of
https://github.com/Hopiu/lychee.git
synced 2026-04-05 14:01:00 +00:00
Add quirks to request chain
This commit is contained in:
parent
4d8a21c2dd
commit
237f690f18
2 changed files with 12 additions and 12 deletions
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue