1. ホーム
  2. javascript

[解決済み] node.jsで簡単なhttpプロキシを作成する方法とは?

2022-11-05 06:22:56

質問

プロキシサーバを作成して HTTP GET リクエストを渡すプロキシサーバを作成しようとしています。私のプロキシは、入ってくるリクエストをターゲットサイト上の対応するパスにミラーリングする必要があるだけです。

127.0.0.1/images/srpr/logo11w.png

次のリソースを提供する必要があります。

http://www.google.com/images/srpr/logo11w.png

思いついたのはこんな感じです。

http.createServer(onRequest).listen(80);

function onRequest (client_req, client_res) {
    client_req.addListener("end", function() {
        var options = {
            hostname: 'www.google.com',
            port: 80,
            path: client_req.url,
            method: client_req.method
            headers: client_req.headers
        };
        var req=http.request(options, function(res) {
            var body;
            res.on('data', function (chunk) {
                body += chunk;
            });
            res.on('end', function () {
                 client_res.writeHead(res.statusCode, res.headers);
                 client_res.end(body);
            });
        });
        req.end();
    });
}

htmlページではうまくいくのですが、他の種類のファイルでは、空白のページが返されるか、ターゲットサイトからの何らかのエラーメッセージ(サイトによって異なる)が返されるだけです。

どのように解決するのですか?

サードパーティサーバーから受け取った応答を処理するのは良いアイデアとは思えません。これは、プロキシ サーバーのメモリ フットプリントを増加させるだけです。さらに、それはあなたのコードが動作しない理由でもあります。

代わりに、クライアントに応答を渡してみてください。次のスニペットを考えてみてください。

var http = require('http');

http.createServer(onRequest).listen(3000);

function onRequest(client_req, client_res) {
  console.log('serve: ' + client_req.url);

  var options = {
    hostname: 'www.google.com',
    port: 80,
    path: client_req.url,
    method: client_req.method,
    headers: client_req.headers
  };

  var proxy = http.request(options, function (res) {
    client_res.writeHead(res.statusCode, res.headers)
    res.pipe(client_res, {
      end: true
    });
  });

  client_req.pipe(proxy, {
    end: true
  });
}