mutating func readChannelOpenMessage()

in Sources/NIOSSH/SSHMessages.swift [829:888]


    mutating func readChannelOpenMessage() throws -> SSHMessage.ChannelOpenMessage? {
        try self.rewindOnNilOrError { `self` in
            guard
                let typeRawValue = self.readSSHStringAsString(),
                let senderChannel: UInt32 = self.readInteger(),
                let initialWindowSize: UInt32 = self.readInteger(),
                let maximumPacketSize: UInt32 = self.readInteger()
            else {
                return nil
            }

            let type: SSHMessage.ChannelOpenMessage.ChannelType

            switch typeRawValue {
            case "session":
                type = .session

            case "forwarded-tcpip":
                guard
                    let hostListening = self.readSSHStringAsString(),
                    let portListening = self.readInteger(as: UInt32.self),
                    let originatorIP = self.readSSHStringAsString(),
                    let originatorPort = self.readInteger(as: UInt32.self)
                else {
                    return nil
                }

                guard portListening <= UInt16.max, originatorPort <= UInt16.max else {
                    throw NIOSSHError.unknownPacketType(diagnostic: "Invalid port values: \(portListening) \(originatorPort)")
                }

                let originator = try SocketAddress(ipAddress: originatorIP, port: Int(originatorPort))

                type = .forwardedTCPIP(.init(hostListening: hostListening, portListening: UInt16(portListening), originatorAddress: originator))

            case "direct-tcpip":
                guard
                    let hostToConnectTo = self.readSSHStringAsString(),
                    let portToConnectTo = self.readInteger(as: UInt32.self),
                    let originatorIP = self.readSSHStringAsString(),
                    let originatorPort = self.readInteger(as: UInt32.self)
                else {
                    return nil
                }

                guard portToConnectTo <= UInt16.max, originatorPort <= UInt16.max else {
                    throw NIOSSHError.unknownPacketType(diagnostic: "Invalid port values: \(portToConnectTo) \(originatorPort)")
                }

                let originator = try SocketAddress(ipAddress: originatorIP, port: Int(originatorPort))

                type = .directTCPIP(.init(hostToConnectTo: hostToConnectTo, portToConnectTo: UInt16(portToConnectTo), originatorAddress: originator))

            default:
                throw NIOSSHError.unknownPacketType(diagnostic: "Channel request with \(typeRawValue)")
            }

            return SSHMessage.ChannelOpenMessage(type: type, senderChannel: senderChannel, initialWindowSize: initialWindowSize, maximumPacketSize: maximumPacketSize)
        }
    }