mirror of
https://github.com/apple/swift-nio-extras.git
synced 2025-05-14 17:02:43 +08:00
59 lines
1.9 KiB
Swift
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)
|
|
}
|
|
|
|
}
|