url_track_cleaner/
lib.rs

1mod cleaner;
2mod rules;
3mod policy;
4
5pub use policy::RedirectPolicy;
6pub use cleaner::{UrlTrackCleaner, UrlTrackCleanerBuilder};
7pub use rules::ReserveRule;
8
9#[cfg(test)]
10pub mod tests {
11    use super::*;
12    use anyhow::Result;
13
14    #[tokio::test]
15    pub async fn test_clean_b23() -> Result<()> {
16        let cleaner = UrlTrackCleaner::builder()
17            .follow_redirect(RedirectPolicy::All)
18            .build();
19        let cleaned = cleaner.do_clean("https://b23.tv/iFW9atP").await?;
20        println!("cleaned url: {} {}", cleaned, cleaned.as_str());
21        Ok(())
22    }
23
24    #[tokio::test]
25    pub async fn test_clean_localhost() -> Result<()> {
26        let cleaner = UrlTrackCleaner::builder()
27            .follow_redirect(RedirectPolicy::All)
28            .build();
29        let cleaned = cleaner.do_clean("http://localhost/?test=1").await?;
30        println!("cleaned url: {} {}", cleaned, cleaned.as_str());
31        Ok(())
32    }
33
34    #[tokio::test]
35    pub async fn test_clean_bilibili_with_reserving_timestamp() {
36        let reserve_rules: Vec<ReserveRule> = vec![ReserveRule::new_with_regex(
37            r#"^http(s)?://www.bilibili.com/.*"#,
38            vec!["t".to_string()],
39        )
40        .expect("failed to create reserve rule")];
41        let cleaner = UrlTrackCleaner::builder()
42            .reserve_rules(reserve_rules)
43            .build();
44        let cleaned = cleaner
45            .do_clean("https://www.bilibili.com/video/BV11111?t=360&track_id=2")
46            .await
47            .expect("failed to clean url");
48        println!("cleaned url: {}", cleaned);
49        assert_eq!(cleaned.query_pairs().count(), 1);
50        assert_eq!(cleaned.query_pairs().next().unwrap().0, "t");
51        assert_eq!(
52            format!("{}{}", cleaned.domain().unwrap(), cleaned.path()),
53            "www.bilibili.com/video/BV11111"
54        );
55    }
56}