* luci/httpd: Handle timeouts on socket writes correctly

This commit is contained in:
Steven Barth 2008-06-29 14:56:33 +00:00
parent b8240f3516
commit 62c61045d8
2 changed files with 21 additions and 2 deletions

View file

@ -55,6 +55,24 @@ function corecv(socket, ...)
end
end
function cosend(socket, chunk, i, ...)
threadi[socket] = true
i = i or 1
while true do
local stat, err, sent = socket:send(chunk, i, ...)
if err ~= "timeout" then
threadi[socket] = false
return stat, err, sent
else
i = sent and (sent + 1) or 1
end
coroutine.yield()
end
end
function register(socket, s_clhandler, s_errhandler)
table.insert(reading, socket)
clhandler[socket] = s_clhandler

View file

@ -111,7 +111,8 @@ function Server.process( self, client )
-- Setup sockets and sources
local thread = {
receive = function(self, ...) return luci.httpd.corecv(client, ...) end
receive = function(self, ...) return luci.httpd.corecv(client, ...) end,
send = function(self, ...) return luci.httpd.cosend(client, ...) end
}
client:settimeout( 0 )
@ -206,7 +207,7 @@ function Server.process( self, client )
end
local sinkout = socket.sink(sinkmode, client)
local sinkout = socket.sink(sinkmode, thread)
local header =
message.env.SERVER_PROTOCOL .. " " ..