in Sources/NIOTransportServices/NIOTSConnectionChannel.swift [337:405]
func getOption0<Option: ChannelOption>(option: Option) throws -> Option.Value {
self.eventLoop.preconditionInEventLoop()
guard !self.closed else {
throw ChannelError.ioOnClosedChannel
}
switch option {
case _ as ChannelOptions.Types.AutoReadOption:
return self.options.autoRead as! Option.Value
case _ as ChannelOptions.Types.AllowRemoteHalfClosureOption:
return self.options.supportRemoteHalfClosure as! Option.Value
case _ as ChannelOptions.Types.SocketOption:
let optionValue = option as! ChannelOptions.Types.SocketOption
// SO_REUSEADDR and SO_REUSEPORT are handled here.
switch (optionValue.level, optionValue.name) {
case (SOL_SOCKET, SO_REUSEADDR):
return Int32(self.reuseAddress ? 1 : 0) as! Option.Value
case (SOL_SOCKET, SO_REUSEPORT):
return Int32(self.reusePort ? 1 : 0) as! Option.Value
default:
return try self.tcpOptions.valueFor(socketOption: optionValue) as! Option.Value
}
case _ as ChannelOptions.Types.WriteBufferWaterMarkOption:
return self.backpressureManager.waterMarks as! Option.Value
case _ as NIOTSChannelOptions.Types.NIOTSWaitForActivityOption:
return self.options.waitForActivity as! Option.Value
case is NIOTSChannelOptions.Types.NIOTSEnablePeerToPeerOption:
return self.enablePeerToPeer as! Option.Value
case is NIOTSChannelOptions.Types.NIOTSAllowLocalEndpointReuse:
return self.allowLocalEndpointReuse as! Option.Value
case is NIOTSChannelOptions.Types.NIOTSCurrentPathOption:
guard let currentPath = self.nwConnection?.currentPath else {
throw NIOTSErrors.NoCurrentPath()
}
return currentPath as! Option.Value
case is NIOTSChannelOptions.Types.NIOTSMetadataOption:
let optionValue = option as! NIOTSChannelOptions.Types.NIOTSMetadataOption
guard let nwConnection = self.nwConnection else {
throw NIOTSErrors.NoCurrentConnection()
}
return nwConnection.metadata(definition: optionValue.definition) as! Option.Value
default:
// watchOS 6.0 availability is covered by the @available on this extension.
if #available(OSX 10.15, iOS 13.0, tvOS 13.0, *) {
switch option {
case is NIOTSChannelOptions.Types.NIOTSEstablishmentReportOption:
guard let nwConnection = self.nwConnection else {
throw NIOTSErrors.NoCurrentConnection()
}
let promise: EventLoopPromise<NWConnection.EstablishmentReport?> = eventLoop.makePromise()
nwConnection.requestEstablishmentReport(queue: connectionQueue) { report in
promise.succeed(report)
}
return promise.futureResult as! Option.Value
case is NIOTSChannelOptions.Types.NIOTSDataTransferReportOption:
guard let nwConnection = self.nwConnection else {
throw NIOTSErrors.NoCurrentConnection()
}
return nwConnection.startDataTransferReport() as! Option.Value
default:
break
}
}
fatalError("option \(type(of: option)).\(option) not supported")
}
}