From 9989790661c283384db688657af22bb37c842bc3 Mon Sep 17 00:00:00 2001 From: Robin Goos Date: Sun, 28 Mar 2021 12:34:28 +0200 Subject: [PATCH] patches some memory leaks for new connections --- Sources/DefaultHTTPServer.swift | 2 +- Sources/HTTPConnection.swift | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Sources/DefaultHTTPServer.swift b/Sources/DefaultHTTPServer.swift index e649564..1d0ac51 100644 --- a/Sources/DefaultHTTPServer.swift +++ b/Sources/DefaultHTTPServer.swift @@ -95,7 +95,7 @@ public final class DefaultHTTPServer: HTTPServer { logger: logger ) connections.insert(connection) - connection.closedCallback = { [unowned self] in + connection.closedCallback = { [unowned self, unowned connection] in self.connections.remove(connection) } logger.info("New connection \(connection.uuid) from [\(address)]:\(port)") diff --git a/Sources/HTTPConnection.swift b/Sources/HTTPConnection.swift index 214512a..55a89ab 100644 --- a/Sources/HTTPConnection.swift +++ b/Sources/HTTPConnection.swift @@ -58,14 +58,18 @@ public final class HTTPConnection { self.eventLoop = eventLoop self.closedCallback = closedCallback - transport.readDataCallback = handleDataReceived - transport.closedCallback = handleConnectionClosed + transport.readDataCallback = { [unowned self] data in + self.handleDataReceived(data) + } + transport.closedCallback = { [unowned self] reason in + self.handleConnectionClosed(reason) + } let propagateHandler = PropagateLogHandler(logger: logger) let contextHandler = TransformLogHandler( handler: propagateHandler ) { [unowned self] record in - return record.overwriteMessage { [unowned self] in"[\(self.uuid)] \($0.message)" } + return record.overwriteMessage { [unowned self] in "[\(self.uuid)] \($0.message)" } } self.logger.add(handler: contextHandler) } @@ -133,7 +137,9 @@ public final class HTTPConnection { // set SWSGI keys environ["swsgi.version"] = "0.1" environ["swsgi.url_scheme"] = "http" - environ["swsgi.input"] = swsgiInput + environ["swsgi.input"] = { [unowned self] (handler: ((Data) -> Void)?) in + self.swsgiInput(handler) + } // TODO: add output file for error environ["swsgi.error"] = "" environ["swsgi.multithread"] = false