Browse Source

Improve Connection Close handling

close connection on coroutine errors and improve logging around closieg
connections.
Release memory warlier
Gregor 7 years ago
parent
commit
e4d829b6c9
1 changed files with 19 additions and 2 deletions
  1. 19 2
      httpserver.lua

+ 19 - 2
httpserver.lua

@@ -31,15 +31,23 @@ return function (port)
                fileServeFunction(bufferedConnection, req, args)
                -- The bufferedConnection may still hold some data that hasn't been sent. Flush it before closing.
                if not bufferedConnection:flush() then
+                  log(connection, "closing connetion", "no (more) data")
                   connection:close()
                   connectionThread = nil
+                  collectgarbage()
                end
             end)
 
             local BufferedConnectionClass = dofile("httpserver-connection.lc")
             local bufferedConnection = BufferedConnectionClass:new(connection)
             local status, err = coroutine.resume(connectionThread, fileServeFunction, bufferedConnection, req, args)
-            if not status then log(connection, "Error: "..err) end
+            if not status then
+               log(connection, "Error: "..err)
+               log(connection, "closing connetion", "error")
+               connection:close()
+               connectionThread = nil
+               collectgarbage()
+            end
          end
 
          local function handleRequest(connection, req)
@@ -139,16 +147,25 @@ return function (port)
                if connectionThreadStatus == "suspended" then
                   -- Not finished sending file, resume.
                   local status, err = coroutine.resume(connectionThread)
-                  if not status then log(connection:getpeer(), "Error: " .. err) end
+                  if not status then
+                     log(connection, "Error: "..err)
+                     log(connection, "closing connetion", "error")
+                     connection:close()
+                     connectionThread = nil
+                     collectgarbage()
+                  end
                elseif connectionThreadStatus == "dead" then
                   -- We're done sending file.
+                  log(connection, "closing connetion","thread is dead")
                   connection:close()
                   connectionThread = nil
+                  collectgarbage()
                end
             end
          end
 
          local function onDisconnect(connection, payload)
+            print("disconnected")
             if connectionThread then
                connectionThread = nil
                collectgarbage()