首页 文章

如何使用Fiddler从请求节点库中捕获http消息

提问于
浏览
17

在Fiddler中可以很好地捕获常规客户端发起的对节点服务器的请求 . 但是,不会捕获从节点发送到Web服务的请求 . 将代理配置(127.0.0.1:8888)传递给请求方法没有帮助 . 如何通过Fiddler路由请求消息?

var http = require('http');
var request = require('request');

request.get(webserviceURL, { "auth" : {"user": "user", "pass" = "pass", sendImmediately: true },
"proxy" : { "host" : "127.0.0.1", "port" : 8888 }},
function (error, response) { console.log( "response received" );
});

要求回购:https://github.com/mikeal/request

5 回答

  • 23

    我只是尝试自己这样做(使用Fiddler和来自npm的请求库) . 以下是我如何使用它:

    process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; // Ignore 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' authorization error
    
    // Issue the request
    request(
    {
        method: "GET",
        uri: "https://secure.somewebsite.com/",
        proxy: "http://127.0.0.1:8888" // Note the fully-qualified path to Fiddler proxy. No "https" is required, even for https connections to outside.
    },
    function(err, response, body) {
        console.log("done");
    });
    

    这与Fiddler2使用默认端口和代理选项(并且没有代理身份验证) .

  • 5

    Fiddler的工作原理是将"Internet Options"(从开始菜单)"Connections"> "LAN Settings"> "Proxy Server"设置为其端口,从而使所有HTTP流量(客户端 obey 此设置)通过它 .

    您应该指向node.js客户端lib以使用代理,在启动Fiddler之后,将在该选项对话框中编写设置 .

  • 1

    代理选项应该是一个完整的URL,如下所示:

    proxy : "http://127.0.0.1:8888"
    
  • 0

    要在不改变代码的情况下临时执行此操作,您可以使用环境变量 .

    请求方面:

    • HTTP_PROXY

    • HTTPS_PROXY

    • NO_PROXY

    因此,在运行流程之前,只需在控制台中设置这些代理 .

    例如,要设置http和https代理使用:

    set HTTP_PROXY="http://127.0.0.1:8888"
    set HTTPS_PROXY="http://127.0.0.1:8888"
    set NODE_TLS_REJECT_UNAUTHORIZED=0
    

    后一行通过fiddler代理停止SSL问题 .

  • 4

    我一直想要相同的......相当于chrome DevTools中的 Network 标签,仅适用于Nodejs . 不幸的是,它并没有在Mac上使用Fiddler,所以这就是我如何使用 require('http') 方法来记录和传递 . 离开这里以防我再次需要它或其他人发现它有用 . 您可以通过附加调试器和 require('filename')() 包含此脚本的文件来打开它 .

    module.exports = () => {
        const http = require('http');
        http._request = http.request;
    
        global.DO_LOG_AJAX = true;
        const log = str => {
            if (global.DO_LOG_AJAX) {
                console.debug(str);
            }
        };
    
        const flushLog = (requestLines, responseLines) => {
            if (global.DO_LOG_AJAX) {
                log([
                    '----------------Begin Request-----------------------------------',
                    ...requestLines,
                    '----------------End Request / Begin Response--------------------',
                    ...responseLines,
                    '----------------End Reponse-------------------------------------',
                ].join('\n'));
            }
        };
    
        let write;
        let end;
        http.request = (...requestParams) => {
            const req = http._request(...requestParams);
            const { method, path, headers, host, port } = requestParams[0];
            const requestLogLines = [];
            requestLogLines.push(`${method} ${path}`);
            requestLogLines.push(`Host: ${host}:${port}`);
            for (const header of Object.keys(headers)) {
                requestLogLines.push(`${header}: ${headers[header]}`);
            }
            write = write || req.write;
            end = end || req.end;
    
            req.on('error', err => {
                log({ err });
            });
    
            req._write = write;
            req._end = end;
            const requestBody = [];
            req.write = (...writeParams) => {
                requestBody.push(writeParams[0].toString());
                return req._write(...writeParams);
            };
            req.end = (...endParams) => {
                if (endParams[0]) {
                    requestBody.push(endParams[0].toString());
                }
                requestLogLines.push('');
                requestLogLines.push(requestBody.join(''));
                return req._end(...endParams);
            };
    
            const responseLogLines = [];
            req.once('response', response => {
                const responseBody = [];
                responseLogLines.push(`${response.statusCode} ${response.statusMessage}`);
                for (const header of Object.keys(response.headers)) {
                    responseLogLines.push(`${header}: ${response.headers[header]}`);
                }
                const onData = chunk => {
                    responseBody.push(chunk.toString());
                };
                const onClose = err => {
                    responseLogLines.push('');
                    responseLogLines.push(responseBody.join(''));
                    responseLogLines.push('');
                    responseLogLines.push(`--- ERROR --- ${err.toString()}`);
                    flushLog(requestLogLines, responseLogLines);
                    req.removeListener('data', onData);
                };
                const onEnd = () => {
                    responseLogLines.push('');
                    responseLogLines.push(responseBody.join(''));
                    flushLog(requestLogLines, responseLogLines);
                    req.removeListener('data', onData);
                };
                response.on('data', onData);
                response.once('close', onClose);
                response.once('end', onEnd);
            });
    
            return req;
        };
    };
    

相关问题