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>(())
}
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(())
}
实际应用场景
- 内部服务通信:绕过代理直接访问内网服务
- 测试环境:在开发和测试中避免代理干扰
- 性能优化:对已知直接连接更快的服务禁用代理
注意事项
- 使用无代理配置可能会绕过企业网络安全策略
- 确保只在必要时使用此功能
- 对于HTTPS请求,证书验证仍然会正常进行
通过no-proxy
库,你可以灵活控制Rust应用中的代理行为,满足各种网络连接管理的需求。