borisdenis
@borisdenis
Ленив и вреден...

Titanium.Web.Proxy что я делаю не так?

Нужно для проекта использовать свой прокси сервер, выбор остановился на Titanium.Web.Proxy. В общем все работает нормально кроме момента где нужно изменить ответ от сервера, как только пытаюсь это сделать то получаю от браузера - Error code 324 (net::ERR_EMPTY_RESPONSE). Решил взять пример из гитхаба и просто попробовать изменить title страницы. Получился вот такой код:

static void Main(string[] args)
        {
            var proxyServer = new ProxyServer();
            proxyServer.TrustRootCertificate = true;

            proxyServer.BeforeRequest += OnRequest;
            proxyServer.BeforeResponse += OnResponse;
            proxyServer.ServerCertificateValidationCallback += OnCertificateValidation;
            proxyServer.ClientCertificateSelectionCallback += OnCertificateSelection;

            var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, 8000, true)
            {
                //Exclude Https addresses you don't want to proxy
                //Usefull for clients that use certificate pinning
                //for example dropbox.com
                // ExcludedHttpsHostNameRegex = new List<string>() { "google.com", "dropbox.com" }

                //Use self-issued generic certificate on all https requests
                //Optimizes performance by not creating a certificate for each https-enabled domain
                //Usefull when certificate trust is not requiered by proxy clients
                // GenericCertificate = new X509Certificate2(Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "genericcert.pfx"), "password")
            };

            proxyServer.AddEndPoint(explicitEndPoint);
            proxyServer.Start();

            foreach (var endPoint in proxyServer.ProxyEndPoints)
                Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ",
                    endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);

            Console.Read();

            //Unsubscribe & Quit
            proxyServer.BeforeRequest -= OnRequest;
            proxyServer.BeforeResponse -= OnResponse;
            proxyServer.ServerCertificateValidationCallback -= OnCertificateValidation;
            proxyServer.ClientCertificateSelectionCallback -= OnCertificateSelection;
            proxyServer.Stop();
        }

        static private async Task OnRequest(object sender, SessionEventArgs e)
        {
            Console.WriteLine(e.WebSession.Request.Url);

            ////read request headers
            var requestHeaders = e.WebSession.Request.RequestHeaders;

            var method = e.WebSession.Request.Method.ToUpper();
            if ((method == "POST" || method == "PUT" || method == "PATCH"))
            {
                //Get/Set request body bytes
                byte[] bodyBytes = await e.GetRequestBody();
                await e.SetRequestBody(bodyBytes);

                //Get/Set request body as string
                string bodyString = await e.GetRequestBodyAsString();
                await e.SetRequestBodyString(bodyString);

            }

            //To cancel a request with a custom HTML content
            //Filter URL
            if (e.WebSession.Request.RequestUri.AbsoluteUri.Contains("google.com"))
            {
                await e.Ok("<!DOCTYPE html>" +
                      "<html><body><h1>" +
                      "Website Blocked" +
                      "</h1>" +
                      "<p>Blocked by titanium web proxy.</p>" +
                      "</body>" +
                      "</html>");
            }
            //Redirect example
            if (e.WebSession.Request.RequestUri.AbsoluteUri.Contains("wikipedia.org"))
            {
                await e.Redirect("https://www.paypal.com");
            }
        }

        static private async Task OnResponse(object sender, SessionEventArgs e)
        {

            //read response headers
            var responseHeaders = e.WebSession.Response.ResponseHeaders;
            //e.WebSession.Response.ResponseHeaders.Remove("Content-Security-Policy");

            //if (!e.ProxySession.Request.Host.Equals("medeczane.sgk.gov.tr")) return;
            if (e.WebSession.Request.Method == "GET" || e.WebSession.Request.Method == "POST")
            {
                if (e.WebSession.Response.ResponseStatusCode == "200")
                {
                    if (e.WebSession.Response.ContentType != null && e.WebSession.Response.ContentType.Trim().ToLower().Contains("text/html"))
                    {
                        byte[] bodyBytes = await e.GetResponseBody();
                        await e.SetResponseBody(bodyBytes);
                        
                        string body = await e.GetResponseBodyAsString();
                        body = body.Replace("<title>", "<title>xxxxxxxxxxxxxxxxxxxxxxxxxx");

                        await e.SetResponseBodyString(body);
                    }
                }
            }
        }
        /// Allows overriding default certificate validation logic
        static private Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
        {
            //set IsValid to true/false based on Certificate Errors
            if (e.SslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
                e.IsValid = true;

            return Task.FromResult(0);
        }

        /// Allows overriding default client certificate selection logic during mutual authentication
        static private Task OnCertificateSelection(object sender, CertificateSelectionEventArgs e)
        {
            //set e.clientCertificate to override
            return Task.FromResult(0);
        }


Но... опять в браузере - Error code 324 (net::ERR_EMPTY_RESPONSE)
Если закомментировать строку proxyServer.BeforeResponse += OnResponse; то все работает, методом проб выяснилось, что если в
static private async Task OnResponse(object sender, SessionEventArgs e)
оставить только одну строку string body = await e.GetResponseBodyAsString(); или byte[] bodyBytes = await e.GetResponseBody(); то все перестает работать. Что я делаю не так? Ведь беру пример со страницы проекта.
  • Вопрос задан
  • 2090 просмотров
Решения вопроса 1
borisdenis
@borisdenis Автор вопроса
Ленив и вреден...
Ответ найден, использовался net 4.5, после перехода на net 4.5.2 проблема исчезла...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы