Skip to content

Commit f0c09bd

Browse files
committed
use RequestBodyLength instead of optional Int to specify body length
1 parent 952c9f3 commit f0c09bd

File tree

9 files changed

+68
-65
lines changed

9 files changed

+68
-65
lines changed

Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest+Prepared.swift

Lines changed: 4 additions & 6 deletions
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 = .fixed(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 = .fixed(buffer.readableBytes)
69+
case .sequence(let length, _, _), .asyncSequence(let length, _):
70+
self = length
7371
}
7472
}
7573
}

Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest.swift

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ extension HTTPClientRequest {
3737
public struct Body {
3838
@usableFromInline
3939
internal enum Mode {
40-
case asyncSequence(length: Int?, (ByteBufferAllocator) async throws -> ByteBuffer?)
41-
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)
4242
case byteBuffer(ByteBuffer)
4343
}
4444

@@ -54,7 +54,6 @@ extension HTTPClientRequest {
5454

5555
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
5656
extension HTTPClientRequest.Body {
57-
5857
public static func bytes(_ byteBuffer: ByteBuffer) -> Self {
5958
self.init(.byteBuffer(byteBuffer))
6059
}
@@ -63,7 +62,10 @@ extension HTTPClientRequest.Body {
6362
public static func bytes<Bytes: RandomAccessCollection>(
6463
_ bytes: Bytes
6564
) -> Self where Bytes.Element == UInt8 {
66-
self.init(.sequence(length: bytes.count, canBeConsumedMultipleTimes: true) { allocator in
65+
self.init(.sequence(
66+
length: .fixed(bytes.count),
67+
canBeConsumedMultipleTimes: true
68+
) { allocator in
6769
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) {
6870
// fastpath
6971
return buffer
@@ -75,10 +77,13 @@ extension HTTPClientRequest.Body {
7577

7678
@inlinable
7779
public static func bytes<Bytes: Sequence>(
78-
length: Int?,
80+
length: RequestBodyLength,
7981
_ bytes: Bytes
8082
) -> Self where Bytes.Element == UInt8 {
81-
self.init(.sequence(length: length, canBeConsumedMultipleTimes: bytes is Collection) { allocator in
83+
self.init(.sequence(
84+
length: length,
85+
canBeConsumedMultipleTimes: bytes is Collection
86+
) { allocator in
8287
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) {
8388
// fastpath
8489
return buffer
@@ -90,7 +95,7 @@ extension HTTPClientRequest.Body {
9095

9196
@inlinable
9297
public static func stream<SequenceOfBytes: AsyncSequence>(
93-
length: Int?,
98+
length: RequestBodyLength,
9499
_ sequenceOfBytes: SequenceOfBytes
95100
) -> Self where SequenceOfBytes.Element == ByteBuffer {
96101
var iterator = sequenceOfBytes.makeAsyncIterator()
@@ -102,7 +107,7 @@ extension HTTPClientRequest.Body {
102107

103108
@inlinable
104109
public static func stream<Bytes: AsyncSequence>(
105-
length: Int?,
110+
length: RequestBodyLength,
106111
_ bytes: Bytes
107112
) -> Self where Bytes.Element == UInt8 {
108113
var iterator = bytes.makeAsyncIterator()

Sources/AsyncHTTPClient/ConnectionPool/RequestBodyLength.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
enum RequestBodyLength: Hashable {
15+
public enum RequestBodyLength: Hashable {
1616
/// size of the request body is not known before starting the request
1717
case dynamic
18-
/// size of the request body is fixed and exactly `length` bytes
19-
case fixed(length: Int)
18+
/// size of the request body is fixed and exactly `count` bytes
19+
case fixed(_ count: Int)
2020
}

Sources/AsyncHTTPClient/HTTPHandler.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,13 +683,13 @@ internal struct RedirectHandler<ResponseType> {
683683
extension RequestBodyLength {
684684
init(_ body: HTTPClient.Body?) {
685685
guard let body = body else {
686-
self = .fixed(length: 0)
686+
self = .fixed(0)
687687
return
688688
}
689689
guard let length = body.length else {
690690
self = .dynamic
691691
return
692692
}
693-
self = .fixed(length: length)
693+
self = .fixed(length)
694694
}
695695
}

Sources/AsyncHTTPClient/RequestValidation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extension HTTPHeaders {
2424

2525
if case .TRACE = method {
2626
switch bodyLength {
27-
case .fixed(length: 0):
27+
case .fixed(0):
2828
break
2929
case .dynamic, .fixed:
3030
// A client MUST NOT send a message body in a TRACE request.

Tests/AsyncHTTPClientTests/AsyncAwaitEndToEndTests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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(length: .dynamic, AnySequence("1234".utf8))
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(length: .dynamic, AnyCollection("1234".utf8))
144144

145145
guard let response = await XCTAssertNoThrowWithResult(
146146
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -190,7 +190,7 @@ 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(length: .dynamic, [
194194
ByteBuffer(string: "1"),
195195
ByteBuffer(string: "2"),
196196
ByteBuffer(string: "34"),
@@ -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(length: .dynamic, "1234".utf8.asAsyncSequence())
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(length: .dynamic, streamWriter)
249249

250250
guard let response = await XCTAssertNoThrowWithResult(
251251
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -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(length: .dynamic, streamWriter)
291291

292292
guard let response = await XCTAssertNoThrowWithResult(
293293
try await client.execute(request, deadline: .now() + .seconds(10), logger: logger)
@@ -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(length: .dynamic, streamWriter)
334334

335335
let task = Task<HTTPClientResponse, Error> { [request] in
336336
try await client.execute(request, deadline: .now() + .seconds(2), logger: logger)

Tests/AsyncHTTPClientTests/HTTPClientRequestTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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(length: .dynamic, sequence)
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(length: .fixed(9), sequence)
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(length: .dynamic, asyncSequence)
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(length: .fixed(9), asyncSequence)
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 let .fixed(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 let .fixed(announcedLength) = announcedLength,
514514
announcedLength != accumulatedBuffer.readableBytes {
515515
throw LengthMismatch(announcedLength: announcedLength, actualLength: accumulatedBuffer.readableBytes)
516516
}

0 commit comments

Comments
 (0)