-
-
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); |
Hey @kadishmal, i was having some issues getting chunked responses to work and came across your gist. I used it to see if i would get similar results with my own script and they both seem to buffer the response until end is called. Do you know of any changes in node.js that would affect this? have you tested it recently? thanks
@jalleyne, you might want to test using curl
. Even without a Transfer-Encoding
header, it will show the individual chunks as they come in.
One thing which is confusing is the way you ended your html code. How do you know that it is your last chunk? In real time example, if you have a number of async calls to fetch information, you cannot tell which one comes back first. Can suggest a workable solution of closing the html based on the last async call?
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).
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.
The gist illustrates the basic functionality of an
http
server which sends data to a client in chunks using chunked transfer encoding.setTimeout
function was used to imitate the time consuming requests.