2017-04-18 1 views
4

node-http-proxyアプリケーションでhttp.Agenthttps.Agentを使用して接続プーリングを有効にしたいと考えています。これを行うには、私はそうのように、安全なエージェントを設立しました:node-http-proxy経由でプロキシを行うときにhttps.Agentが解析エラーをスローするのはなぜですか?

const secureAgent = new https.secureAgent({ keepAlive: true }); 

は(私は簡潔にするために補完的なHTTPエージェントを省略されました。)

は、私のような、プロキシサーバーを作成します。

そのような接続ミドルウェア内部
const proxy = httpProxy.createProxyServer({}); 

最後に、私のプロキシ要求:

proxy.web(req, res { 
    agent: isSecure ? secureAgent : agent, 
    target: ..., 
    secure: false, 
}); 

これは、ほとんどのREQのために働くようですuestsが、私はこのようになりますエラー表示されたら、数分ごと:レスポンスが不正な形式であるとき、いくつかのぞんざいな読書から

{ 
    "message": "Parse Error", 
    "stack": "Error: Parse Error\n at TLSSocket.socketOnData (_http_client.js:411:20)\n at emitOne (events.js:96:13)\n at TLSSocket.emit (events.js:191:7)\n at readableAddChunk (_stream_readable.js:178:18)\n at TLSSocket.Readable.push (_stream_readable.js:136:10)\n at TLSWrap.onread (net.js:560:20)", 
    "bytesParsed": 215, 
    "code": "HPE_INVALID_CONSTANT", 
    "__error_callsites": [ 
     {}, 
     {}, 
     {}, 
     {}, 
     {}, 
     {} 
    ], 
    "level": "error", 
    "timestamp": "2017-04-18T17:34:09.735Z" 
} 

を、それがHPE_INVALID_CONSTANTマニフェストです。ただし、これらの応答はセキュアエージェントの導入までは問題ありません。

誰でもここで何が起こっているのか、どうやって修正できるのでしょうか?

注:このエラーは、Dockerコンテナのノードv7.9.0でFROM node:7.9経由で発生します。これまでのところ、私はHEADリクエストでのみこれを観察しました。何らかの理由があります。

+0

あなたのリクエストパラメータには、?a = "ab"のような空白があります –

+0

私はこの特定のケースでは非常に起こりそうにないと言われているリクエストパラメタの網羅的なリストを持っていません - これらはプロキシされている彼らが何かになる可能性があるように顧客のサイトに対する要求。 – maxcountryman

+0

私は同様の問題に直面していました。 (ノード要求ライブラリを使用していました)、私のケースでは、要求パラメータの値の1つにあります。さらに、私はhttp:// localhost(nginx)へのリクエストを作成していましたが、これはPythonでhttps:// localhostにリダイレクトされていました。これらの2つの組み合わせが私の問題を引き起こしていました。一つのことは、私のケースでは利用可能なリクエストボディを持っていたが、Parseエラーが来たことに気づいた。私は、エラーを無視し、応答を送信する小さなハックを行いました。あなたが望むなら私はコードを共有することができます。 PS - モバイルを使用してタイプミスやエラーを入力してください –

答えて

0

ここにコメントを追加するだけです。 私も同様の問題に直面していました。 (ノード要求ライブラリを使用していました)、私のケースでは、要求パラメータの値の1つにあります。プラス私はhttps://localhost(https)にpythonでリダイレクトされていたhttp://localhost(http)(nginx)へのリクエストを作成していました。これらの2つの組み合わせが私の問題を引き起こしていました。一つのことは、私のケースでは利用可能なリクエストボディを持っていたが、Parseエラーが来たことに気づいた。私は、エラーを無視し、応答を送信する小さなハックを行いました。

let formData = "some data"; 
    let headers = // some headers; 
    headers["content-length"] = formData.length; 
    headers["Accept-Encoding"] = "gzip, deflate"; 
    let gunzip; 
    return new Promise(function (resolve, reject) { 
     let buffer = []; 
     let req = http.request({ 
      port: 80, 
      method: "POST", 
      path: url, 
      headers: headers 
     }, function (res) { 
      let resHeaders = res.headers["content-encoding"]; 
      switch (resHeaders){ 
       case "gzip": 
        gunzip = zlib.createGunzip(); 
        res.pipe(gunzip); 
        gunzip.on("data", function (data) { 
         buffer.push(data.toString()); 
        }).on("end", function() { 
         resolve(buffer[0]) 
        }); 
        break; 
       case "deflate": 
        gunzip = zlib.createDeflate(); 
        res.pipe(gunzip); 
        gunzip.on("data", function (data) { 
         buffer.push(data.toString()); 
        }).on("end", function() { 
         resolve(buffer[0]) 
        }); 
        break; 
       default: 
        res.on("data", function (data) { 
         buffer.push(data.toString()) 
        }).on("end", function() { 
         resolve(buffer[0]) 
        }) 
      } 
     }); 
     req.on('error', (e) => { 
      // This is the Hack. If there is an error just ignore it. 
      logger.debug("Error in getting requests, ", e) 
     }); 
     req.write(formData); 
     req.end(); 
    }) 
} 

希望します。あなたが理由を見つけたら分かち合う。私は1日の理由を理解しようとしましたが、できませんでした。プロダクションでこの問題が発生したので、このクイックパッチを実行する必要がありました。

私が考えていることは、おそらくHTTPSリダイレクトがフローにあるからです。

関連する問題