[英]How to write a reverse proxy using Titanium-Web-Proxy?
I recently wrote a reverse proxy using Titanium-Web-Proxy . 我最近使用Titanium-Web-Proxy编写了一个反向代理。
The browser accesses the reverse proxy through IP 127.0.0.1, port 80, and the reverse proxy forwards the browser's request to the IIS server at IP 127.0.0.1, port 2366. 浏览器通过IP 127.0.0.1,端口80访问反向代理,反向代理将浏览器的请求转发到IP服务器127.0.0.1,端口2366的IIS服务器。
+---------+ Request +---------------+ +------------+
| +-------------> | | Request | |
| | | Reverse Proxy +---------------> | Web Server |
| | | | | |
| Browser | | 127.0.0.1 | | 127.0.0.1 |
| | | | Response | |
| | Response | 80 | <---------------+ 2366 |
| | <-------------+ | | |
+---------+ +---------------+ +------------+
When I tested it, the reverse proxy did not work as I expected, and the browser returned an HTTP 400 error. 当我测试它时,反向代理没有按预期工作,浏览器返回HTTP 400错误。
Bad Request - Invalid Hostname
HTTP Error 400. The request hostname is invalid.
I tried rewriting 127.0.0.1:2366
as localhost:2366
and retesting, and the error was the same. 我尝试将
127.0.0.1:2366
重写为localhost:2366
并重新测试,错误是一样的。
Later I tried to change modifiedUri
to http://example.com but got a 404 Not Found error. 后来我尝试将
modifiedUri
为http://example.com,但得到了404 Not Found错误。
var modifiedUri = new UriBuilder("http://example.com/");
This is my code, please do not mind my poor coding level. 这是我的代码,请不要介意我的编码水平差。
public class Startup
{
private readonly ProxyServer proxyServer;
private readonly IDictionary<Guid, HeaderCollection> requestHeaderHistory = new ConcurrentDictionary<Guid, HeaderCollection>();
private readonly IDictionary<Guid, HeaderCollection> responseHeaderHistory = new ConcurrentDictionary<Guid, HeaderCollection>();
public Startup()
{
proxyServer = new ProxyServer()
{
TrustRootCertificate = true,
ForwardToUpstreamGateway = true,
};
}
public void Start()
{
proxyServer.BeforeRequest += OnRequest;
proxyServer.BeforeResponse += OnResponse;
var transparentProxyEndPoint = new TransparentProxyEndPoint(IPAddress.Loopback, 80, false)
{
};
proxyServer.AddEndPoint(transparentProxyEndPoint);
proxyServer.Start();
}
public void Stop()
{
proxyServer.BeforeRequest -= OnRequest;
proxyServer.BeforeResponse -= OnResponse;
proxyServer.Stop();
}
public async Task OnRequest(object sender, SessionEventArgs e)
{
var requestUri = e.WebSession.Request.RequestUri;
var modifiedUri = new UriBuilder("http", "127.0.0.1", 2366, requestUri.AbsolutePath);
e.WebSession.Request.RequestUri = modifiedUri.Uri;
requestHeaderHistory[e.Id] = e.WebSession.Request.RequestHeaders;
if (e.WebSession.Request.HasBody)
{
var bodyBytes = await e.GetRequestBody();
await e.SetRequestBody(bodyBytes);
string bodyString = await e.GetRequestBodyAsString();
await e.SetRequestBodyString(bodyString);
}
}
public async Task OnResponse(object sender, SessionEventArgs e)
{
responseHeaderHistory[e.Id] = e.WebSession.Response.ResponseHeaders;
if (e.WebSession.Request.Method == "GET" || e.WebSession.Request.Method == "POST")
{
if (e.WebSession.Response.ResponseStatusCode == (int)HttpStatusCode.OK)
{
if (e.WebSession.Response.ContentType != null && e.WebSession.Response.ContentType.Trim().ToLower().Contains("text/html"))
{
var bodyBytes = await e.GetResponseBody();
await e.SetResponseBody(bodyBytes);
string body = await e.GetResponseBodyAsString();
await e.SetResponseBodyString(body);
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.