diff --git a/Package.resolved b/Package.resolved index 1882b84..f0ca62b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,13 +1,13 @@ { - "originHash" : "b9c18f2e4b8931147b1597352bc90fd7fe0722787786324795b04587c0e043c4", + "originHash" : "9a4c382199c7431879a090851af1c5c8163bad517a2227c837b67d0e8fd75f28", "pins" : [ { "identity" : "async-http-client", "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "291438696abdd48d2a83b52465c176efbd94512b", - "version" : "1.20.1" + "revision" : "a22083713ee90808d527d0baa290c2fb13ca3096", + "version" : "1.21.1" } }, { @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types", "state" : { - "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", - "version" : "1.0.3" + "revision" : "9bee2fdb79cc740081abd8ebd80738063d632286", + "version" : "1.1.0" } }, { @@ -60,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "fc63f0cf4e55a4597407a9fc95b16a2bc44b4982", - "version" : "2.64.0" + "revision" : "9428f62793696d9a0cc1f26a63f63bb31da0516d", + "version" : "2.66.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "0904bf0feb5122b7e5c3f15db7df0eabe623dd87", - "version" : "1.30.0" + "revision" : "8d8eb609929aee75336a0a3d2417280786265868", + "version" : "1.32.0" } }, { @@ -87,8 +87,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", - "version" : "2.26.0" + "revision" : "2b09805797f21c380f7dc9bedaab3157c5508efb", + "version" : "2.27.0" } }, { @@ -96,8 +96,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "6cbe0ed2b394f21ab0d46b9f0c50c6be964968ce", - "version" : "1.20.1" + "revision" : "38ac8221dd20674682148d6451367f89c2652980", + "version" : "1.21.0" } }, { @@ -114,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", - "version" : "1.2.1" + "revision" : "f9266c85189c2751589a50ea5aec72799797e471", + "version" : "1.3.0" } } ], diff --git a/Package.swift b/Package.swift index b3e8378..77af535 100644 --- a/Package.swift +++ b/Package.swift @@ -7,7 +7,7 @@ let package = Package( .macOS(.v14), ], dependencies: [ - .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.9.0") + .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.21.0") ], targets: [ .executableTarget( diff --git a/Sources/main.swift b/Sources/main.swift index 1d3afec..173e0ea 100644 --- a/Sources/main.swift +++ b/Sources/main.swift @@ -9,52 +9,37 @@ struct Entrypoint { try await example2() try await example3() } - + // MARK: - static func example1() async throws { - - let httpClient = HTTPClient( - eventLoopGroupProvider: .singleton - ) - do { - var request = HTTPClientRequest( - url: "https://httpbin.org/post" - ) - request.method = .POST - request.headers.add(name: "User-Agent", value: "Swift AsyncHTTPClient") - request.body = .bytes(ByteBuffer(string: "Some data")) - - let response = try await httpClient.execute( - request, - timeout: .seconds(5) - ) - - if response.status == .ok { - let contentType = response.headers.first( - name: "content-type" - ) - print("\(contentType ?? "")") - - let contentLength = response.headers.first( - name: "content-length" - ).flatMap(Int.init) - print("\(contentLength ?? -1)") + var request = HTTPClientRequest(url: "https://httpbin.org/post") + request.method = .POST + request.headers.add(name: "User-Agent", value: "Swift AsyncHTTPClient") + request.body = .bytes(ByteBuffer(string: "Some data")) + + let response = try await HTTPClient.shared.execute( + request, + timeout: .seconds(5) + ) - let buffer = try await response.body.collect(upTo: 1024 * 1024) - let rawResponseBody = buffer.getString( - at: 0, - length: buffer.readableBytes - ) - print("\(rawResponseBody ?? "")") - } - } - catch { - print("\(error)") + guard response.status == .ok else { + print("Invalid status code: \(response.status)") + return } + let contentType = response.headers.first(name: "content-type") + print("\(contentType ?? "")") + + let contentLength = response.headers.first( + name: "content-length" + ).flatMap(Int.init) - try await httpClient.shutdown() + print("\(contentLength ?? -1)") + + let buffer = try await response.body.collect(upTo: 1024 * 1024) + let rawResponseBody = String(buffer: buffer) + print("\(rawResponseBody)") } // MARK: - @@ -71,94 +56,73 @@ struct Entrypoint { let json: Input } - let httpClient = HTTPClient( - eventLoopGroupProvider: .singleton + var request = HTTPClientRequest(url: "https://httpbin.org/post") + request.method = .POST + request.headers.add(name: "content-type", value: "application/json") + + let input = Input( + id: 1, + title: "foo", + completed: false ) - do { - var request = HTTPClientRequest( - url: "https://httpbin.org/post" - ) - request.method = .POST - request.headers.add(name: "content-type", value: "application/json") - - let input = Input( - id: 1, - title: "foo", - completed: false - ) - - let encoder = JSONEncoder() - let data = try encoder.encode(input) - let buffer = ByteBuffer(bytes: data) - request.body = .bytes(buffer) - - let response = try await httpClient.execute( - request, - timeout: .seconds(5) - ) - - if response.status == .ok { - if let contentType = response.headers.first( - name: "content-type" - ), contentType.contains("application/json") { - var buffer: ByteBuffer = .init() - for try await var chunk in response.body { - buffer.writeBuffer(&chunk) - } - - let decoder = JSONDecoder() - if let data = buffer.getData(at: 0, length: buffer.readableBytes) { - let output = try decoder.decode(Output.self, from: data) - print(output.json.title) - } - } - - } - else { - print("Invalid status code: \(response.status)") - } + + let encoder = JSONEncoder() + let data = try encoder.encode(input) + request.body = .bytes(.init(bytes: data)) + + let response = try await HTTPClient.shared.execute( + request, + timeout: .seconds(5) + ) + + guard response.status == .ok else { + print("Invalid status code: \(response.status)") + return + } + guard + let contentType = response.headers.first(name: "content-type"), + contentType.contains("application/json") + else { + print("Invalid content type.") + return } - catch { - print("\(error)") + + var buffer: ByteBuffer = .init() + for try await var chunk in response.body { + buffer.writeBuffer(&chunk) } - try await httpClient.shutdown() + let decoder = JSONDecoder() + let output = try decoder.decode(Output.self, from: buffer) + print(output.json.title) } // MARK: - static func example3() async throws { - let httpClient = HTTPClient( - eventLoopGroupProvider: .singleton + let delegate = try FileDownloadDelegate( + path: NSTemporaryDirectory() + "600x400.png", + reportProgress: { + if let totalBytes = $0.totalBytes { + print("Total: \(totalBytes).") + } + print("Downloaded: \($0.receivedBytes).") + } ) - do { - let delegate = try FileDownloadDelegate( - path: NSTemporaryDirectory() + "600x400.png", - reportProgress: { - if let totalBytes = $0.totalBytes { - print("Total: \(totalBytes).") - } - print("Downloaded: \($0.receivedBytes).") - } - ) - - let fileDownloadResponse = try await httpClient.execute( - request: .init( - url: "https://placehold.co/600x400.png" - ), - delegate: delegate - ).futureResult.get() - - print(fileDownloadResponse) - } - catch { - print("\(error)") - } + let fileDownloadResponse = try await HTTPClient.shared.execute( + request: .init(url: "https://placehold.co/600x400.png"), + delegate: delegate + ).futureResult.get() - try await httpClient.shutdown() + print(fileDownloadResponse) } } -try await Entrypoint.main() +do { + try await Entrypoint.main() +} +catch { + fatalError("\(error)") +}