La respuesta de Fiddler (FiddlerCore) funciona de forma lenta al insertar un script

fiddler fiddlercore html-agility-pack proxy

Pregunta

Intento crear un servidor proxy con fiddlercore y cuando uso el evento BeforeResponse, el código funciona muy lento. Lo que intento hacer es insertar una secuencia de comandos en la parte superior de la página actual.

¿Por qué el código debajo del código es tan lento si se debe insertar algún tipo de filtro o qué?

Fiddler.FiddlerApplication.BeforeResponse += delegate(Fiddler.Session oS)
        {
            Console.WriteLine("{0}:HTTP {1} for {2}", oS.id, oS.responseCode, oS.fullUrl);

            oS.utilDecodeResponse(); 
            string HTML = oS.GetResponseBodyAsString();

            HtmlDocument htmlDoc = new HtmlDocument();
            try
            {
                htmlDoc.LoadHtml(HTML);
                HtmlNode node = htmlDoc.CreateElement("script");
                node.SetAttributeValue("src", "https://somesite.com");
                HtmlNode Head = htmlDoc.DocumentNode.SelectSingleNode("//Head");

                if (Head != null)
                {
                    Head.AppendChild(node);
                    oS.utilSetResponseBody(htmlDoc.DocumentNode.OuterHtml);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }

            Console.WriteLine("URL: {0}", oS.url);
        };

Aquí está el código completo:

Fiddler.FiddlerApplication.BeforeResponse += delegate(Fiddler.Session oS)
        {
            Console.WriteLine("{0}:HTTP {1} for {2}", oS.id, oS.responseCode, oS.fullUrl);

            oS.utilDecodeResponse(); 
            string HTML = oS.GetResponseBodyAsString();

            HtmlDocument htmlDoc = new HtmlDocument();
            try
            {
                htmlDoc.LoadHtml(HTML);
                HtmlNode node = htmlDoc.CreateElement("script");
                node.SetAttributeValue("src", "https://somesite.com");
                HtmlNode Head = htmlDoc.DocumentNode.SelectSingleNode("//Head");

                if (Head != null)
                {
                    Head.AppendChild(node);
                    oS.utilSetResponseBody(htmlDoc.DocumentNode.OuterHtml);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }

            Console.WriteLine("URL: {0}", oS.url);
        };

Respuesta aceptada

Su código actual está descomprimiendo cada respuesta HTTP y tratando de tratarlo como un documento HTML. Eso obviamente será lento y fallará para todo lo que no sea HTML (imágenes, etc.).

En su lugar, solo debe hacer su procesamiento if oS.oResponse.headers.ExistsAndContains("text/html") . No es necesario que llame manualmente a utilDecodeResponse ya que GetResponseBodyAsString se encargará de eso por usted. Y en lugar de usar lo que sea HtmlDocument , puede considerar realizar un reemplazo de cadena, por ejemplo, reemplazar </head> con <script src=whatever.js /></head> .




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué