Titanium Web 代理 - 无法修改请求正文
Titanium Web Proxy - Can't modify request body
我在使用 Titanium Web 代理时遇到问题。我想要的是在将某些网站加载到浏览器之前更改它们的内容。我已经实施了一切并且工作正常,减去了不断变化的内容部分。这是代码的一部分:
public async Task OnRequest(object sender, SessionEventArgs e)
{
//Console.WriteLine(e.HttpClient.Request.Url);
// read request headers
var requestHeaders = e.HttpClient.Request.Headers;
var method = e.HttpClient.Request.Method.ToUpper();
if ((method == "POST" || method == "PUT" || method == "PATCH"))
{
// Get/Set request body bytes
byte[] bodyBytes = await e.GetRequestBody();
await Task.Run(() => e.SetRequestBody(bodyBytes));
// Get/Set request body as string
string bodyString = await e.GetRequestBodyAsString();
await Task.Run(() => e.SetRequestBodyString(bodyString));
// store request
// so that you can find it from response handler
e.UserData = e.HttpClient.Request;
}
if(e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("websiteiwanttochange"))
{
byte[] bodyBytes = await e.GetResponseBody();
e.SetRequestBody(bodyBytes);
string bodyString = await e.GetResponseBodyAsString();
e.SetRequestBodyString(bodyString);
e.UserData = e.WebSession.Request;
Console.WriteLine("\n\n\n\n\n\n\nTesting\n\n\n\n\n\n");
Console.WriteLine(bodyBytes.ToString());
//Console.WriteLine(bodyString);
}
// To cancel a request with a custom HTML content
// Filter URL
if (e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("google.com"))
{
e.Ok("<!DOCTYPE html>" +
"<html><body><h1>" +
"Website Blocked" +
"</h1>" +
"<p>Blocked by titanium web proxy.</p>" +
"</body>" +
"</html>");
}
// Redirect example
if (e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("wikipedia.org"))
{
e.Redirect("https://www.paypal.com");
}
}
这几乎就是我从 Titanium Web Proxy Github 获得的示例。但是,尽管此代码可以正确加载网站,但它永远不会到达“\n\n\n\n\n\n\nTesting\n\n\n\n\n\n”。
我已经尝试为该网站添加阻止,就像为 google 一样,它工作正常并阻止它。
有谁知道可能是什么问题?我坚持了一段时间,所以任何帮助将不胜感激。
这个例子没有实现内容的改变,我只是想把内容看成字符串,然后尝试改变它。
如果我没理解错的话,你想在浏览器获取之前修改从远程服务器收到的响应。挂钩的正确位置是 OnBeforeResponse 事件。这是一个示例代码,我将响应的主体从 http://example.com:
更改为
void Main()
{
var proxyServer = new ProxyServer(userTrustRootCertificate: false);
proxyServer.BeforeResponse += OnBeforeResponse;
var httpProxy = new ExplicitProxyEndPoint(IPAddress.Loopback, 8080, decryptSsl: true);
proxyServer.AddEndPoint(httpProxy);
proxyServer.Start();
Console.ReadLine();
proxyServer.BeforeResponse -= OnBeforeResponse;
proxyServer.Stop();
}
public async Task OnBeforeResponse(object sender, SessionEventArgs ev)
{
var request = ev.HttpClient.Request;
var response = ev.HttpClient.Response;
if (String.Equals(ev.HttpClient.Request.RequestUri.Host, "www.example.com", StringComparison.OrdinalIgnoreCase)) {
var body = await ev.GetResponseBodyAsString();
body = body.Replace("<title>Example Domain</title>", "<title>My Example Domain</title>");
ev.SetResponseBodyString(body);
}
}
并测试:
$ curl.exe --proxy http://localhost:8080 http://www.example.com
<!doctype html>
<html>
<head>
<title>My Example Domain</title>
... stripped ...
我在使用 Titanium Web 代理时遇到问题。我想要的是在将某些网站加载到浏览器之前更改它们的内容。我已经实施了一切并且工作正常,减去了不断变化的内容部分。这是代码的一部分:
public async Task OnRequest(object sender, SessionEventArgs e)
{
//Console.WriteLine(e.HttpClient.Request.Url);
// read request headers
var requestHeaders = e.HttpClient.Request.Headers;
var method = e.HttpClient.Request.Method.ToUpper();
if ((method == "POST" || method == "PUT" || method == "PATCH"))
{
// Get/Set request body bytes
byte[] bodyBytes = await e.GetRequestBody();
await Task.Run(() => e.SetRequestBody(bodyBytes));
// Get/Set request body as string
string bodyString = await e.GetRequestBodyAsString();
await Task.Run(() => e.SetRequestBodyString(bodyString));
// store request
// so that you can find it from response handler
e.UserData = e.HttpClient.Request;
}
if(e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("websiteiwanttochange"))
{
byte[] bodyBytes = await e.GetResponseBody();
e.SetRequestBody(bodyBytes);
string bodyString = await e.GetResponseBodyAsString();
e.SetRequestBodyString(bodyString);
e.UserData = e.WebSession.Request;
Console.WriteLine("\n\n\n\n\n\n\nTesting\n\n\n\n\n\n");
Console.WriteLine(bodyBytes.ToString());
//Console.WriteLine(bodyString);
}
// To cancel a request with a custom HTML content
// Filter URL
if (e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("google.com"))
{
e.Ok("<!DOCTYPE html>" +
"<html><body><h1>" +
"Website Blocked" +
"</h1>" +
"<p>Blocked by titanium web proxy.</p>" +
"</body>" +
"</html>");
}
// Redirect example
if (e.HttpClient.Request.RequestUri.AbsoluteUri.Contains("wikipedia.org"))
{
e.Redirect("https://www.paypal.com");
}
}
这几乎就是我从 Titanium Web Proxy Github 获得的示例。但是,尽管此代码可以正确加载网站,但它永远不会到达“\n\n\n\n\n\n\nTesting\n\n\n\n\n\n”。
我已经尝试为该网站添加阻止,就像为 google 一样,它工作正常并阻止它。
有谁知道可能是什么问题?我坚持了一段时间,所以任何帮助将不胜感激。
这个例子没有实现内容的改变,我只是想把内容看成字符串,然后尝试改变它。
如果我没理解错的话,你想在浏览器获取之前修改从远程服务器收到的响应。挂钩的正确位置是 OnBeforeResponse 事件。这是一个示例代码,我将响应的主体从 http://example.com:
更改为void Main()
{
var proxyServer = new ProxyServer(userTrustRootCertificate: false);
proxyServer.BeforeResponse += OnBeforeResponse;
var httpProxy = new ExplicitProxyEndPoint(IPAddress.Loopback, 8080, decryptSsl: true);
proxyServer.AddEndPoint(httpProxy);
proxyServer.Start();
Console.ReadLine();
proxyServer.BeforeResponse -= OnBeforeResponse;
proxyServer.Stop();
}
public async Task OnBeforeResponse(object sender, SessionEventArgs ev)
{
var request = ev.HttpClient.Request;
var response = ev.HttpClient.Response;
if (String.Equals(ev.HttpClient.Request.RequestUri.Host, "www.example.com", StringComparison.OrdinalIgnoreCase)) {
var body = await ev.GetResponseBodyAsString();
body = body.Replace("<title>Example Domain</title>", "<title>My Example Domain</title>");
ev.SetResponseBodyString(body);
}
}
并测试:
$ curl.exe --proxy http://localhost:8080 http://www.example.com
<!doctype html>
<html>
<head>
<title>My Example Domain</title>
... stripped ...