in TLSify/Sources/TLSifyLib/TLSProxy.swift [61:114]
func connected(partnerChannel: Channel,
myChannel: Channel,
contextForInitialData: ChannelHandlerContext) {
self.logger.debug("connected to \(partnerChannel)")
let bytes: ByteBuffer
switch self.state {
case .waitingToBeAdded, .connected:
self.illegalTransition()
case .error(let error):
partnerChannel.pipeline.fireErrorCaught(error)
myChannel.pipeline.fireErrorCaught(error)
partnerChannel.close(promise: nil)
return
case .closed:
self.logger.warning("discarding \(partnerChannel) because we're already closed.")
partnerChannel.close(promise: nil)
return
case .connecting(let buffer):
bytes = buffer
self.state = .connected
// fall through
}
var partnerLogger = self.logger
partnerLogger[metadataKey: "side"] = "Proxy <--[TLS]--> Target"
let myGlue = GlueHandler(logger: self.logger)
let partnerGlue = GlueHandler(logger: partnerLogger)
myGlue.partner = partnerGlue
partnerGlue.partner = myGlue
assert(partnerChannel.eventLoop === myChannel.eventLoop)
myChannel.pipeline.addHandler(myGlue, position: .after(contextForInitialData.handler)).flatMap {
partnerChannel.pipeline.handler(type: CloseOnErrorHandler.self)
}.flatMap { errorHandler in
partnerChannel.pipeline.addHandler(partnerGlue)
}.whenFailure { error in
self.gotError(error)
partnerChannel.pipeline.fireErrorCaught(error)
contextForInitialData.fireErrorCaught(error)
}
guard case .connected = self.state else {
return
}
assert(myGlue.context != nil)
assert(partnerGlue.context != nil)
if bytes.readableBytes > 0 {
contextForInitialData.fireChannelRead(self.wrapInboundOut(bytes))
contextForInitialData.fireChannelReadComplete()
}
contextForInitialData.read()
}