首页 文章详情

dotnet-httpie 代理支持

DotNet NB | 107 2022-04-27 18:41 0 0 0
UniSMS (合一短信)

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


推荐阅读:
【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
【译】C# 11 特性的早期预览
【译】在 ASP.NET 和 ASP.NET Core 之间共享代码
【译】ASP.NET Core 6 中的性能改进
【译】.NET 6 网络改进

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2021开发者路线图
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf开发者大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终总结
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter