dotnet-httpie 代理支持

dotnet-httpie 对代理的支持

Intro

dotnet-httpie 是一个测试 API 请求的命令行小工具,可以参考介绍:动手造轮子 —— dotnet-HTTPie

前段时间针对 dotnet-httpie 增加了代理的支持,在发送请求的时候可以指定代理了,加这个的主要是因为公司的内网资源要走代理才能访问到,而只是在浏览器上装了一个插件,只有经过浏览器的请求才会走代理,使用 dotnet-httpie 测试 API 的时候不会走代理,就会返回一个 403,于是添加了对代理的支持,发送请求时指定代理就可以正常请求 API 了.

Features

在之前的版本中,是不会走代理的,在增加代理支持的新版本中会尊重 HttpClient 默认行为,会检测系统代理,自动走系统代理(大多数软件都是尊重系统代理的,比如 Postman,也是会默认使用系统代理的,所以做了这个变动)

dotnet-httpie 代理支持

如果指定了 --no-proxy 就会禁用代理

dotnet-httpie 代理支持

默认请求我们的内网 API 会返回 403

dotnet-httpie 代理支持

指定代理访问 --proxy

dotnet-httpie 代理支持

另一个使用示例:dotnet-http google.com  --proxy=http://127.0.0.1:10809

dotnet-httpie 代理支持

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 代理的功能爬虫会用到的比较多,没想到在这里也用上了,哈哈