Skip to content

Commit ac2e5ee

Browse files
authored
Use Swift Concurrency for HTTP requests (#5)
* Use Swift Concurrency with `HTTPClient` * Use `self` explicitly for member access * Update `CLSLogHandlerTests` inputs * Clean up some codes accordingly
1 parent dac1dae commit ac2e5ee

File tree

5 files changed

+21
-41
lines changed

5 files changed

+21
-41
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ let package = Package(
1515
dependencies: [
1616
// Dependencies declare other packages that this package depends on.
1717
.package(url: "https://github.com/apple/swift-log.git", from: "1.2.1"),
18-
.package(url: "https://github.com/apple/swift-nio.git", from: "2.0.0"),
1918
.package(url: "https://github.com/apple/swift-protobuf.git", from: "1.21.0"),
2019
.package(url: "https://github.com/swift-server/async-http-client.git", from: "1.0.0"),
21-
.package(url: "https://github.com/teco-project/teco-core.git", .upToNextMinor(from: "0.5.0-beta.2")),
20+
.package(url: "https://github.com/teco-project/teco-core.git", .upToNextMinor(from: "0.5.0-beta.4")),
2221
],
2322
targets: [
2423
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
@@ -37,7 +36,6 @@ let package = Package(
3736
name: "TecoCLSLoggingTests",
3837
dependencies: [
3938
"TecoCLSLogging",
40-
.product(name: "NIOFoundationCompat", package: "swift-nio"),
4139
]),
4240
]
4341
)

Sources/TecoCLSLogging/CLS+init.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22
import Logging
33

44
extension Cls_LogGroup {
5-
init(_ level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata, source: String, file: String, function: String, line: UInt, date: Date = Date()) {
5+
init(_ level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata = [:], source: String, file: String, function: String, line: UInt, date: Date = Date()) {
66
self = Self.with {
77
$0.source = source
88
$0.filename = file

Sources/TecoCLSLogging/CLSLogHandler.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,33 @@ public struct CLSLogHandler: LogHandler {
2626

2727
public subscript(metadataKey key: String) -> Logger.Metadata.Value? {
2828
get {
29-
metadata[key]
29+
self.metadata[key]
3030
}
3131
set {
32-
metadata[key] = newValue
32+
self.metadata[key] = newValue
3333
}
3434
}
3535

3636
public func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, source: String, file: String, function: String, line: UInt) {
37-
let metadata = resolveMetadata(metadata)
37+
let metadata = self.resolveMetadata(metadata)
3838
let log = Cls_LogGroup(level, message: message, metadata: metadata, source: source, file: file, function: function, line: line)
3939
precondition(log.isInitialized)
4040
if let request = try? self.uploadLogRequest(log, credential: self.credentialProvider()) {
41-
_ = try? self.client.execute(request: request).wait()
41+
Task.detached {
42+
try await self.client.execute(request, timeout: .seconds(3))
43+
}
4244
}
4345
}
4446

4547
// MARK: Internal implemenation
4648

4749
func resolveMetadata(_ metadata: Logger.Metadata?) -> Logger.Metadata {
48-
return (metadataProvider?.get() ?? [:])
50+
return (self.metadataProvider?.get() ?? [:])
4951
.merging(self.metadata, uniquingKeysWith: { $1 })
5052
.merging(metadata ?? [:], uniquingKeysWith: { $1 })
5153
}
5254

53-
func uploadLogRequest(_ logGroup: Cls_LogGroup, credential: Credential, date: Date = Date(), signing: TCSigner.SigningMode = .default) throws -> HTTPClient.Request {
55+
func uploadLogRequest(_ logGroup: Cls_LogGroup, credential: Credential, date: Date = Date(), signing: TCSigner.SigningMode = .default) throws -> HTTPClientRequest {
5456
let logGroupList = Cls_LogGroupList.with {
5557
$0.logGroupList = [logGroup]
5658
}
@@ -59,12 +61,9 @@ public struct CLSLogHandler: LogHandler {
5961
let signer = TCSigner(credential: credential, service: "cls")
6062
let data = try logGroupList.serializedData()
6163

62-
var request = try HTTPClient.Request(
63-
url: "https://cls.tencentcloudapi.com",
64-
method: .POST,
65-
body: .data(data)
66-
)
67-
request.headers = signer.signHeaders(
64+
var request = HTTPClientRequest(url: "https://cls.tencentcloudapi.com")
65+
request.method = .POST
66+
request.headers = try signer.signHeaders(
6867
url: request.url,
6968
method: request.method,
7069
headers: [
@@ -78,6 +77,7 @@ public struct CLSLogHandler: LogHandler {
7877
mode: signing,
7978
date: date
8079
)
80+
request.body = .bytes(data)
8181

8282
return request
8383
}

Tests/TecoCLSLoggingTests/CLSLogHandlerTests.swift

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,22 @@ import XCTest
22
@testable import TecoCLSLogging
33
import AsyncHTTPClient
44
import Logging
5-
import NIOFoundationCompat
65
import TecoSigner
76

87
final class CLSLogHandlerTests: XCTestCase {
98
func testLogGroup() throws {
10-
let data = Data([10, 105, 8, 128, 148, 235, 220, 3, 18, 14, 10, 5, 108, 101, 118, 101, 108, 18, 5, 68, 69, 66, 85, 71, 18, 26, 10, 7, 109, 101, 115, 115, 97, 103, 101, 18, 15, 84, 101, 115, 116, 32, 108, 111, 103, 32, 103, 114, 111, 117, 112, 46, 18, 13, 10, 8, 116, 101, 115, 116, 45, 115, 101, 113, 18, 1, 49, 18, 26, 10, 8, 102, 117, 110, 99, 116, 105, 111, 110, 18, 14, 116, 101, 115, 116, 76, 111, 103, 71, 114, 111, 117, 112, 40, 41, 18, 10, 10, 4, 108, 105, 110, 101, 18, 2, 49, 48, 26, 44, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115, 47, 67, 76, 83, 76, 111, 103, 72, 97, 110, 100, 108, 101, 114, 84, 101, 115, 116, 115, 46, 115, 119, 105, 102, 116, 34, 19, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115])
9+
let data = Data([10, 104, 8, 128, 148, 235, 220, 3, 18, 14, 10, 5, 108, 101, 118, 101, 108, 18, 5, 68, 69, 66, 85, 71, 18, 26, 10, 7, 109, 101, 115, 115, 97, 103, 101, 18, 15, 84, 101, 115, 116, 32, 108, 111, 103, 32, 103, 114, 111, 117, 112, 46, 18, 13, 10, 8, 116, 101, 115, 116, 45, 115, 101, 113, 18, 1, 49, 18, 26, 10, 8, 102, 117, 110, 99, 116, 105, 111, 110, 18, 14, 116, 101, 115, 116, 76, 111, 103, 71, 114, 111, 117, 112, 40, 41, 18, 9, 10, 4, 108, 105, 110, 101, 18, 1, 49, 26, 44, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115, 47, 67, 76, 83, 76, 111, 103, 72, 97, 110, 100, 108, 101, 114, 84, 101, 115, 116, 115, 46, 115, 119, 105, 102, 116, 34, 19, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115])
1110
let logGroup = Cls_LogGroup(
1211
.debug,
1312
message: "Test log group.",
1413
metadata: ["test-seq": "1"],
1514
source: "TecoCLSLoggingTests",
1615
file: "TecoCLSLoggingTests/CLSLogHandlerTests.swift",
1716
function: "testLogGroup()",
18-
line: 10,
17+
line: 1,
1918
date: Date(timeIntervalSince1970: 1_000_000_000)
2019
)
21-
XCTAssertEqual(data, try logGroup.serializedData())
20+
XCTAssertEqual(try logGroup.serializedData(), data)
2221
}
2322

2423
func testResolveMetadata() throws {
@@ -76,11 +75,10 @@ final class CLSLogHandlerTests: XCTestCase {
7675
let logGroup = Cls_LogGroup(
7776
.info,
7877
message: "Test upload request.",
79-
metadata: ["test-seq": "2"],
8078
source: "TecoCLSLoggingTests",
8179
file: "TecoCLSLoggingTests/CLSLogHandlerTests.swift",
8280
function: "testUploadRequest()",
83-
line: 35,
81+
line: 1,
8482
date: date
8583
)
8684

@@ -92,22 +90,6 @@ final class CLSLogHandlerTests: XCTestCase {
9290
// test with minimal signing here in case new headers are added
9391
let request = try logger.uploadLogRequest(logGroup, credential: credential, date: date, signing: .minimal)
9492
XCTAssertEqual(request.method, .POST)
95-
XCTAssertEqual(request.host, "cls.tencentcloudapi.com")
96-
97-
// assert request body data
98-
let data = Data([10, 183, 1, 10, 114, 8, 128, 148, 235, 220, 3, 18, 13, 10, 5, 108, 101, 118, 101, 108, 18, 4, 73, 78, 70, 79, 18, 31, 10, 7, 109, 101, 115, 115, 97, 103, 101, 18, 20, 84, 101, 115, 116, 32, 117, 112, 108, 111, 97, 100, 32, 114, 101, 113, 117, 101, 115, 116, 46, 18, 13, 10, 8, 116, 101, 115, 116, 45, 115, 101, 113, 18, 1, 50, 18, 31, 10, 8, 102, 117, 110, 99, 116, 105, 111, 110, 18, 19, 116, 101, 115, 116, 85, 112, 108, 111, 97, 100, 82, 101, 113, 117, 101, 115, 116, 40, 41, 18, 10, 10, 4, 108, 105, 110, 101, 18, 2, 51, 53, 26, 44, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115, 47, 67, 76, 83, 76, 111, 103, 72, 97, 110, 100, 108, 101, 114, 84, 101, 115, 116, 115, 46, 115, 119, 105, 102, 116, 34, 19, 84, 101, 99, 111, 67, 76, 83, 76, 111, 103, 103, 105, 110, 103, 84, 101, 115, 116, 115])
99-
let body = try XCTUnwrap(request.body)
100-
let tester = HTTPClient.Body.StreamWriter {
101-
switch $0 {
102-
case .byteBuffer(let byteBuffer):
103-
let payload = byteBuffer.getData(at: 0, length: byteBuffer.readableBytes)
104-
XCTAssertEqual(payload, data)
105-
default:
106-
XCTFail("Unexpectedly find file stream.")
107-
}
108-
return logger.client.eventLoopGroup.next().makeSucceededVoidFuture()
109-
}
110-
try body.stream(tester).wait()
11193

11294
// assert request headers
11395
XCTAssertEqual(request.headers.first(name: "content-type"), "application/octet-stream")
@@ -118,7 +100,7 @@ final class CLSLogHandlerTests: XCTestCase {
118100
XCTAssertEqual(request.headers.first(name: "x-tc-region"), "ap-guangzhou")
119101
XCTAssertEqual(
120102
request.headers.first(name: "authorization"),
121-
"TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE/2001-09-09/cls/tc3_request, SignedHeaders=content-type;host, Signature=1249e1b231a7a1c5d840c2c36d5e832a20671ab370256120fb6c1c9d26d28d12"
103+
"TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE/2001-09-09/cls/tc3_request, SignedHeaders=content-type;host, Signature=4650f896956144eae9f5bafbd14f8ad6c62dea02ea297d280658468fb3cac765"
122104
)
123105
}
124106
}

0 commit comments

Comments
 (0)