16

シンプルな http プロキシ サーバーを作成して、node.js について詳しく学ぼうとしています。使用シナリオは単純です: ユーザー -> プロキシ -> サーバー -> プロキシ -> ユーザー

次のコードは、最後のステップまで機能します。コネクタの出力をユーザーに戻す方法が見つかりませんでした。

#!/usr/bin/env node

var
    url = require('url'),
    http = require('http'),
    acceptor = http.createServer().listen(3128);

acceptor.on('request', function(request, response) {
    console.log('request ' + request.url);
    request.pause();
    var options = url.parse(request.url);
    options.headers = request.headers;
    options.method = request.method;
    options.agent = false;

    var connector = http.request(options);
    request.pipe(connector);
    request.resume();
//  connector.pipe(response); // doesn't work
//  connector.pipe(request); // doesn't work either
});

tcpflow を使用すると、ブラウザからの着信要求、発信プロキシ要求、プロキシへのサーバー応答が表示されます。どういうわけか、応答をブラウザに再送信できませんでした。

このロジックをパイプで実装する適切な方法は何ですか?

4

3 に答える 3

26

「一時停止」する必要はありません。「パイプ」だけで問題ありません

var connector = http.request(options, function(res) {
  res.pipe(response, {end:true});//tell 'response' end=true
});
request.pipe(connector, {end:true});

http リクエストは、'end' であると通知するまで終了しません。

于 2012-11-20T12:19:53.487 に答える
25

わかった。とった。

更新:注意!コメントで報告されているように、この例はもう機能しません。ほとんどの場合、Streams2 API の変更 (ノード 0.9 以降) が原因です。

クライアントへのパイプバックは、次のようにコネクタのコールバック内で発生する必要があります。

#!/usr/bin/env node

var
    url = require('url'),
    http = require('http'),
    acceptor = http.createServer().listen(3128);

acceptor.on('request', function(request, response) {
    console.log('request ' + request.url);
    request.pause();
    var options = url.parse(request.url);
    options.headers = request.headers;
    options.method = request.method;
    options.agent = false;

    var connector = http.request(options, function(serverResponse) {
            serverResponse.pause();
            response.writeHeader(serverResponse.statusCode, serverResponse.headers);
            serverResponse.pipe(response);
            serverResponse.resume();
    });
    request.pipe(connector);
    request.resume();
});
于 2012-11-20T12:10:48.780 に答える