2016-07-04 2 views
0

壊れたクライアントをサポートする必要がある場合、私は奇妙なHTTPとHTTPのような処理をします。具体的には、クライアントはHTTP PUT要求を行い、クライアントが要求本体を送信する前に、要求ヘッダーを受信した後に200 OKを送信する必要があります。通常、私はこれを行う:「100 Continue」が送信されたかどうかを判断するための適切なNode.js API

app.put('/*', function (req, res, next) { 
    res.socket.write('HTTP/1.0 200 OK\r\n\r\n'); 
    /* Pipe socket and handle data here */ 
} 

しかし、Node.jsの(これを書いているようV6.2.2)の新しいバージョンを使用して、クライアントが適切なHTTP/1.1リクエストで接続し、そのリクエストヘッダでExpect: 100-continueたときに、私自身の応答ステータスラインを送信する機会を得る直前に、HTTPサーバはHTTP/1.1 100 Continueメッセージを(正しく)送信します。その結果、クライアントは次の2つのステータス行を取得します。

HTTP/1.1 100 Continue 
HTTP/1.0 200 OK 

これは大きな問題ではありません。 Node.js HTTPサーバーがステータス行を処理したときに検出する必要があるため、重複を送信しません。トリックは、私はこのAPIが適切に公開されているとは思わない。私の周り突いと、この方法を思い付いた:

app.put('/*', function (req, res, next) { 
    if (!res._sent100) { 
    res.socket.write('HTTP/1.0 200 OK\r\n\r\n'); 
    } 
    /* Pipe socket and handle data here */ 
} 

私の質問:ビルトインHTTPサーバがres._sent100を使って、より100 Continueを送信したときを検出するためのより良い方法はありますか?

HTTP server checkContinue eventがあります。しかし、私がそのイベントを処理すると、通常のイベントは発生しません。私はExpressと組み合わせてこれを使用しています。通常のミドルウェアスタックが実行されるように、通常のリクエストイベントが必要です。 checkContinueを処理できる場合は、自分自身のプロパティーをresに書き込んでから、通常のスタックに戻して処理してください。しかし、私はこれを行うための文書化された方法はありません。

答えて

1

これは動作するようです:

server.on('checkContinue', (req, res) => { 
    res.mySent100 = true; 
    res.writeContinue(); 
    server.emit('request', req, res); 
}); 

serverがあなたExpressのアプリを提供しているHTTPServerのインスタンスです)

関連する問題