-
-
Save kadishmal/3871017 to your computer and use it in GitHub Desktop.
var http = require('http'); | |
http.createServer(function (request, response) { | |
response.setHeader('Content-Type', 'text/html; charset=UTF-8'); | |
response.setHeader('Transfer-Encoding', 'chunked'); | |
var html = | |
'<!DOCTYPE html>' + | |
'<html lang="en">' + | |
'<head>' + | |
'<meta charset="utf-8">' + | |
'<title>Chunked transfer encoding test</title>' + | |
'</head>' + | |
'<body>'; | |
response.write(html); | |
html = '<h1>Chunked transfer encoding test</h1>' | |
response.write(html); | |
// Now imitate a long request which lasts 5 seconds. | |
setTimeout(function(){ | |
html = '<h5>This is a chunked response after 5 seconds. The server should not close the stream before all chunks are sent to a client.</h5>' | |
response.write(html); | |
// since this is the last chunk, close the stream. | |
html = | |
'</body>' + | |
'</html'; | |
response.end(html); | |
}, 5000); | |
// this is another chunk of data sent to a client after 2 seconds before the | |
// 5-second chunk is sent. | |
setTimeout(function(){ | |
html = '<h5>This is a chunked response after 2 seconds. Should be displayed before 5-second chunk arrives.</h5>' | |
response.write(html); | |
}, 2000); | |
}).listen(process.env.VMC_APP_PORT || 1337, null); |
Is this really chunked transfer encoding implemented properly? Where do you actually encode the data you are writing on the response? Are you assuming that Node.js does the chunked encoding for you down the line? With chunked transfer encoding, each chunk should be preceded by its size in hexadecimal format, and the last chunk is a zero-size chunk. I don't see any encoding in your gist, so I am assuming that you are expecting Node.js to do the actual encoding for you? Without encoding this is just a response that is terminated with a connection close event by server (which is valid HTTP/1.1 but negates the value of keep-alive feature).
Node.js IS encoding the chunked transfer, thats the whole point of the internal http
module. If you set the header to Transfer-Encoding: chunked
then the http
outgoing handler checks for it and applies the proper hexadecimal length and new line terminators for each write.
I even went to go find you exactly where it's doing it in the Node.ja offficial repository:
https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js#L642-L728
@m44-io, got it. It's been a while I wrote my inquiry, but thank you for your explanation.
Is this really chunked transfer encoding implemented properly? Where do you actually encode the data you are writing on the response? Are you assuming that Node.js does the chunked encoding for you down the line? With chunked transfer encoding, each chunk should be preceded by its size in hexadecimal format, and the last chunk is a zero-size chunk. I don't see any encoding in your gist, so I am assuming that you are expecting Node.js to do the actual encoding for you? Without encoding this is just a response that is terminated with a connection close event by server (which is valid HTTP/1.1 but negates the value of keep-alive feature).