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.

Reply via email to