diff --git a/Gemini/AppDelegate.swift b/Gemini/AppDelegate.swift index 08c2dbc..8d35f0b 100644 --- a/Gemini/AppDelegate.swift +++ b/Gemini/AppDelegate.swift @@ -58,10 +58,15 @@ extension AppDelegate: GeminiConnectionDelegate { print("!! Meta: '\(header.meta)'") } if let data = data { - print(String(data: data, encoding: .utf8)!) + print("Received: \(data)") + print(String(data: data, encoding: .utf8)!.debugDescription) } } + func connection(_ connection: GeminiConnection, handleError error: GeminiConnection.Error) { + print("!! connection error: \(error)") + } + func connectionCompleted(_ connection: GeminiConnection) { print("!! completed") } diff --git a/GeminiProtocol/GeminiConnection.swift b/GeminiProtocol/GeminiConnection.swift index eae02af..f30f600 100644 --- a/GeminiProtocol/GeminiConnection.swift +++ b/GeminiProtocol/GeminiConnection.swift @@ -11,11 +11,14 @@ import Network public protocol GeminiConnectionDelegate: class { func connectionReady(_ connection: GeminiConnection) func connection(_ connection: GeminiConnection, receivedData data: Data?, header: GeminiResponseHeader) + func connection(_ connection: GeminiConnection, handleError error: GeminiConnection.Error) func connectionCompleted(_ connection: GeminiConnection) } public class GeminiConnection { + public typealias Error = NWError + public weak var delegate: GeminiConnectionDelegate? private var connection: NWConnection? @@ -63,40 +66,22 @@ public class GeminiConnection { private func receiveNextMessage() { guard let connection = connection else { return } - // todo: should this really be .max - connection.receive(minimumIncompleteLength: 1, maximumLength: 65536) { (data, context, isComplete, error) in - // todo: handle error - if let message = context?.protocolMetadata(definition: GeminiProtocol.definition) as? NWProtocolFramer.Message, + connection.receiveMessage { (data, context, isComplete, error) in + if let error = error { + self.delegate?.connection(self, handleError: error) + } else if let message = context?.protocolMetadata(definition: GeminiProtocol.definition) as? NWProtocolFramer.Message, let header = message.geminiResponseHeader, let delegate = self.delegate { delegate.connection(self, receivedData: data, header: header) - self.receiveNextMessage() } + if isComplete { self.delegate?.connectionCompleted(self) - self.report.collect(queue: .main) { (report) in - print(report.debugDescription) - } -// connection.cancel() + connection.cancel() + } else { + self.receiveNextMessage() } } -// connection.receiveMessage { (data, context, isComplete, error) in -// if let message = context?.protocolMetadata(definition: GeminiProtocol.definition) as? NWProtocolFramer.Message, -// let header = message.geminiResponseHeader, -// let delegate = self.delegate { -//// let response = GeminiResponse(status: header.status, meta: header.meta, body: data) -// delegate.connection(self, receivedData: data, header: header) -// } -// // todo: error handling -// if let error = error { -// print(error) -// } else if isComplete { -// self.delegate?.connectionCompleted(self) -// connection.cancel() -// } else { -// self.receiveNextMessage() -// } -// } } } diff --git a/GeminiProtocol/GeminiProtocol.swift b/GeminiProtocol/GeminiProtocol.swift index ad89553..c4274da 100644 --- a/GeminiProtocol/GeminiProtocol.swift +++ b/GeminiProtocol/GeminiProtocol.swift @@ -73,8 +73,7 @@ class GeminiProtocol: NWProtocolFramerImplementation { let header = GeminiResponseHeader(status: statusCode, meta: meta) let message = NWProtocolFramer.Message(geminiResponseHeader: header) - if !framer.deliverInputNoCopy(length: 2 + 1 + meta.utf8.count + 2, message: message, isComplete: true) { - // todo: why return zero here? + if !framer.deliverInputNoCopy(length: .max, message: message, isComplete: true) { return 0 } }