dotnet-httpie 对代理的支持
Intro
dotnet-httpie 是一个测试 API 请求的命令行小工具,可以参考介绍:动手造轮子 —— dotnet-HTTPie
前段时间针对 dotnet-httpie 增加了代理的支持,在发送请求的时候可以指定代理了,加这个的主要是因为公司的内网资源要走代理才能访问到,而只是在浏览器上装了一个插件,只有经过浏览器的请求才会走代理,使用 dotnet-httpie 测试 API 的时候不会走代理,就会返回一个 403,于是添加了对代理的支持,发送请求时指定代理就可以正常请求 API 了
Features
在之前的版本中,是不会走代理的,在增加代理支持的新版本中会尊重 HttpClient
默认行为,会检测系统代理,自动走系统代理(大多数软件都是尊重系统代理的,比如 Postman,也是会默认使用系统代理的,所以做了这个变动)
如果指定了 --no-proxy
就会禁用代理
默认请求我们的内网 API 会返回 403
指定代理访问 --proxy
另一个使用示例:dotnet-http google.com --proxy=http://127.0.0.1:10809
Implement
实现的代码非常简单,完整的变更可以参考 PR https://github.com/WeihanLi/dotnet-httpie/pull/43/files
核心代码是增加了一个 ProxyMiddleware
public sealed class ProxyMiddleware : IHttpHandlerMiddleware
{
private readonly HttpRequestModel _requestModel;
private static readonly Option<string> ProxyOption = new("--proxy", "Send request with proxy");
private static readonly Option NoProxyOption = new("--no-proxy", "Disable proxy");
public ProxyMiddleware(HttpRequestModel requestModel)
{
_requestModel = requestModel;
}
public ICollection<Option> SupportedOptions()
{
return new[] { ProxyOption, NoProxyOption };
}
public Task Invoke(HttpClientHandler httpClientHandler, Func<Task> next)
{
if (_requestModel.ParseResult.HasOption(NoProxyOption))
{
httpClientHandler.Proxy = null;
httpClientHandler.UseProxy = false;
}
else
{
var proxyValue = _requestModel.ParseResult.GetValueForOption(ProxyOption);
if (Uri.TryCreate(proxyValue, UriKind.Absolute, out var proxyUri))
{
httpClientHandler.Proxy = new WebProxy(proxyUri);
httpClientHandler.UseProxy = true;
}
}
return next();
}
}
是不是很简单~
More
得益于 .NET 6 对于 socks 代理的支持,dotnet-httpie 也支持 socks 代理,可以看到前面的我们内网的 API 的代理也是 socks 代理,因为 dotnet-httpie 是基于 .NET 6 的 dotnet-tool,所以也是支持的
原来只是觉得这个 socks 代理的功能爬虫会用到的比较多,没想到在这里也用上了,哈哈
References
https://github.com/WeihanLi/dotnet-httpie/pull/43/files https://www.nuget.org/packages/dotnet-HTTPie/ 动手造轮子 —— dotnet-HTTPie
点击下方卡片关注DotNet NB
一起交流学习
▲ 点击上方卡片关注DotNet NB,一起交流学习
请在公众号后台