Skip to content

Commit c2805df

Browse files
authoredJan 14, 2022
Prepare async/await API for public release (#531)
1 parent 6474d8d commit c2805df

10 files changed

+140
-108
lines changed
 

‎Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest+Prepared.swift

+4-6
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@ extension RequestBodyLength {
6363
init(_ body: HTTPClientRequest.Body?) {
6464
switch body?.mode {
6565
case .none:
66-
self = .fixed(length: 0)
66+
self = .known(0)
6767
case .byteBuffer(let buffer):
68-
self = .fixed(length: buffer.readableBytes)
69-
case .sequence(nil, _, _), .asyncSequence(nil, _):
70-
self = .dynamic
71-
case .sequence(.some(let length), _, _), .asyncSequence(.some(let length), _):
72-
self = .fixed(length: length)
68+
self = .known(buffer.readableBytes)
69+
case .sequence(let length, _, _), .asyncSequence(let length, _):
70+
self = length
7371
}
7472
}
7573
}

‎Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest.swift

+48-21
Original file line numberDiff line numberDiff line change
@@ -35,32 +35,37 @@ struct HTTPClientRequest {
3535
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
3636
extension HTTPClientRequest {
3737
struct Body {
38+
@usableFromInline
3839
internal enum Mode {
39-
case asyncSequence(length: Int?, (ByteBufferAllocator) async throws -> ByteBuffer?)
40-
case sequence(length: Int?, canBeConsumedMultipleTimes: Bool, (ByteBufferAllocator) -> ByteBuffer)
40+
case asyncSequence(length: RequestBodyLength, (ByteBufferAllocator) async throws -> ByteBuffer?)
41+
case sequence(length: RequestBodyLength, canBeConsumedMultipleTimes: Bool, (ByteBufferAllocator) -> ByteBuffer)
4142
case byteBuffer(ByteBuffer)
4243
}
4344

44-
var mode: Mode
45+
@usableFromInline
46+
internal var mode: Mode
4547

46-
private init(_ mode: Mode) {
48+
@inlinable
49+
internal init(_ mode: Mode) {
4750
self.mode = mode
4851
}
4952
}
5053
}
5154

5255
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
5356
extension HTTPClientRequest.Body {
54-
static func byteBuffer(_ byteBuffer: ByteBuffer) -> Self {
57+
static func bytes(_ byteBuffer: ByteBuffer) -> Self {
5558
self.init(.byteBuffer(byteBuffer))
5659
}
5760

5861
@inlinable
59-
static func bytes<Bytes: Sequence>(
60-
length: Int?,
62+
static func bytes<Bytes: RandomAccessCollection>(
6163
_ bytes: Bytes
6264
) -> Self where Bytes.Element == UInt8 {
63-
self.init(.sequence(length: length, canBeConsumedMultipleTimes: false) { allocator in
65+
self.init(.sequence(
66+
length: .known(bytes.count),
67+
canBeConsumedMultipleTimes: true
68+
) { allocator in
6469
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) {
6570
// fastpath
6671
return buffer
@@ -71,11 +76,14 @@ extension HTTPClientRequest.Body {
7176
}
7277

7378
@inlinable
74-
static func bytes<Bytes: Collection>(
75-
length: Int?,
76-
_ bytes: Bytes
79+
static func bytes<Bytes: Sequence>(
80+
_ bytes: Bytes,
81+
length: Length
7782
) -> Self where Bytes.Element == UInt8 {
78-
self.init(.sequence(length: length, canBeConsumedMultipleTimes: true) { allocator in
83+
self.init(.sequence(
84+
length: length.storage,
85+
canBeConsumedMultipleTimes: false
86+
) { allocator in
7987
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) {
8088
// fastpath
8189
return buffer
@@ -86,10 +94,14 @@ extension HTTPClientRequest.Body {
8694
}
8795

8896
@inlinable
89-
static func bytes<Bytes: RandomAccessCollection>(
90-
_ bytes: Bytes
97+
static func bytes<Bytes: Collection>(
98+
_ bytes: Bytes,
99+
length: Length
91100
) -> Self where Bytes.Element == UInt8 {
92-
self.init(.sequence(length: bytes.count, canBeConsumedMultipleTimes: true) { allocator in
101+
self.init(.sequence(
102+
length: length.storage,
103+
canBeConsumedMultipleTimes: true
104+
) { allocator in
93105
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) {
94106
// fastpath
95107
return buffer
@@ -101,23 +113,23 @@ extension HTTPClientRequest.Body {
101113

102114
@inlinable
103115
static func stream<SequenceOfBytes: AsyncSequence>(
104-
length: Int?,
105-
_ sequenceOfBytes: SequenceOfBytes
116+
_ sequenceOfBytes: SequenceOfBytes,
117+
length: Length
106118
) -> Self where SequenceOfBytes.Element == ByteBuffer {
107119
var iterator = sequenceOfBytes.makeAsyncIterator()
108-
let body = self.init(.asyncSequence(length: length) { _ -> ByteBuffer? in
120+
let body = self.init(.asyncSequence(length: length.storage) { _ -> ByteBuffer? in
109121
try await iterator.next()
110122
})
111123
return body
112124
}
113125

114126
@inlinable
115127
static func stream<Bytes: AsyncSequence>(
116-
length: Int?,
117-
_ bytes: Bytes
128+
_ bytes: Bytes,
129+
length: Length
118130
) -> Self where Bytes.Element == UInt8 {
119131
var iterator = bytes.makeAsyncIterator()
120-
let body = self.init(.asyncSequence(length: length) { allocator -> ByteBuffer? in
132+
let body = self.init(.asyncSequence(length: length.storage) { allocator -> ByteBuffer? in
121133
var buffer = allocator.buffer(capacity: 1024) // TODO: Magic number
122134
while buffer.writableBytes > 0, let byte = try await iterator.next() {
123135
buffer.writeInteger(byte)
@@ -143,4 +155,19 @@ extension Optional where Wrapped == HTTPClientRequest.Body {
143155
}
144156
}
145157

158+
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
159+
extension HTTPClientRequest.Body {
160+
struct Length {
161+
/// size of the request body is not known before starting the request
162+
static let unknown: Self = .init(storage: .unknown)
163+
/// size of the request body is fixed and exactly `count` bytes
164+
static func known(_ count: Int) -> Self {
165+
.init(storage: .known(count))
166+
}
167+
168+
@usableFromInline
169+
internal var storage: RequestBodyLength
170+
}
171+
}
172+
146173
#endif

‎Sources/AsyncHTTPClient/AsyncAwait/HTTPClientResponse.swift

+5-8
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,22 @@ struct HTTPClientResponse {
4848

4949
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
5050
extension HTTPClientResponse.Body: AsyncSequence {
51-
typealias Element = ByteBuffer
52-
typealias AsyncIterator = Iterator
53-
54-
struct Iterator: AsyncIteratorProtocol {
55-
typealias Element = ByteBuffer
51+
typealias Element = AsyncIterator.Element
5652

53+
struct AsyncIterator: AsyncIteratorProtocol {
5754
private let stream: IteratorStream
5855

5956
fileprivate init(stream: IteratorStream) {
6057
self.stream = stream
6158
}
6259

63-
func next() async throws -> ByteBuffer? {
60+
mutating func next() async throws -> ByteBuffer? {
6461
try await self.stream.next()
6562
}
6663
}
6764

68-
func makeAsyncIterator() -> Iterator {
69-
Iterator(stream: IteratorStream(bag: self.bag))
65+
func makeAsyncIterator() -> AsyncIterator {
66+
AsyncIterator(stream: IteratorStream(bag: self.bag))
7067
}
7168
}
7269

‎Sources/AsyncHTTPClient/ConnectionPool/RequestBodyLength.swift

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
enum RequestBodyLength: Hashable {
15+
/// - Note: use `HTTPClientRequest.Body.Length` if you want to expose `RequestBodyLength` publicly
16+
@usableFromInline
17+
internal enum RequestBodyLength: Hashable {
1618
/// size of the request body is not known before starting the request
17-
case dynamic
18-
/// size of the request body is fixed and exactly `length` bytes
19-
case fixed(length: Int)
19+
case unknown
20+
/// size of the request body is fixed and exactly `count` bytes
21+
case known(_ count: Int)
2022
}

‎Sources/AsyncHTTPClient/HTTPHandler.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -690,13 +690,13 @@ internal struct RedirectHandler<ResponseType> {
690690
extension RequestBodyLength {
691691
init(_ body: HTTPClient.Body?) {
692692
guard let body = body else {
693-
self = .fixed(length: 0)
693+
self = .known(0)
694694
return
695695
}
696696
guard let length = body.length else {
697-
self = .dynamic
697+
self = .unknown
698698
return
699699
}
700-
self = .fixed(length: length)
700+
self = .known(length)
701701
}
702702
}

‎Sources/AsyncHTTPClient/RequestValidation.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ extension HTTPHeaders {
2424

2525
if case .TRACE = method {
2626
switch bodyLength {
27-
case .fixed(length: 0):
27+
case .known(0):
2828
break
29-
case .dynamic, .fixed:
29+
case .unknown, .known:
3030
// A client MUST NOT send a message body in a TRACE request.
3131
// https://tools.ietf.org/html/rfc7230#section-4.3.8
3232
throw HTTPClientError.traceRequestWithBody
@@ -37,9 +37,9 @@ extension HTTPHeaders {
3737

3838
let connectionClose = self[canonicalForm: "connection"].lazy.map { $0.lowercased() }.contains("close")
3939
switch bodyLength {
40-
case .dynamic:
40+
case .unknown:
4141
return .init(connectionClose: connectionClose, body: .stream)
42-
case .fixed(let length):
42+
case .known(let length):
4343
return .init(connectionClose: connectionClose, body: .fixedSize(length))
4444
}
4545
}
@@ -88,7 +88,7 @@ extension HTTPHeaders {
8888
self.remove(name: "Transfer-Encoding")
8989

9090
switch bodyLength {
91-
case .fixed(0):
91+
case .known(0):
9292
// if we don't have a body we might not need to send the Content-Length field
9393
// https://tools.ietf.org/html/rfc7230#section-3.3.2
9494
switch method {
@@ -103,9 +103,9 @@ extension HTTPHeaders {
103103
// for an enclosed payload body.
104104
self.add(name: "Content-Length", value: "0")
105105
}
106-
case .fixed(let length):
106+
case .known(let length):
107107
self.add(name: "Content-Length", value: String(length))
108-
case .dynamic:
108+
case .unknown:
109109
self.add(name: "Transfer-Encoding", value: "chunked")
110110
}
111111
}

‎Tests/AsyncHTTPClientTests/AsyncAwaitEndToEndTests.swift

+23-15
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
9090
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
9191
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
9292
request.method = .POST
93-
request.body = .byteBuffer(ByteBuffer(string: "1234"))
93+
request.body = .bytes(ByteBuffer(string: "1234"))
9494

9595
guard let response = await XCTAssertNoThrowWithResult(
9696
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -115,7 +115,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
115115
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
116116
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
117117
request.method = .POST
118-
request.body = .bytes(length: nil, AnySequence("1234".utf8))
118+
request.body = .bytes(AnySequence("1234".utf8), length: .unknown)
119119

120120
guard let response = await XCTAssertNoThrowWithResult(
121121
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -140,7 +140,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
140140
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
141141
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
142142
request.method = .POST
143-
request.body = .bytes(length: nil, AnyCollection("1234".utf8))
143+
request.body = .bytes(AnyCollection("1234".utf8), length: .unknown)
144144

145145
guard let response = await XCTAssertNoThrowWithResult(
146146
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -190,11 +190,11 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
190190
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
191191
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
192192
request.method = .POST
193-
request.body = .stream(length: nil, [
193+
request.body = .stream([
194194
ByteBuffer(string: "1"),
195195
ByteBuffer(string: "2"),
196196
ByteBuffer(string: "34"),
197-
].asAsyncSequence())
197+
].asAsyncSequence(), length: .unknown)
198198

199199
guard let response = await XCTAssertNoThrowWithResult(
200200
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -219,7 +219,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
219219
let logger = Logger(label: "HTTPClient", factory: StreamLogHandler.standardOutput(label:))
220220
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
221221
request.method = .POST
222-
request.body = .stream(length: nil, "1234".utf8.asAsyncSequence())
222+
request.body = .stream("1234".utf8.asAsyncSequence(), length: .unknown)
223223

224224
guard let response = await XCTAssertNoThrowWithResult(
225225
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -245,7 +245,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
245245
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
246246
request.method = .POST
247247
let streamWriter = AsyncSequenceWriter<ByteBuffer>()
248-
request.body = .stream(length: nil, streamWriter)
248+
request.body = .stream(streamWriter, length: .unknown)
249249

250250
guard let response = await XCTAssertNoThrowWithResult(
251251
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -257,7 +257,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
257257
ByteBuffer(string: "2"),
258258
ByteBuffer(string: "34"),
259259
]
260-
let bodyIterator = response.body.makeAsyncIterator()
260+
var bodyIterator = response.body.makeAsyncIterator()
261261
for expectedFragment in fragments {
262262
streamWriter.write(expectedFragment)
263263
guard let actualFragment = await XCTAssertNoThrowWithResult(
@@ -287,7 +287,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
287287
var request = HTTPClientRequest(url: "https://localhost:\(bin.port)/")
288288
request.method = .POST
289289
let streamWriter = AsyncSequenceWriter<ByteBuffer>()
290-
request.body = .stream(length: nil, streamWriter)
290+
request.body = .stream(streamWriter, length: .unknown)
291291

292292
guard let response = await XCTAssertNoThrowWithResult(
293293
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -300,7 +300,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
300300
ByteBuffer(string: String(repeating: "c", count: 4000)),
301301
ByteBuffer(string: String(repeating: "d", count: 4000)),
302302
]
303-
let bodyIterator = response.body.makeAsyncIterator()
303+
var bodyIterator = response.body.makeAsyncIterator()
304304
for expectedFragment in fragments {
305305
streamWriter.write(expectedFragment)
306306
guard let actualFragment = await XCTAssertNoThrowWithResult(
@@ -330,7 +330,7 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
330330
var request = HTTPClientRequest(url: "http://localhost:\(bin.port)/offline")
331331
request.method = .POST
332332
let streamWriter = AsyncSequenceWriter<ByteBuffer>()
333-
request.body = .stream(length: nil, streamWriter)
333+
request.body = .stream(streamWriter, length: .unknown)
334334

335335
let task = Task<HTTPClientResponse, Error> { [request] in
336336
try await client.execute(request, deadline: .now() + .seconds(2), logger: logger)
@@ -357,8 +357,12 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
357357
let task = Task<HTTPClientResponse, Error> { [request] in
358358
try await client.execute(request, deadline: .now() + .milliseconds(100), logger: logger)
359359
}
360-
await XCTAssertThrowsError(try await task.value) {
361-
XCTAssertEqual($0 as? HTTPClientError, HTTPClientError.deadlineExceeded)
360+
await XCTAssertThrowsError(try await task.value) { error in
361+
guard let error = error as? HTTPClientError else {
362+
return XCTFail("unexpected error \(error)")
363+
}
364+
// a race between deadline and connect timer can result in either error
365+
XCTAssertTrue([.deadlineExceeded, .connectTimeout].contains(error))
362366
}
363367
}
364368
#endif
@@ -378,8 +382,12 @@ final class AsyncAwaitEndToEndTests: XCTestCase {
378382
let task = Task<HTTPClientResponse, Error> { [request] in
379383
try await client.execute(request, deadline: .now(), logger: logger)
380384
}
381-
await XCTAssertThrowsError(try await task.value) {
382-
XCTAssertEqual($0 as? HTTPClientError, HTTPClientError.deadlineExceeded)
385+
await XCTAssertThrowsError(try await task.value) { error in
386+
guard let error = error as? HTTPClientError else {
387+
return XCTFail("unexpected error \(error)")
388+
}
389+
// a race between deadline and connect timer can result in either error
390+
XCTAssertTrue([.deadlineExceeded, .connectTimeout].contains(error))
383391
}
384392
}
385393
#endif

‎Tests/AsyncHTTPClientTests/HTTPClientRequestTests.swift

+8-8
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class HTTPClientRequestTests: XCTestCase {
225225
XCTAsyncTest {
226226
var request = Request(url: "http://example.com/post")
227227
request.method = .POST
228-
request.body = .byteBuffer(ByteBuffer())
228+
request.body = .bytes(ByteBuffer())
229229
var preparedRequest: PreparedRequest?
230230
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
231231
guard let preparedRequest = preparedRequest else { return }
@@ -261,7 +261,7 @@ class HTTPClientRequestTests: XCTestCase {
261261
XCTAsyncTest {
262262
var request = Request(url: "http://example.com/post")
263263
request.method = .POST
264-
request.body = .byteBuffer(.init(string: "post body"))
264+
request.body = .bytes(.init(string: "post body"))
265265
var preparedRequest: PreparedRequest?
266266
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
267267
guard let preparedRequest = preparedRequest else { return }
@@ -297,7 +297,7 @@ class HTTPClientRequestTests: XCTestCase {
297297
var request = Request(url: "http://example.com/post")
298298
request.method = .POST
299299
let sequence = AnySequence(ByteBuffer(string: "post body").readableBytesView)
300-
request.body = .bytes(length: nil, sequence)
300+
request.body = .bytes(sequence, length: .unknown)
301301
var preparedRequest: PreparedRequest?
302302
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
303303
guard let preparedRequest = preparedRequest else { return }
@@ -334,7 +334,7 @@ class HTTPClientRequestTests: XCTestCase {
334334
request.method = .POST
335335

336336
let sequence = AnySequence(ByteBuffer(string: "post body").readableBytesView)
337-
request.body = .bytes(length: 9, sequence)
337+
request.body = .bytes(sequence, length: .known(9))
338338
var preparedRequest: PreparedRequest?
339339
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
340340
guard let preparedRequest = preparedRequest else { return }
@@ -411,7 +411,7 @@ class HTTPClientRequestTests: XCTestCase {
411411
.asAsyncSequence()
412412
.map { ByteBuffer($0) }
413413

414-
request.body = .stream(length: nil, asyncSequence)
414+
request.body = .stream(asyncSequence, length: .unknown)
415415
var preparedRequest: PreparedRequest?
416416
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
417417
guard let preparedRequest = preparedRequest else { return }
@@ -452,7 +452,7 @@ class HTTPClientRequestTests: XCTestCase {
452452
.asAsyncSequence()
453453
.map { ByteBuffer($0) }
454454

455-
request.body = .stream(length: 9, asyncSequence)
455+
request.body = .stream(asyncSequence, length: .known(9))
456456
var preparedRequest: PreparedRequest?
457457
XCTAssertNoThrow(preparedRequest = try PreparedRequest(request))
458458
guard let preparedRequest = preparedRequest else { return }
@@ -500,7 +500,7 @@ extension Optional where Wrapped == HTTPClientRequest.Body {
500500
return buffer
501501
case .sequence(let announcedLength, _, let generate):
502502
let buffer = generate(ByteBufferAllocator())
503-
if let announcedLength = announcedLength,
503+
if case .known(let announcedLength) = announcedLength,
504504
announcedLength != buffer.readableBytes {
505505
throw LengthMismatch(announcedLength: announcedLength, actualLength: buffer.readableBytes)
506506
}
@@ -510,7 +510,7 @@ extension Optional where Wrapped == HTTPClientRequest.Body {
510510
while var buffer = try await generate(ByteBufferAllocator()) {
511511
accumulatedBuffer.writeBuffer(&buffer)
512512
}
513-
if let announcedLength = announcedLength,
513+
if case .known(let announcedLength) = announcedLength,
514514
announcedLength != accumulatedBuffer.readableBytes {
515515
throw LengthMismatch(announcedLength: announcedLength, actualLength: accumulatedBuffer.readableBytes)
516516
}

‎Tests/AsyncHTTPClientTests/RequestValidationTests.swift

+32-32
Large diffs are not rendered by default.

‎Tests/AsyncHTTPClientTests/TransactionTests.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ final class TransactionTests: XCTestCase {
189189

190190
var request = HTTPClientRequest(url: "https://localhost/")
191191
request.method = .POST
192-
request.body = .stream(length: nil, streamWriter)
192+
request.body = .stream(streamWriter, length: .unknown)
193193

194194
var maybePreparedRequest: PreparedRequest?
195195
XCTAssertNoThrow(maybePreparedRequest = try PreparedRequest(request))
@@ -318,7 +318,7 @@ final class TransactionTests: XCTestCase {
318318

319319
var request = HTTPClientRequest(url: "https://localhost/")
320320
request.method = .POST
321-
request.body = .bytes(length: nil, "Hello world!".utf8)
321+
request.body = .bytes("Hello world!".utf8, length: .unknown)
322322
var maybePreparedRequest: PreparedRequest?
323323
XCTAssertNoThrow(maybePreparedRequest = try PreparedRequest(request))
324324
guard let preparedRequest = maybePreparedRequest else {
@@ -360,7 +360,7 @@ final class TransactionTests: XCTestCase {
360360

361361
var request = HTTPClientRequest(url: "https://localhost/")
362362
request.method = .POST
363-
request.body = .stream(length: nil, writer)
363+
request.body = .stream(writer, length: .unknown)
364364
var maybePreparedRequest: PreparedRequest?
365365
XCTAssertNoThrow(maybePreparedRequest = try PreparedRequest(request))
366366
guard let preparedRequest = maybePreparedRequest else {
@@ -486,7 +486,7 @@ final class TransactionTests: XCTestCase {
486486
var request = HTTPClientRequest(url: "https://localhost:\(httpBin.port)/")
487487
request.method = .POST
488488
request.headers = ["host": "localhost:\(httpBin.port)"]
489-
request.body = .stream(length: 800, streamWriter)
489+
request.body = .stream(streamWriter, length: .known(800))
490490

491491
var maybePreparedRequest: PreparedRequest?
492492
XCTAssertNoThrow(maybePreparedRequest = try PreparedRequest(request))

0 commit comments

Comments
 (0)
Please sign in to comment.