Content is user-generated and unverified.

Proxy Environment Variable Support by Runtime/Language

Environment Variables Overview

VariablePurposeFormat Examples
HTTP_PROXYHTTP traffic proxyhttp://proxy:8080
HTTPS_PROXYHTTPS traffic proxyhttp://proxy:8080
ALL_PROXYAll traffic proxyhttp://proxy:8080, socks5://proxy:1080
SOCKS_PROXYSOCKS-specific proxysocks5://proxy:1080
NO_PROXYBypass proxy for hostslocalhost,127.0.0.1,.local

JavaScript Runtimes

Runtime/LibraryHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
Node.js (http/https)❌ No❌ No❌ No❌ No❌ NoBuilt-in modules ignore all env vars
Node.js + axios✅ Yes✅ Yes❌ No❌ No❌ NoHTTP proxies only, needs agent for SOCKS
Node.js + node-fetch v2✅ Yes✅ Yes❌ No❌ No❌ NoAuto HTTP proxy support
Node.js + node-fetch v3❌ No❌ No❌ No❌ No❌ NoRequires manual agent configuration
Node.js + got✅ Yes✅ Yes❌ No❌ No❌ NoHTTP proxies, manual SOCKS config
Node.js + undici❌ No❌ No❌ No❌ No❌ NoManual configuration required
Bun (fetch)✅ Yes✅ Yes❌ No❌ No❌ NoHTTP proxies only via env vars
Deno (fetch)✅ Yes✅ Yes❌ No❌ No❌ NoSimilar to Node.js behavior

Go Language

Library/PackageHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
net/http (standard)✅ Yes✅ Yes✅ Yes❌ No✅ Yes*Excellent built-in support
resty✅ Yes✅ Yes✅ Yes❌ No✅ YesUses net/http underneath
fasthttp❌ No❌ No❌ No❌ No❌ NoManual proxy configuration
colly✅ Yes✅ Yes✅ Yes❌ No✅ YesWeb scraping framework

*SOCKS5 via golang.org/x/net/proxy package

Rust Language

CrateHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
reqwest✅ Yes✅ Yes✅ Yes❌ No✅ YesMost popular HTTP client
ureq✅ Yes✅ Yes❌ No❌ No❌ NoLightweight, limited SOCKS
surf✅ Yes✅ Yes❌ No❌ No❌ NoAsync HTTP client
isahc✅ Yes✅ Yes✅ Yes❌ No✅ YesUses libcurl
curl (rust-curl)✅ Yes✅ Yes✅ Yes✅ Yes✅ YesFull libcurl bindings

OCaml Language

LibraryHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
cohttp❌ No❌ No❌ No❌ No❌ NoManual proxy configuration
cohttp-lwt❌ No❌ No❌ No❌ No❌ NoAsync version, manual config
curl (ocurl)✅ Yes✅ Yes✅ Yes✅ Yes✅ Yeslibcurl OCaml bindings
piaf❌ No❌ No❌ No❌ No❌ NoModern HTTP/2 client, manual config

Python (for comparison)

LibraryHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
requests✅ Yes✅ Yes❌ No❌ No❌ NoMost popular, needs PySocks for SOCKS
urllib✅ Yes✅ Yes❌ No❌ No❌ NoStandard library
aiohttp✅ Yes✅ Yes❌ No❌ No❌ NoAsync HTTP client
httpx✅ Yes✅ Yes✅ Yes❌ No✅ Yes*Modern async/sync client

*With httpx[socks] extra

Command Line Tools

ToolHTTP_PROXYHTTPS_PROXYALL_PROXYSOCKS4SOCKS5Notes
curl✅ Yes✅ Yes✅ Yes✅ Yes✅ YesUniversal proxy support
wget✅ Yes✅ Yes❌ No❌ No❌ NoHTTP proxies only
git✅ Yes✅ Yes✅ Yes❌ No✅ YesFor HTTP(S) operations

CLI Proxy Wrapper Programs

Universal Proxy Wrappers

ToolHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
proxychains/proxychains4✅ Yes✅ Yes✅ Yes✅ Yes❌ Config fileproxychains4 <command>
proxychains-ng✅ Yes✅ Yes✅ Yes✅ Yes❌ Config fileproxychains4 <command>
tsocks❌ No❌ No✅ Yes✅ Yes❌ Config filetsocks <command>
torify✅ Yes✅ Yes❌ No✅ Yes❌ Tor onlytorify <command>
redsocks✅ Yes✅ Yes✅ Yes✅ Yes❌ Config fileTransparent proxy
torsocks✅ Yes✅ Yes❌ No✅ Yes❌ Tor onlytorsocks <command>

HTTP Proxy Wrappers

ToolHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
corkscrew✅ Yes✅ Yes❌ No❌ No❌ Nocorkscrew proxy port host port
connect✅ Yes✅ Yes❌ No❌ No❌ Noconnect -H proxy:port host:port
nc + proxy✅ Yes✅ Yes❌ No❌ No❌ Nonc -X connect -x proxy:port

SOCKS Proxy Wrappers

ToolHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
dante-client❌ No❌ No✅ Yes✅ Yes❌ Config filesocksify <command>
ss-local❌ No❌ No❌ No✅ Yes❌ Command argsss-local -s server -p port
microsocks❌ No❌ No❌ No✅ Yes❌ Command argsSOCKS5 server only
3proxy✅ Yes✅ Yes✅ Yes✅ Yes❌ Config fileMulti-protocol proxy

Environment Variable Aware Wrappers

ToolHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
env-proxy✅ Yes✅ Yes❌ No❌ No✅ Yesenv-proxy <command>
with-proxy✅ Yes✅ Yes✅ Yes✅ Yes✅ Yeswith-proxy <command>
proxy-wrapper✅ Yes✅ Yes❌ No❌ No✅ Yesproxy-wrapper <command>

Modern Universal Wrappers

ToolHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
gost✅ Yes✅ Yes✅ Yes✅ Yes❌ Command argsgost -L :8080 -F socks5://proxy:1080
v2ray✅ Yes✅ Yes✅ Yes✅ Yes❌ Config filev2ray -config config.json
xray✅ Yes✅ Yes✅ Yes✅ Yes❌ Config filexray -config config.json
brook✅ Yes✅ Yes❌ No✅ Yes❌ Command argsbrook client -s server -p password

Platform-Specific Wrappers

ToolPlatformHTTPHTTPSSOCKS4SOCKS5Environment VariablesUsage
proxifierWindows✅ Yes✅ Yes✅ Yes✅ Yes❌ GUI configGUI application
proxycapWindows✅ Yes✅ Yes✅ Yes✅ Yes❌ GUI configGUI application
freecapWindows✅ Yes✅ Yes✅ Yes✅ Yes❌ GUI configGUI application
sockscap64Windows❌ No❌ No✅ Yes✅ Yes❌ GUI configGUI application

Installation Commands

Universal Tools

bash
# proxychains4
sudo apt install proxychains4        # Ubuntu/Debian
brew install proxychains-ng          # macOS
sudo dnf install proxychains-ng      # Fedora

# tsocks
sudo apt install tsocks              # Ubuntu/Debian
brew install tsocks                  # macOS

# torify/torsocks
sudo apt install tor torsocks        # Ubuntu/Debian
brew install tor torsocks            # macOS

Modern Tools

bash
# gost
go install github.com/ginuerzh/gost/cmd/gost@latest

# v2ray
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

# brook
go install github.com/txthinking/brook/cmd/brook@latest

Usage Examples

proxychains4

bash
# Configure
sudo nano /etc/proxychains4.conf
# Add: socks5 127.0.0.1 1080

# Use
proxychains4 curl http://httpbin.org/ip
proxychains4 bun test.js
proxychains4 go run main.go

tsocks

bash
# Configure
sudo nano /etc/tsocks.conf
# Add: server = 127.0.0.1, server_port = 1080

# Use
tsocks curl http://httpbin.org/ip
tsocks node script.js

gost (modern universal)

bash
# SOCKS5 proxy
gost -L :8080 -F socks5://127.0.0.1:1080

# HTTP proxy  
gost -L :8080 -F http://proxy:8080

# Chain proxies
gost -L :8080 -F socks5://proxy1:1080 -F http://proxy2:8080

with-proxy (if available)

bash
export HTTP_PROXY=http://proxy:8080
export SOCKS_PROXY=socks5://127.0.0.1:1080
with-proxy curl http://httpbin.org/ip
with-proxy bun script.js

Summary by Use Case

🎯 Best for Any Protocol (SOCKS/HTTP)

  • proxychains4 - Most universal, works with any TCP application
  • gost - Modern, supports all protocols, flexible routing

🌐 Best for HTTP/HTTPS Only

  • env-proxy (if available) - Respects environment variables
  • corkscrew - Simple HTTP CONNECT proxy

🔒 Best for SOCKS Only

  • tsocks - Lightweight, SOCKS-specific
  • dante-client - Full-featured SOCKS client

🚀 Best Modern Solutions

  • v2ray/xray - Advanced features, multiple protocols
  • gost - Simple CLI, powerful routing
  • brook - Lightweight, modern protocols

💻 Best for Windows

  • proxifier - Professional GUI tool
  • proxycap - Application-specific proxying
  • freecap - Free alternative

System-Level Proxy Tools (for comparison)

ToolProtocols SupportedEnvironment Variable SupportLevelNotes
proxychainsAll TCP❌ Ignores env varsSystemForces all TCP through SOCKS
tsocksAll TCP❌ Ignores env varsSystemTransparent SOCKS proxy
torifyAll TCP❌ Ignores env varsSystemRoutes through Tor SOCKS
ProxyChains-NGAll TCP/UDP❌ Ignores env varsSystemModern proxychains

Program-Level Proxy Implementation Examples

JavaScript: Universal Proxy Solution

javascript
// Option 1: global-agent (affects ALL modules)
const globalAgent = require('global-agent');
globalAgent.bootstrap();
process.env.GLOBAL_AGENT_HTTP_PROXY = 'http://proxy:8080';
process.env.GLOBAL_AGENT_HTTPS_PROXY = 'socks5://proxy:1080';

// Now ALL HTTP requests go through proxy automatically
const axios = require('axios');
const response = await axios.get('http://httpbin.org/ip'); // Uses proxy

// Option 2: proxy-agent (auto-detects proxy type)
const { ProxyAgent } = require('proxy-agent');
const agent = new ProxyAgent('socks5://proxy:1080');
const response = await fetch('http://httpbin.org/ip', { agent });

// Option 3: Create universal proxy wrapper
class UniversalProxy {
    constructor() {
        this.agents = new Map();
    }
    
    getAgent(url) {
        const proxyUrl = process.env.ALL_PROXY || process.env.HTTP_PROXY;
        if (!proxyUrl) return undefined;
        
        if (!this.agents.has(proxyUrl)) {
            if (proxyUrl.startsWith('socks')) {
                this.agents.set(proxyUrl, new (require('socks-proxy-agent').SocksProxyAgent)(proxyUrl));
            } else {
                this.agents.set(proxyUrl, new (require('https-proxy-agent').HttpsProxyAgent)(proxyUrl));
            }
        }
        return this.agents.get(proxyUrl);
    }
    
    async fetch(url, options = {}) {
        options.agent = this.getAgent(url);
        return fetch(url, options);
    }
}

Go: Built-in Proxy Support

go
// Option 1: Use built-in environment variable support
client := &http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyFromEnvironment, // Supports HTTP_PROXY, HTTPS_PROXY, ALL_PROXY
    },
}

// Option 2: Manual SOCKS5 setup
import "golang.org/x/net/proxy"
dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct)
transport := &http.Transport{
    DialContext: dialer.DialContext,
}
client := &http.Client{Transport: transport}

// Option 3: Universal proxy function
func CreateProxyClient() *http.Client {
    proxyURL := os.Getenv("ALL_PROXY")
    if proxyURL == "" {
        proxyURL = os.Getenv("HTTP_PROXY")
    }
    
    if proxyURL != "" {
        if strings.HasPrefix(proxyURL, "socks5://") {
            // SOCKS5 proxy
            dialer, _ := proxy.SOCKS5("tcp", strings.TrimPrefix(proxyURL, "socks5://"), nil, proxy.Direct)
            return &http.Client{
                Transport: &http.Transport{DialContext: dialer.DialContext},
            }
        } else {
            // HTTP proxy
            return &http.Client{
                Transport: &http.Transport{Proxy: http.ProxyURL(mustParseURL(proxyURL))},
            }
        }
    }
    return &http.Client{}
}

Rust: reqwest + SOCKS Support

rust
// Option 1: Environment variable support (built-in)
let client = reqwest::Client::builder()
    .proxy(reqwest::Proxy::all(std::env::var("ALL_PROXY")?)?)
    .build()?;

// Option 2: Manual SOCKS5 configuration
use tokio_socks::tcp::Socks5Stream;
let proxy_stream = Socks5Stream::connect("127.0.0.1:1080", "httpbin.org:80").await?;

// Option 3: Universal proxy client
use std::env;
use reqwest::{Client, Proxy};

fn create_proxy_client() -> Result<Client, Box<dyn std::error::Error>> {
    let mut builder = Client::builder();
    
    if let Ok(proxy_url) = env::var("ALL_PROXY") {
        builder = builder.proxy(Proxy::all(&proxy_url)?);
    } else if let Ok(http_proxy) = env::var("HTTP_PROXY") {
        builder = builder.proxy(Proxy::http(&http_proxy)?);
    }
    
    Ok(builder.build()?)
}

OCaml: Manual Proxy Configuration

ocaml
(* SOCKS5 client implementation *)
module ProxyClient = struct
    type proxy_config = 
        | HTTP of Uri.t
        | SOCKS5 of string * int * (string * string) option
        | Direct
    
    let get_proxy_from_env () =
        match Sys.getenv_opt "ALL_PROXY" with
        | Some url when String.prefix ~pre:"socks5://" url -> 
            (* Parse SOCKS5 URL *)
            SOCKS5 ("127.0.0.1", 1080, None)
        | Some url -> HTTP (Uri.of_string url)
        | None -> 
            match Sys.getenv_opt "HTTP_PROXY" with
            | Some url -> HTTP (Uri.of_string url)
            | None -> Direct
    
    let make_request ~proxy_config ~uri =
        match proxy_config with
        | Direct -> Cohttp_lwt_unix.Client.get uri
        | HTTP proxy_uri -> 
            let resolver = Resolver.create ~proxy:proxy_uri () in
            Cohttp_lwt_unix.Client.get ~resolver uri
        | SOCKS5 (host, port, auth) ->
            (* Use lwt-socks or similar *)
            Socks_client.connect ~proxy:(`TCP (`IP (Ipaddr.of_string host), port)) 
                               ~target:(`Domain (Uri.host_with_default uri, 80)) ()
end

Language-Specific Recommendations

🥇 Best Program-Level Proxy Support

  1. Go: Excellent built-in environment variable support + manual SOCKS
  2. Rust (reqwest): Good environment support + extensive manual options
  3. JavaScript (with libraries): Universal solutions available

🥈 Good with Libraries

  1. Python: requests[socks], httpx[socks] provide full support
  2. JavaScript: Multiple proxy agent libraries available
  3. C#/.NET: HttpClient with proxy support

🥉 Manual Configuration Required

  1. OCaml: Most libraries need manual proxy setup
  2. Java: HttpURLConnection supports basic proxy
  3. C/C++: libcurl provides comprehensive proxy support

Universal Proxy Libraries by Language

LanguageLibraryAuto-detects Proxy TypeEnvironment VariablesSOCKS Support
JavaScriptproxy-agent✅ Yes✅ Yes✅ Yes
JavaScriptglobal-agent✅ Yes✅ Yes✅ Yes
Gonet/http + ProxyFromEnvironment✅ Yes✅ Yes✅ Yes*
Rustreqwest✅ Yes✅ Yes✅ Yes
Pythonhttpx[socks]✅ Yes✅ Yes✅ Yes
Pythonrequests[socks]❌ No✅ Yes✅ Yes

*With golang.org/x/net/proxy package

Summary by Protocol Support

Best Environment Variable Support

  1. Go - Excellent across all proxy types
  2. Rust (reqwest) - Very good, especially with proper crates
  3. curl-based tools - Universal support
  4. Bun - Good for HTTP proxies

Manual Configuration Required

  1. OCaml - Most libraries require manual setup
  2. Node.js built-ins - No automatic proxy support
  3. Specialized libraries - Often need explicit configuration

SOCKS Proxy Support

  • Best: Go, Rust (reqwest), curl-based tools
  • Good: Node.js/Bun with socks-proxy-agent
  • Limited: Most HTTP-only libraries
  • Universal: System-level tools (proxychains, tsocks)
Content is user-generated and unverified.
    Proxy Environment Variable Support Summary | Claude