mutating func readChannelRequestMessage()

in Sources/NIOSSH/SSHMessages.swift [985:1083]


    mutating func readChannelRequestMessage() throws -> SSHMessage.ChannelRequestMessage? {
        try self.rewindOnNilOrError { `self` in
            guard
                let recipientChannel: UInt32 = self.readInteger(),
                let typeRawValue = self.readSSHStringAsString()
            else {
                return nil
            }

            guard let wantReply = self.readSSHBoolean() else {
                return nil
            }

            let type: SSHMessage.ChannelRequestMessage.RequestType
            switch typeRawValue {
            case "exec":
                guard let command = self.readSSHStringAsString() else {
                    return nil
                }
                type = .exec(command)
            case "exit-status":
                guard let status: UInt32 = self.readInteger() else {
                    return nil
                }
                type = .exitStatus(status)
            case "env":
                guard
                    let name = self.readSSHStringAsString(),
                    let value = self.readSSHStringAsString()
                else {
                    return nil
                }

                type = .env(name, value)
            case "exit-signal":
                guard
                    let signalName = self.readSSHStringAsString(),
                    let coreDumped = self.readSSHBoolean(),
                    let errorMessage = self.readSSHStringAsString(),
                    let language = self.readSSHStringAsString()
                else {
                    return nil
                }

                type = .exitSignal(signalName, coreDumped, errorMessage, language)
            case "pty-req":
                guard
                    let termVariable = self.readSSHStringAsString(),
                    let termWidth = self.readInteger(as: UInt32.self),
                    let termHeight = self.readInteger(as: UInt32.self),
                    let pixelWidth = self.readInteger(as: UInt32.self),
                    let pixelHeight = self.readInteger(as: UInt32.self),
                    var encodedTerminalModes = self.readSSHString()
                else {
                    return nil
                }

                type = .ptyReq(.init(termVariable: termVariable,
                                     characterWidth: termWidth,
                                     rowHeight: termHeight,
                                     pixelWidth: pixelWidth,
                                     pixelHeight: pixelHeight,
                                     terminalModes: try encodedTerminalModes.readSSHTerminalModes()))
            case "shell":
                type = .shell
            case "subsystem":
                guard let name = self.readSSHStringAsString() else {
                    return nil
                }
                type = .subsystem(name)
            case "window-change":
                guard
                    let termWidth = self.readInteger(as: UInt32.self),
                    let termHeight = self.readInteger(as: UInt32.self),
                    let pixelWidth = self.readInteger(as: UInt32.self),
                    let pixelHeight = self.readInteger(as: UInt32.self)
                else {
                    return nil
                }

                type = .windowChange(.init(characterWidth: termWidth, rowHeight: termHeight, pixelWidth: pixelWidth, pixelHeight: pixelHeight))
            case "xon-xoff":
                guard let clientCanDo = self.readSSHBoolean() else {
                    return nil
                }
                type = .xonXoff(clientCanDo)

            case "signal":
                guard let signalName = self.readSSHStringAsString() else {
                    return nil
                }
                type = .signal(signalName)
            default:
                type = .unknown
            }

            return SSHMessage.ChannelRequestMessage(recipientChannel: recipientChannel, type: type, wantReply: wantReply)
        }
    }