proxyfor 0.5.0

A powerful and flexible proxy CLI for capturing and inspecting HTTP(S) and WS(S) traffic
Documentation
mod common;

use crate::common::{
    build_ca, build_client, build_proxy_client, mask_text, run_proxy_server, start_http_server,
    HELLO_WORLD,
};

use anyhow::Result;
use proxyfor::{
    filter::parse_title_filters,
    server::{PrintMode, ServerBuilder, WEB_PREFIX},
};

#[tokio::test]
async fn test_title_filter() -> Result<()> {
    let (server_addr, stop_server) = start_http_server().await?;

    let ca = build_ca()?;

    let server = ServerBuilder::new(ca)
        .print_mode(PrintMode::Nothing)
        .web(true)
        .title_filters(parse_title_filters(&["hello".into()])?)
        .reverse_proxy_url(Some(format!("http://localhost:{}", server_addr.port())))
        .build();

    let (proxy_addr, stop_proxy) = run_proxy_server(server).await?;

    let proxy_client = build_proxy_client(&proxy_addr.to_string())?;

    let res = proxy_client
        .get(format!("http://localhost:{}/hello", server_addr.port()))
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let res = proxy_client
        .post(format!("http://localhost:{}/echo", server_addr.port()))
        .header("content-type", "text/plain")
        .body(HELLO_WORLD)
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let client = build_client()?;
    let res = client
        .get(format!(
            "http://localhost:{}{}/traffics",
            proxy_addr.port(),
            WEB_PREFIX
        ))
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let output = res.text().await?;
    let output = mask_text(&output);
    insta::assert_snapshot!(output);

    let _ = stop_server.send(());
    let _ = stop_proxy.send(());
    Ok(())
}

#[tokio::test]
async fn test_mime_filter() -> Result<()> {
    let (server_addr, stop_server) = start_http_server().await?;

    let ca = build_ca()?;

    let server = ServerBuilder::new(ca)
        .print_mode(PrintMode::Nothing)
        .mime_filters(vec!["application/json".into()])
        .reverse_proxy_url(Some(format!("http://localhost:{}", server_addr.port())))
        .web(true)
        .build();

    let (proxy_addr, stop_proxy) = run_proxy_server(server).await?;

    let proxy_client = build_proxy_client(&proxy_addr.to_string())?;

    let res = proxy_client
        .get(format!("http://localhost:{}/hello", server_addr.port()))
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let res = proxy_client
        .post(format!("http://localhost:{}/echo", server_addr.port()))
        .header("content-type", "application/json")
        .body("{}")
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let client = build_client()?;
    let res = client
        .get(format!(
            "http://localhost:{}{}/traffics",
            proxy_addr.port(),
            WEB_PREFIX
        ))
        .send()
        .await?;

    assert_eq!(res.status(), 200);

    let output = res.text().await?;
    let output = mask_text(&output);
    insta::assert_snapshot!(output);

    let _ = stop_server.send(());
    let _ = stop_proxy.send(());
    Ok(())
}