proxy_and_proxy_auth/
main.rs1use 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}