简体   繁体   English

Titanium Web 代理 - 无法修改请求正文

[英]Titanium Web Proxy - Can't modify request body

I'm having an issue with Titanium Web Proxy.我在使用 Titanium Web 代理时遇到问题。 What I want is to change the content of certain websites before I load them in the browser.我想要的是在将某些网站加载到浏览器之前更改它们的内容。 I've implemented everything and it's working okay, minus the changing content part.我已经实施了一切并且工作正常,减去了不断变化的内容部分。 Here is that part of the code:这是代码的一部分:

        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");
        }
    }

Which is pretty much the example I got from Titanium Web Proxy Github. However, this code never reaches ""\n\n\n\n\n\n\nTesting\n\n\n\n\n\n" although it loads the website properly.这几乎是我从 Titanium Web 代理 Github 获得的示例。但是,此代码永远不会到达 ""\n\n\n\n\n\n\nTesting\n\n\n\n\n\n" 虽然它正确加载网站。

I've tried to add blocking for that website, like it's for google, it works properly and blocks it.我已经尝试为该网站添加阻止,就像它对谷歌一样,它可以正常工作并阻止它。

Does anyone knows what could be the problem?有谁知道可能是什么问题? I'm stuck with this for a while, so any help would be appreciated.我坚持了一段时间,所以任何帮助将不胜感激。

Content changing is not implemented in this example, I just want to see the content as string, then try to change it.此示例中未实现内容更改,我只想将内容视为字符串,然后尝试更改它。

If I understand correctly, you want to modify a response received from the remote server before the browser gets it.如果我理解正确,您想在浏览器获取响应之前修改从远程服务器收到的响应。 The right place to hook is the OnBeforeResponse event.挂钩的正确位置是OnBeforeResponse事件。 Here is a sample code where I change the body of the response from http://example.com :这是一个示例代码,我在其中更改了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);
    }
}

And test:并测试:

$ curl.exe --proxy http://localhost:8080 http://www.example.com
<!doctype html>
<html>
<head>
    <title>My Example Domain</title>

... stripped ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM