.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词

这篇具有很好参考价值的文章主要介绍了.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器

原理图如下:
.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词,http,网络协议,网络,CONNECT,Upgrade,c#,.net

这里在NET8.0中实现反向代理服务器部分

新建MiniApi项目
.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词,http,网络协议,网络,CONNECT,Upgrade,c#,.net
编辑Program.cs文件。

var builder = WebApplication.CreateSlimBuilder(args);

var app = builder.Build();

// 将HTTP请求通过协议升级机制转为远程TCP请求(WebSocket分支,Nginx支持) 
app.Map("/http2tcp", async (context) =>
{
    var upgradeFeature = context.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpUpgradeFeature>();
    if (upgradeFeature != null && upgradeFeature.IsUpgradableRequest)
    {
        context.Features.Get<Microsoft.AspNetCore.Http.Timeouts.IHttpRequestTimeoutFeature>()?.DisableTimeout();
        context.Response.Headers.Connection = Microsoft.Net.Http.Headers.HeaderNames.Upgrade;
        context.Response.Headers.Upgrade = "http2tcp/1.0";
        Stream stream = await upgradeFeature.UpgradeAsync();

        using System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient();
        await tcpClient.ConnectAsync(System.Net.IPEndPoint.Parse("127.0.0.1:1000"));
        using System.Net.Sockets.NetworkStream network = tcpClient.GetStream();

        var taskX = network.CopyToAsync(stream);
        var tsakY = stream.CopyToAsync(network);
        Task.WaitAny(taskX, tsakY);
    }
});

// 将HTTP请求通过CONNECT方法转为TCP请求(CONNECT分支)主流浏览器都支持  https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT
app.MapMethods("", new[] { HttpMethods.Connect }, async (context) =>
{
    var auth = context.Request.Headers["Proxy-Authorization"];

    await context.Response.Body.FlushAsync();

    var socket = context.Features.Get<Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature>()!.Socket;
    var stream = new System.Net.Sockets.NetworkStream(socket);

    using var tcpClient = new System.Net.Sockets.TcpClient();
    await tcpClient.ConnectAsync(System.Net.IPEndPoint.Parse(context.Request.Host.Value));
    using var network = tcpClient.GetStream();

    var taskX = network.CopyToAsync(stream);
    var tsakY = stream.CopyToAsync(network);
    Task.WaitAny(taskX, tsakY);
    await socket.DisconnectAsync(true);
    socket.Close();
});

app.Run();

正向代理服务器的HttpClient请求如下,将获取到的TcpStream和TcpListener的NetworkStream串联即可。

// HTTP Upgrade 客户端请求方式
GET http://127.0.0.1:5199/http2tcp HTTP/1.1
Connection: upgrade
Upgrade: example/1, foo/2
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:5199


HTTP CONNECT 客户端请求方式
CONNECT 127.0.0.1:1000 HTTP/1.1
Host: 127.0.0.1:1000
Proxy-Authorization: basic aGVsbG86d29ybGQ=


如下是正向代理服务器和目标服务器之间数据传输示意图。
.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词,http,网络协议,网络,CONNECT,Upgrade,c#,.net文章来源地址https://www.toymoban.com/news/detail-834993.html

到了这里,关于.NE8实现HTTP Tunnel代理,利用HTTP协议升级机制和HTTP CONNECT动词的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nginx-反向代理是设置传输协议http/https

            X-Forwarded-Proto (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器

    2024年02月14日
    浏览(52)
  • 实验3 利用协议分析软件分析HTTP

    目录 一、实验目的 二、实验环境 三、 实验步骤 四、实验报告内容 一、实验目的 1.熟悉并掌握Ethereal(或WireShark)的基本操作,了解网络协议实体间的交互以及报文交换。 2.分析HTTP协议的报文格式中各字段语法语义和工作原理。 二、实验环境 联网计算机;主机操作系统为Wi

    2024年02月08日
    浏览(39)
  • Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务

    作者:刘军 在微服务协议选型方面我们看到越来越多的应用从 Dubbo2 TCP 二进制协议迁移到 Dubbo3 Triple 协议 (兼容 gRPC),以充分利用 Triple 的高效、全双工、Streaming 流式通信模型等能力;Triple+HTTP/2 的组合很好的解决了后端服务穿透性等问题,但在阿里及众多社区企业的实践中

    2024年02月15日
    浏览(42)
  • selenium 使用ip代理报错 unknown error: net::ERR_TUNNEL_CONNECTION_FAILED 解决办法

    在使用 selenium 框架作为爬虫框架进行内容爬取时,难免会用到 ip 代理池。第一次使用 selenium 的 --proxy-server 参数进行代理访问时,我遇到了如下报错: 在 selenium 框架中想使用 ip 代理的方式访问 url,必须先安装 selenium-wire 模块,再从 seleniumwire 导入 webdriver 后使用。否则就会

    2024年02月11日
    浏览(77)
  • fiddler抓包时,http请求的host参数值为“Tunnel to”的原因及解决办法

    fiddler抓包时,https请求中有一些http请求,且这些http请求的host参数值是:Tunnel to 。 fiddler做代理转发https请求时,就会产生:CONNECT Tunnels,可以不管它。 博客主页: https://blog.csdn.net/yisumi

    2024年04月12日
    浏览(50)
  • Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad request

    今天通过nginx代理下载pdf报这个错,网上查了很多资料,说的大部分都是Android studio这个的解决办法,几乎没有针对nginx的处理,部分说是需要配hosts,配了hosts也没用,有一些说是要增加proxy_set_header Host $http_host;这个配置,也不能解决我的问题,这边记录一下针对我这边出现问

    2024年02月12日
    浏览(47)
  • 利用nginx/apache代理wss 实现 小程序 端口 反向代理

    除了用Workerman自身的SSL,也可以利用nginx/apache作为wss代理转发给workerman 我就是栽在这大坑里(nginx/apache代理wss,workerman部分就不要设置ssl,否则将无法连接,两个方法2选1)官方推荐用nginx/apache代理wss 如果是微信小程序,要添加合法域名 格式:wss://域名 结尾不要加/,可以:端

    2024年02月12日
    浏览(46)
  • HTTP与HTTPS:深度解析两种网络协议的工作原理、安全机制、性能影响与现代Web应用中的重要角色

    HTTP (HyperText Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是互联网通信中不可或缺的两种协议,它们共同支撑了全球范围内的Web内容传输与交互。本文将深度解析HTTP与HTTPS的工作原理、安全机制、性能影响,并探讨它们在现代Web应用中的核心角色。 HTTP 是一种应用层协议

    2024年04月11日
    浏览(63)
  • Android开发中利用代理模式的实现思路

    当需要在 访问对象之前 或 之后添加额外的逻辑处理 时,可以使用代理模式。在Android开发中,代理模式常被用于实现以下功能: 控制对对象的访问、实现延迟加载、添加额外的操作等 。 首先直接给出实现代码: 代码中, ImageLoader 是一个接口,定义了加载和显示图片的方式

    2024年02月11日
    浏览(39)
  • 利用代理ip实现自动化爬虫任务管理

        我们在进行爬虫任务管理时,需要对爬取目标、爬取频率、数据存储等多个方面进行规划和管理。使用HTTP代理可以帮助我们提高爬虫效率,同时也可以实现自动化的爬虫任务管理。下面我们来分析一下怎么利用代理ip实现自动化爬虫任务管理。                 一、选

    2024年02月10日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包