2017-06-30 8 views
1

私はexpressでhttpサーバを作成します。私は、URLを取得するためのnetcatを使用する場合res.writeHead()を無効にする方法は、出力の前に余分な番号を出力しますか?

router.get('/', function(req, res, next) { 
    // req.socket.setTimeout(Infinity); 
    res.writeHead(200, { 
    'Content-Type': 'text/plain; charset=utf-8', // <- Important headers 
    'Cache-Control': 'no-cache', 
    'Connection': 'keep-alive', 
    }); 
    res.write('hell'); 
    res.write('world'); 
    res.end(); 

    // res.write('\n\n'); 
    // response = res; 
}); 

: 以下は、サーバーコードです。 出力はこの

GET /sse HTTP/1.1 

HTTP/1.1 200 OK 
X-Powered-By: Express 
Content-Type: text/plain; charset=utf-8 
Cache-Control: no-cache 
Expires: 0 
Connection: keep-alive 
Keep-Alive: timeout=5, max=97 
Date: Fri, 30 Jun 2017 11:50:00 GMT 
Transfer-Encoding: chunked 

4 
hell 
5 
world 
0 

私の質問のようなもので、すべてのres.write前に、常に数がある理由()?そして、その数はres.writeの出力の長さと思われます。

番号を削除するにはどうすればよいですか?

+0

https://en.wikipedia.org/wiki/Chunked_transfer_encoding – robertklep

答えて

3

チャンクエンコーディングの仕組みです。どのくらいのバイトを送信するのかを宣言する必要はありませんが、すべてのチャンクにはそのバイト数が前に付加されています。たとえば、"hell"の場合は4、"world"の場合は5、「送信するバイトがない」の場合は0です。

あなたはチャンクエンコードヘッダ存在があることを見ることができます:あなたはチャンクエンコーディングをオフにする必要があるだろう数字を削除するには、直接あなたの質問に答えるために、

Transfer-Encoding: chunked 

を。これを行うには、Content-lengthヘッダーを、応答の本体で送信するバイト数に設定する必要があります。例えば

app.get('/', function(req, res, next) { 
    res.writeHead(200, { 
    'Content-Type': 'text/plain; charset=utf-8', 
    'Cache-Control': 'no-cache', 
    'Connection': 'keep-alive', 
    'Content-length': 9, // <<<--- NOTE HERE 
    }); 
    res.write('hell'); 
    res.write('world'); 
    res.end(); 
}); 

(実際のコードではもちろん、あなたがコンテンツを設定する直前に応答の長さを計算したり、文字列を構築するか、その長さをバッファリングして取得するのいずれかがあるだろう-length header)。

ただし、curlや他のHTTPクライアントを使用すると、数値が「削除」されることに注意してください。 netcatを使用すると、チャンクエンコーディングの基本的な実装の詳細が間違って見えてしまいますが、実際のHTTPクライアントはすべてうまく処理できます。

通常、HTTPではヘッダーに応答全体の長さを宣言してから、本体を複数のチャンクに分割して送信しますが、宣言した長さと同じ長さにする必要があります。これは、送信したいすべての長さを知る前に、データの送信を開始できないことを意味します。チャンクエンコーディングでは、送信する各チャンクの長さを宣言するだけで十分ですが、レスポンス全体の長さを知る必要はありません。無限でも可能ですが、それはあなた次第です。非常に便利なものがあればすぐに送信を開始することができます。

関連する問題