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(); то все перестает работать. Что я делаю не так? Ведь беру пример со страницы проекта.
  • Вопрос задан
  • 1979 просмотров
Решения вопроса 1
borisdenis
@borisdenis Автор вопроса
Ответ найден, использовался net 4.5, после перехода на net 4.5.2 проблема исчезла...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы