web-dev-qa-db-ja.com

リクエストからhttpメッセージをキャプチャする方法Node Library with Fiddler

ノードサーバーへの通常のクライアント開始リクエストは、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

18
mupersan82

私はこれを自分でやろうとしました(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の場合です。

23
idolize

Fiddlerは、「インターネットオプション」(スタートメニューから)「接続」>「LAN設定」>「プロキシサーバー」をそのポートに設定することで機能します。これにより、すべてのHTTPトラフィック(従うこの設定に従うクライアント)が作成されます。それを通過します。

プロキシを使用するようにnode.jsクライアントライブラリを指定する必要があります。設定は、Fiddlerの起動後にそのオプションダイアログに書き込まれます。

5
Poni

プロキシオプションは、次のような完全なURLである必要があります。

proxy : "http://127.0.0.1:8888"
4

コードを変更せずにアドホックベースでこれを行うには、環境変数を使用できます。

敬意を表す:

  • 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

後者の行は、フィドラープロキシを介したSSLの問題を停止します。

1
Jon Egerton

私は同じものを望んでいました... chrome DevToolsのNetworkタブに相当します。Nodejs専用です。残念ながら、存在するようには見えません。私はmacosに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;
    };
};
0
Doug Coburn