util/swift/Sources/AlibabaCloudOSSUtil/VerifyStream.swift (44 lines of code) (raw):
import Foundation
import CryptoSwift
public class VerifyStream: InputStream {
private let inputStream: InputStream
private var map: [String: String]
private let crc64 = CRC64()
private var md5 = MD5()
init(inputStream: InputStream, map: inout [String: String]) {
self.inputStream = inputStream
self.map = map
super.init(data: Data())
}
public override func read(_ buffer: UnsafeMutablePointer<UInt8>, maxLength len: Int) -> Int {
let bytesRead = inputStream.read(buffer, maxLength: len)
if bytesRead > 0 {
crc64.update(Array(UnsafeBufferPointer(start: buffer, count: bytesRead)), len: bytesRead)
let dataChunk = Data(bytes: buffer, count: bytesRead)
_ = try! md5.update(withBytes: Array(dataChunk))
} else if bytesRead == 0 {
map["crc"] = crc64.getValue()
let md5Digest = try! md5.finish()
map["md5"] = Data(md5Digest).base64EncodedString()
}
return bytesRead
}
public override func open() {
inputStream.open()
}
public override func close() {
inputStream.close()
}
func readSingleByte() -> UInt8? {
var buffer: UInt8 = 0
let bytesRead = self.read(&buffer, maxLength: 1)
if bytesRead == 1 {
return buffer
} else {
return 0
}
}
func getResultMap() -> [String: String] {
return self.map
}
}