Rust网络代理禁用库no-proxy的使用:轻松实现HTTP请求的无代理配置与连接管理

no proxy

这个 crate 是一个简单的 NO_PROXY 解析器和评估器。它遵循 Gitlab 关于如何正确实现 NO_PROXY 的文章。

使用方法

以下是基本使用示例:

use no_proxy::NoProxy;

let no_proxy = NoProxy::from(".foo.bar,bar.baz,10.42.1.1/24,::1,10.124.7.8,2001::/17"); if no_proxy.matches(“bar.baz”) { println!(“matches ‘bar.baz’”); }

完整示例

下面是一个完整的 HTTP 请求无代理配置示例:

use reqwest::blocking::Client;
use no_proxy::NoProxy;

fn main() { // 创建无代理规则 let no_proxy = NoProxy::from(“localhost,127.0.0.1,::1,.internal.example.com”);

<span class="hljs-comment">// 创建 HTTP 客户端</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">client</span> = Client::<span class="hljs-title function_ invoke__">builder</span>()
    .<span class="hljs-title function_ invoke__">no_proxy</span>(<span class="hljs-keyword">Some</span>(no_proxy))
    .<span class="hljs-title function_ invoke__">build</span>()
    .<span class="hljs-title function_ invoke__">unwrap</span>();

<span class="hljs-comment">// 测试匹配的 URL (不应使用代理)</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Ok</span>(response) = client.<span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">"http://internal.example.com/api"</span>).<span class="hljs-title function_ invoke__">send</span>() {
    <span class="hljs-built_in">println!</span>(<span class="hljs-string">"Internal request succeeded (no proxy used): {}"</span>, response.<span class="hljs-title function_ invoke__">status</span>());
}

<span class="hljs-comment">// 测试不匹配的 URL (应使用代理)</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Ok</span>(response) = client.<span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">"http://external.example.com/api"</span>).<span class="hljs-title function_ invoke__">send</span>() {
    <span class="hljs-built_in">println!</span>(<span class="hljs-string">"External request succeeded (proxy used): {}"</span>, response.<span class="hljs-title function_ invoke__">status</span>());
}

}

安装

在项目目录中运行以下 Cargo 命令:

cargo add no-proxy

或者将以下内容添加到你的 Cargo.toml 文件中:

no-proxy = "0.3.6"

许可证

MIT 许可证

更完整示例

下面是一个更完整的示例,展示如何在实际项目中使用 no-proxy crate:

use no_proxy::NoProxy;
use reqwest::blocking::Client;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> { // 创建包含多种规则的无代理配置 let no_proxy_rules = " localhost, 127.0.0.1, ::1, .internal.example.com, 10.0.0.0/8, 192.168.0.0/16, fc00::/7 ";

<span class="hljs-keyword">let</span> <span class="hljs-variable">no_proxy</span> = NoProxy::<span class="hljs-title function_ invoke__">from</span>(no_proxy_rules);

<span class="hljs-comment">// 创建 HTTP 客户端并配置代理规则</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">client</span> = Client::<span class="hljs-title function_ invoke__">builder</span>()
    .<span class="hljs-title function_ invoke__">no_proxy</span>(<span class="hljs-keyword">Some</span>(no_proxy))
    .<span class="hljs-title function_ invoke__">build</span>()?;

<span class="hljs-comment">// 测试多个 URL 的代理行为</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">test_urls</span> = <span class="hljs-built_in">vec!</span>[
    <span class="hljs-string">"http://localhost:8080/api"</span>,
    <span class="hljs-string">"http://internal.example.com/resource"</span>,
    <span class="hljs-string">"http://10.0.0.1:3000/data"</span>,
    <span class="hljs-string">"http://external.site.com/info"</span>,
];

<span class="hljs-keyword">for</span> <span class="hljs-variable">url</span> <span class="hljs-keyword">in</span> test_urls {
    <span class="hljs-keyword">let</span> <span class="hljs-variable">response</span> = client.<span class="hljs-title function_ invoke__">get</span>(url).<span class="hljs-title function_ invoke__">send</span>()?;
    <span class="hljs-built_in">println!</span>(<span class="hljs-string">"URL: {}, Status: {}"</span>, url, response.<span class="hljs-title function_ invoke__">status</span>());
}

<span class="hljs-title function_ invoke__">Ok</span>(())

}


1 回复

Rust网络代理禁用库no-proxy的使用指南

简介

no-proxy是一个Rust库,用于在HTTP请求中禁用代理配置,实现直接连接目标服务器的功能。这个库特别适合需要在特定情况下绕过系统代理设置的场景。

主要特性

  • 简单易用的API
  • 支持reqwest等流行HTTP客户端
  • 可配置的无代理规则
  • 线程安全的实现

安装

Cargo.toml中添加依赖:

[dependencies]
no-proxy = "0.1"
reqwest = { version = "0.11", features = ["blocking"] }

基本使用方法

禁用所有代理

use no_proxy::NoProxy;
use reqwest::blocking::Client;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::builder()
        .no_proxy(NoProxy::all())
        .build()?;
    
    let response = client.get("https://example.com").send()?;
    println!("Status: {}", response.status());
    
    Ok(())
}

为特定域名禁用代理

use no_proxy::NoProxy;

let no_proxy = NoProxy::from_string("example.com,localhost,127.0.0.1").unwrap();
let client = Client::builder()
    .no_proxy(no_proxy)
    .build()?;

高级用法

与异步客户端一起使用

use no_proxy::NoProxy;
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::builder()
        .no_proxy(NoProxy::all())
        .build()?;
    
    let response = client.get("https://example.com").send().await?;
    println!("Status: {}", response.status());
    
    Ok(())
}

自定义无代理规则

use no_proxy::{NoProxy, NoProxyRules};

let mut rules = NoProxyRules::new();
rules.add_domain("example.com");
rules.add_ip("192.168.1.1");
rules.add_suffix(".internal");

let no_proxy = NoProxy::new(rules);
let client = Client::builder()
    .no_proxy(no_proxy)
    .build()?;

完整示例代码

下面是一个结合了上述所有功能的完整示例:

use no_proxy::{NoProxy, NoProxyRules};
use reqwest::{blocking::Client, Client as AsyncClient};
use std::error::Error;

// 同步客户端示例
fn sync_example() -> Result<(), Box<dyn Error>> {
    // 禁用所有代理
    let client = Client::builder()
        .no_proxy(NoProxy::all())
        .build()?;
    
    let response = client.get("https://example.com").send()?;
    println!("同步请求状态: {}", response.status());
    
    Ok(())
}

// 异步客户端示例
async fn async_example() -> Result<(), Box<dyn Error>> {
    // 自定义无代理规则
    let mut rules = NoProxyRules::new();
    rules.add_domain("example.com");  // 禁用example.com的代理
    rules.add_ip("192.168.1.1");      // 禁用特定IP的代理
    rules.add_suffix(".internal");    // 禁用所有.internal结尾的域名代理
    
    let client = AsyncClient::builder()
        .no_proxy(NoProxy::new(rules))
        .build()?;
    
    let response = client.get("https://example.com").send().await?;
    println!("异步请求状态: {}", response.status());
    
    Ok(())
}

// 主函数
fn main() -> Result<(), Box<dyn Error>> {
    // 运行同步示例
    sync_example()?;
    
    // 运行异步示例
    tokio::runtime::Runtime::new()?.block_on(async_example())?;
    
    Ok(())
}

实际应用场景

  1. 内部服务通信:绕过代理直接访问内网服务
  2. 测试环境:在开发和测试中避免代理干扰
  3. 性能优化:对已知直接连接更快的服务禁用代理

注意事项

  • 使用无代理配置可能会绕过企业网络安全策略
  • 确保只在必要时使用此功能
  • 对于HTTPS请求,证书验证仍然会正常进行

通过no-proxy库,你可以灵活控制Rust应用中的代理行为,满足各种网络连接管理的需求。

回到顶部