diff --git a/examples/simpleweb.lua b/examples/simpleweb.lua index 4bb175d0..6e6e6438 100644 --- a/examples/simpleweb.lua +++ b/examples/simpleweb.lua @@ -8,6 +8,14 @@ local mode = ... if mode == "agent" then +local function response(id, ...) + local ok, err = httpd.write_response(sockethelper.writefunc(id), ...) + if not ok then + -- if err == sockethelper.socket_error , that means socket closed. + skynet.error(string.format("fd = %d, %s", id, err)) + end +end + skynet.start(function() skynet.dispatch("lua", function (_,_,id) socket.start(id) @@ -15,7 +23,7 @@ skynet.start(function() local code, url, method, header, body = httpd.read_request(sockethelper.readfunc(id), 8192) if code then if code ~= 200 then - httpd.write_response(sockethelper.writefunc(id), code) + response(id, code) else local tmp = {} if header.host then @@ -29,8 +37,7 @@ skynet.start(function() table.insert(tmp, string.format("query: %s= %s", k,v)) end end - - httpd.write_response(sockethelper.writefunc(id), code , table.concat(tmp,"\n")) + response(id, code, table.concat(tmp,"\n")) end else if url == sockethelper.socket_error then diff --git a/lualib/http/httpd.lua b/lualib/http/httpd.lua index 3698bf00..1fe507de 100644 --- a/lualib/http/httpd.lua +++ b/lualib/http/httpd.lua @@ -227,8 +227,8 @@ local function readall(readbytes, bodylimit) return 200, url, method, header, body end -function httpd.read_request(readbytes, bodylimit) - local ok, code, url, method, header, body = pcall(readall, readbytes, bodylimit) +function httpd.read_request(...) + local ok, code, url, method, header, body = pcall(readall, ...) if ok then return code, url, method, header, body else @@ -236,7 +236,7 @@ function httpd.read_request(readbytes, bodylimit) end end -function httpd.write_response(writefunc, statuscode, bodyfunc, header) +local function writeall(writefunc, statuscode, bodyfunc, header) local statusline = string.format("HTTP/1.1 %03d %s\r\n", statuscode, http_status_msg[statuscode] or "") writefunc(statusline) if header then @@ -267,4 +267,8 @@ function httpd.write_response(writefunc, statuscode, bodyfunc, header) end end +function httpd.write_response(...) + return pcall(writeall, ...) +end + return httpd diff --git a/lualib/http/sockethelper.lua b/lualib/http/sockethelper.lua index 14668c8b..89c7ec93 100644 --- a/lualib/http/sockethelper.lua +++ b/lualib/http/sockethelper.lua @@ -4,7 +4,7 @@ local readbytes = socket.read local writebytes = socket.write local sockethelper = {} -local socket_error = {} +local socket_error = setmetatable({} , { __tostring = function() return "[Socket Error]" end }) sockethelper.socket_error = socket_error @@ -28,4 +28,4 @@ function sockethelper.writefunc(fd) end end -return sockethelper \ No newline at end of file +return sockethelper