Description
- Version: v4.4.0
- Platform:
Linux robin-master 3.19.0-15-generic #15-Ubuntu SMP Thu Apr 16 23:32:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
- Subsystem: http
Long client requests ends successfully if data transfer closed for some reason, for example if server lost connectivity or suddenly fall.
For example I have one client Node.js app which make request to server Node.js app to receive a lot of chunks of data. Data transfer lasts for several time and server app falls before request completion.
I expect to get some error on client side to inform me that transfer was not successfully ended, but emits end
event instead of error
. So I have a situation when I receive only part of data but don't know about it and think that request successfully ended.
Example server send parts of JSON object for ~2 seconds. For test purpose I run following shell command:
timeout 1s node server.js & node client.js
Because data transfer lasts 2 seconds client app receive only part of data but ends with emit end
handler without any error. May be problem on clientRequest
part of Node.js cause the same trick with curl
as client side return (18) transfer closed
error.
Example of client app:
var http = require('http');
var makeRequest = function() {
var req = http.request({
host: '127.0.0.1',
port: 8080,
method: 'POST',
}, function(res) {
var data = '';
res.on('data', function(chank) {
data += chank;
});
res.on('end', function() {
console.log('data', data);
console.log('succesfull end');
});
res.on('error', function(err) {
console.error(err);
});
});
req.on('error', function(err) {
console.error(err);
});
req.write('');
req.end();
};
setTimeout(makeRequest, 100);
Example of server app
var http = require('http');
var server = http.createServer();
server.on('request', function (req, res) {
res.write('{"result":[{"some": "object"}');
// it must send data pieces for ~2 sec (20*100 ms = 2000 ms)
var times = 20;
var delay = 100;
var counter = 0;
var timerId = setInterval(function() {
res.write(',{"some": "object"}');
counter++;
if (counter >= times) {
res.write(',{"some": "object"}');
res.write(']}');
res.end();
clearInterval(timerId);
}
}, delay);
});
var port = 8080;
server.listen(port, function() {
console.log('listen on 127.0.0.1:' + port);
});
Activity