当前位置: 首页 > news >正文

ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器

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

原理图如下:
在这里插入图片描述

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

新建MiniApi项目
在这里插入图片描述
编辑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=


如下是正向代理服务器和目标服务器之间数据传输示意图。
在这里插入图片描述

相关文章:

  • php/js:实现几秒后进行页面跳转
  • 【软考中级】3天擦线过软考中级-软件设计师
  • 使用vscode查bug
  • 几款提高开发效率的Idea 插件
  • 力扣题目训练(1)
  • c++ class总结
  • 微认证 openEuler社区开源贡献实践
  • 头歌C语言递归函数、嵌套函数
  • SpringBoot整合ElasticSearch实现分页查询
  • 【Python】01快速上手爬虫案例一
  • JVM-初始JVM
  • cmd_to_robot 讨论及 G29 控制优化
  • hcip----ospf
  • 2023年总结我所经历的技术大变革
  • 探索无尽可能性:C++深度优先搜索算法解析
  • Scrapy爬虫在新闻数据提取中的应用
  • Find My卡片正成为消费电子香饽饽,伦茨科技ST17H6x可以帮到您
  • Webpack5入门到原理20:Vue 脚手架搭建
  • Java-GUI
  • 服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例
  • 广西壮族自治区医保网上服务大厅/北京seo地址
  • 深圳做网站外包公司/网络推广发帖网站
  • 做公司网站怎么做/百度问答首页
  • 班级展示网站/南京seo优化推广
  • 越南人一般去哪个网站做贸易/百度一下你就知道了百度一下
  • css网站开发实录/广告联盟点击赚钱平台