Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple Node.js server which responds in chunked transfer encoding
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);
@kadishmal

This comment has been minimized.

Copy link
Owner Author

@kadishmal kadishmal commented Oct 11, 2012

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.

@jalleyne

This comment has been minimized.

Copy link

@jalleyne jalleyne commented Mar 13, 2014

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

@felixrabe

This comment has been minimized.

Copy link

@felixrabe felixrabe commented Jun 11, 2014

@jalleyne, you might want to test using curl. Even without a Transfer-Encoding header, it will show the individual chunks as they come in.

@jerryyanmj

This comment has been minimized.

Copy link

@jerryyanmj jerryyanmj commented Jan 20, 2015

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?

@amn

This comment has been minimized.

Copy link

@amn amn commented May 23, 2017

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).

@m44-io

This comment has been minimized.

Copy link

@m44-io m44-io commented May 30, 2020

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).

@amn

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment