但凡代理之类,基本上都有修改头参数的需求,就比如要获取客户端的真实IP,需要写入x-forward-for表示客户端的真实IP,要不然经过转发后的HTTP无法获取真实的客户端地址。所以需要在转发的同时能进行处理头部信息的相关参数。故内网端不能仅做流量转发。而且客户端可能直接以纯HTTP2的协议请求内网的数据,所以同时需要支持HTTP/1.1及HTTP2,由于以上需求,我们把之前的简单的转发逻辑改成以服务端接收客户端请求的模式对数据进行重加工。
以下是数据从外网进入到内网服务器的加工流程graph TDA[外网客户端]B[代理服务端-外网]C[请求端]D[新的请求端]E[代理客户端--内网]F[内网服务器]A-->|请求http端口| BB -->|解析成Request| CC -->|修改Request中的Header|DD -->|发送HTTP请求数据给CenterClient|EE -->|请求内网服务器转发数据|F
以下是内网服务器返回数据给外网客户端的流程graph TDA[外网客户端]B[代理服务端-外网]C[新的返回端]D[返回端]E[代理客户端--内网]F[内网服务器]F -->|返回Response|EE -->|发送HTTP数据给CenterServer|DD -->|修改头信息加工|CC -->|将数据转发给|BB -->|返回数据|A转发中的注意事项
此种报文中我们必须进行解析,因为客户端可能是keep-alive选项,可以连续进行多发。所以收到的Request和Response都是连续的。必须知道何处结束才能继续解析下一个Request/Response。http2不需要,因为http2自带的data分包机制就有这些数据的处理header数据的定义
所以我们client.yaml的配置新增至如下:
核心处理代码在trans/http.rs下,外部传入一个可读可写的stream,可能是TcpStream也可能是TlsStream或者其它,同时把接收的SocketAddr传入,以方便后续获取$client_ip的头文件信息。预处理
后续处理,其中我们读和写都用RecvStream,做到读多少数据转发多少数据,以保证数据处理的及时性
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |