From c29812e62855d34d32305e1dc06d2f1df5224df7 Mon Sep 17 00:00:00 2001 From: David Jones Date: Fri, 3 Nov 2017 17:48:51 +0000 Subject: [PATCH] Prevent collision on HTTPParser state by consecutive keepalive requests (#227) --- Sources/KituraNet/HTTP/HTTPServerResponse.swift | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Sources/KituraNet/HTTP/HTTPServerResponse.swift b/Sources/KituraNet/HTTP/HTTPServerResponse.swift index 7ae0771..617331a 100644 --- a/Sources/KituraNet/HTTP/HTTPServerResponse.swift +++ b/Sources/KituraNet/HTTP/HTTPServerResponse.swift @@ -107,23 +107,22 @@ public class HTTPServerResponse : ServerResponse { public func end() throws { if let processor = processor { try flushStart() - - let keepAlive = processor.isKeepAlive - - if keepAlive { - processor.keepAlive() - } - if buffer.length > 0 { processor.write(from: buffer) } - + let keepAlive = processor.isKeepAlive if !keepAlive && !processor.isUpgrade { processor.close() } if let request = request { Monitor.delegate?.finished(request: request, response: self) } + // Ordering is important here. Keepalive allows the processor to continue + // processing further requests, so must only be called once monitoring + // has completed, as the HTTPParser for this connection is reused. + if keepAlive { + processor.keepAlive() + } } }