If it helps any ive traced the events as generated by both node and luvit:
//Node code //luvit code
response: pipe response: pipe
readable: resume readable: resume
readable: open readable: open
readable: data readable: data
readable: pause readable: pause
response: drain response: drain(r)
... ...
readable: data readable: data
readable: pause readable: pause
response: drain response: drain(r)
readable: readable readable: readable
readable: end readable: end
response: prefinish response: prefinish
response: finish response: finish
response: unpipe response: unpipe
readable: close response: end
response: end(r) <-- disregard as it belongs to the previous
emit('end'...) call
response: end(r) <-- Happens when i Ctrl-C the wget process - this is
generated by the underlying socket
response: close(r) <-- " " " " " "
using the following code:
Lua:
local http = require('http')
local fs = require('fs')
local path = require('path')
local function interceptEmit(stream, logString)
local oldEmit = stream.emit
stream.emit = function(self, type, ...)
print(logString .. type)
return oldEmit(self, type, ...)
end
end
local server = http.createServer(function (req, res)
local f = fs.createReadStream('somefile.txt')
interceptEmit(f, 'readable: ')
interceptEmit(res, 'response: ')
--The following have been pre-bound in ServerResponse
res:on('close', function() print('response: close(r)')end)
res:on('drain', function() print('response: drain(r)')end)
res:on('end', function() print('response: end(r)')end)
f:pipe(res)
end):listen(1337, function()
print('Server running 1337')
end)
Javascript (node)
var fs = require('fs'); // file system
var http = require('http');
function interceptEmit(stream, stamp){
var emit = stream.emit;
stream.emit = function(){
console.log(stamp, arguments[0]);
return emit.apply(stream, arguments);
}
}
var server = http.createServer(function (req, res) {
var rstream = fs.createReadStream('somefile.txt');
interceptEmit(rstream, 'readable: ');
interceptEmit(res, 'response: ');
rstream.pipe(res);
});
server.listen(8000, function(){
console.log('listening on port 8000');
});
On Saturday, 22 August 2015 22:48:27 UTC+8, alfred wrote:
>
> The following code does not close the response, as it should for a chunked
> response.
>
> local http = require('http')
> local fs = require('fs')
>
> local server = http.createServer(function (req, res)
> local f = fs.createReadStream('somefile.txt')
> -- f:on('end', function()res:finish()end)
> res:setHeader("Content-Type", "application/octet-stream")
> f:pipe(res)
> end):listen(1337, function()
> print('Server running on 1337')
> end)
>
> The equivalent code works in nodejs.
>
> To test I used:
> wget -o /dev/null http://localhost:1337
>
> The response object is emitting events "finish", "unpipe" and "end" after
> the readstream's "end" event.
> But the http "transaction" is not terminated.
>
> I'd give this a go but I thought I'd better ask if this is a known problem?
> if not, do you have a suggestion as to where it might be?
>
>
> Workaround is uncomment the line with "f:on('end'..."
>
>
--
You received this message because you are subscribed to the Google Groups
"luvit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.