-
Notifications
You must be signed in to change notification settings - Fork 125
Add HTTPClientRequest
#509
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@available(*, deprecated, message: "no need to manually specify `length` because we automatically use `bytes.count` as the `length`") | ||
static func bytes<Bytes>( | ||
length: Int, | ||
_ collection: Bytes | ||
) -> Self where Bytes: RandomAccessCollection, Bytes.Element == UInt8 { | ||
return .bytes(collection) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is an interesting idea... It pushes people into using the right thing. However I wonder if it is a good idea to introduce new API, that we deprecate from the get go. @Lukasa wdyt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd be more inclined to consider marking the method @available(*, unavailable)
and then not giving it an implementation beyond fatalError
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have tried @available(*, unavailable)
but then the swift compiler will just choose the overload where Bytes: Sequence
:
async-http-client/Sources/AsyncHTTPClient/AsyncAwait/HTTPClientRequest.swift
Lines 58 to 70 in 8e4b2b4
static func bytes<Bytes>( | |
length: Int? = nil, | |
_ bytes: Bytes | |
) -> Self where Bytes: Sequence, Bytes.Element == UInt8 { | |
self.init(.sequence(length: length) { allocator in | |
if let buffer = bytes.withContiguousStorageIfAvailable({ allocator.buffer(bytes: $0) }) { | |
// fastpath | |
return buffer | |
} | |
// potentially really slow path | |
return allocator.buffer(bytes: bytes) | |
}) | |
} |
Even adding
@_disfavoredOverload
to the Sequence
overload doesn't help.
I think what we could also do is marking the method as deprecated and just adding a fatalError with a useful message. Then user will get a compiler warning and a runtime error. WDYT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've left some notes in the diff. Are we adding tests in a separate PR?
self.init(.byteBuffer(byteBuffer)) | ||
} | ||
|
||
static func bytes<Bytes>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we make this method @inlinable
?
}) | ||
} | ||
|
||
static func bytes<Bytes>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we make this method @inlinable
?
/// `RandomAccessCollection` because it already provide a property `count` to get the length in O(**1**). | ||
/// - Note: `length` is ignored in favour of `bytes.count` | ||
@available(*, deprecated, message: "no need to manually specify `length` because we automatically use `bytes.count` as the `length`") | ||
static func bytes<Bytes>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we make this method @inlinable
?
length: Int, | ||
_ collection: Bytes | ||
) -> Self where Bytes: RandomAccessCollection, Bytes.Element == UInt8 { | ||
return .bytes(collection) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we're going to offer this overload, can we at least precondition
that the length matches the count of the collection?
@available(*, deprecated, message: "no need to manually specify `length` because we automatically use `bytes.count` as the `length`") | ||
static func bytes<Bytes>( | ||
length: Int, | ||
_ collection: Bytes | ||
) -> Self where Bytes: RandomAccessCollection, Bytes.Element == UInt8 { | ||
return .bytes(collection) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd be more inclined to consider marking the method @available(*, unavailable)
and then not giving it an implementation beyond fatalError
return .bytes(collection) | ||
} | ||
|
||
static func stream<SequenceOfBytes>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we make this method @inlinable
?
return body | ||
} | ||
|
||
static func stream<Bytes>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we make this method @inlinable
?
Yes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Thanks!
HTTPClientRequest
andHTTPClientRequest.Body
as described in the async/await proposal with some modifications:.bytes(_:)
and.stream(_:)
fromHTTPClientRequest.Body
accept an additional optionallength
parameter to specify thelength
in advance. This will primarily be used to set aContent-Length
header.HTTPClientRequest.Body.bytes(..)
that accepts aRandomAccessCollection
which automatically uses thecount
property from the given collection as the body length.Note that everything is still internal. This allows us to merge async/await components incrementally while still being able to release new versions from main.