Skip to main content

proxy_and_proxy_auth/
main.rs

1use std::env;
2use std::error::Error;
3
4use nano_get::{Client, ProxyConfig, Request};
5
6fn env_or_default(name: &str, fallback: &str) -> String {
7    env::var(name).unwrap_or_else(|_| fallback.to_string())
8}
9
10fn print_setup() {
11    println!("The proxy-and-proxy-auth example needs a reachable proxy.");
12    println!("Set NANO_GET_PROXY_URL to an HTTP proxy URL, for example http://127.0.0.1:8080.");
13    println!("Optional overrides:");
14    println!("  NANO_GET_PROXY_TARGET_URL");
15    println!("  NANO_GET_PROXY_AUTH_USER");
16    println!("  NANO_GET_PROXY_AUTH_PASS");
17}
18
19fn main() -> Result<(), Box<dyn Error>> {
20    let Some(proxy_url) = env::var("NANO_GET_PROXY_URL").ok() else {
21        print_setup();
22        return Ok(());
23    };
24
25    let target_url = env_or_default("NANO_GET_PROXY_TARGET_URL", "http://example.com");
26    let proxy_user = env_or_default("NANO_GET_PROXY_AUTH_USER", "proxy-user");
27    let proxy_pass = env_or_default("NANO_GET_PROXY_AUTH_PASS", "proxy-pass");
28
29    let mut proxy = ProxyConfig::new(proxy_url)?;
30    proxy.add_header("X-Example-Proxy", "nano-get-demo")?;
31
32    let challenge_driven = Client::builder()
33        .proxy(proxy.clone())
34        .basic_proxy_auth(proxy_user.clone(), proxy_pass.clone())
35        .build()
36        .execute(Request::get(&target_url)?)?;
37
38    let preemptive = Client::builder()
39        .proxy(proxy.clone())
40        .preemptive_basic_proxy_auth(proxy_user.clone(), proxy_pass.clone())
41        .build()
42        .execute(Request::get(&target_url)?)?;
43
44    let mut manual = Request::get(&target_url)?;
45    manual.proxy_basic_auth(proxy_user, proxy_pass)?;
46    let manual_response = Client::builder().proxy(proxy).build().execute(manual)?;
47
48    println!("proxy-and-proxy-auth example");
49    println!("challenge-driven status: {}", challenge_driven.status_code);
50    println!("preemptive status: {}", preemptive.status_code);
51    println!(
52        "request-level override status: {}",
53        manual_response.status_code
54    );
55
56    Ok(())
57}