swift-nio-extras/Sources/NIOSOCKS/Messages/MethodSelection.swift
2021-06-07 11:23:13 +01:00

59 lines
1.9 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2021 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIO
/// Used by the SOCKS server to inform the client which
/// authentication method it would like to use out of those
/// offered.
struct MethodSelection: Hashable {
/// The SOCKS protocol version - we currently only support v5.
public let version: UInt8 = 5
/// The server's selected authentication method.
public var method: AuthenticationMethod
/// Creates a new `MethodSelection` wrapping an `AuthenticationMethod`.
/// - parameter method: The selected `AuthenticationMethod`.
public init(method: AuthenticationMethod) {
self.method = method
}
}
extension ByteBuffer {
mutating func readMethodSelection() throws -> MethodSelection? {
return try self.parseUnwindingIfNeeded { buffer in
guard
let version = buffer.readInteger(as: UInt8.self),
let method = buffer.readInteger(as: UInt8.self)
else {
throw MissingBytes()
}
guard version == 0x05 else {
throw SOCKSError.InvalidProtocolVersion(actual: version)
}
return .init(method: .init(value: method))
}
}
@discardableResult mutating func writeMethodSelection(_ method: MethodSelection) -> Int {
return self.writeInteger(method.version) + self.writeInteger(method.method.value)
}
}