[swift-server-dev] Convert HTTPVersion to struct
Tanner Nelson
tanner at vapor.codes
Wed Jun 14 08:49:47 CDT 2017
It's worth noting that HTTP/2 refers to the method header as a special
"pseudo-header".
> All HTTP/2 requests MUST include exactly one valid value for the :method,
:scheme, and :path pseudo-header fields.
https://http2.github.io/http2-spec/#rfc.section.8.1.2.3
So even though it's being passed as a "header", it's a special header
distinct from ones like content-type which could merit it continuing to be
a stored property on Request.
On Wed, Jun 14, 2017 at 2:41 PM Michael Chiu <hatsuneyuji at icloud.com> wrote:
> So are we going to write our own http parser?
>
> If not, I don’t see the benefit of ditching version and method properties
> since both major/minor version and method are given by the http_parser, and
> users are expecting to find it in the property since these components are
> well defined in RFC and guaranteed its existence in a proper http req/res.
> Hence they deserve to be an independent property.
>
> On the other hand, there’s no one guarantee the existence of Content-Type
> and Content-Length etc header exists in HTTP protocol (I can be wrong).
>
> Michael.
>
> On Jun 14, 2017, at 6:27 AM, Tanner Nelson via swift-server-dev <
> swift-server-dev at swift.org> wrote:
>
>
>
> On Wed, Jun 14, 2017 at 2:11 PM Helge Heß via swift-server-dev <
> swift-server-dev at swift.org> wrote:
>
>> On 14 Jun 2017, at 14:59, Paulo Faria <paulo at zewo.io> wrote:
>> > You're completely right we should care about HTTP 2.0 now. But let's do
>> it one step at a time, or else we won't get things done. The current topic
>> is the HTTPVersion type. So could you please give your feedback in the
>> HTTPVersion thread about how the current proposal of HTTPversion fits with
>> HTTP 2.0? We should go from lower abstractions to higher abstractions
>> incrementally but definitely considering the upper abstractions. Let's keep
>> focus and move on! 😊
>>
>> I gave my feedback on the type in the this thread already. Struct is fine
>> for me, tuple is OK too. I don’t actually care much as “The HTTP version
>> should only matter for logging purposes”. If it comes with comparison
>> operations and such, something is likely wrong with the API.
>>
>>
>> The only HTTP/2 specific note I have is this thing:
>>
>> From the HTTPRequest API design perspective there is a small
>> change in that method/version are just headers in HTTP/2.
>> I brought that up before.
>> E.g. why does ‘method' deserve a special enum, but not
>> content-type etc which is equally important for dispatching
>> a request. Either approach is fine though.)
>>
>
> In that case, maybe we ditch the version and method properties in favor of
> something more generic like:
>
> (just spitballing some pseudo swift here)
> ```swift
>
> struct Request {
> ...
> enum Metadata {
> case original(major: Int, minor: Int, Method)
> case headers
> }
>
> var metadata: Metadata
> ...
> }
>
>
> extension Request {
> var method: Method {
> switch metadata {
> case .original(_, _, let method):
> return method
> case .headers:
> return Method(rawValue: headers["Method"])
> }
> }
> }
>
> ```
> Here an enum's ability to exhaustively switch would be useful. Then
> `req.method` is implemented as an extension similar to how `req.version`
> and `req.contentType` could be implemented.
>
>
>> This affects the discussion as it may make sense to expose the
>> HTTPVersion as a regular header to mirror the new HTTP/2 setup
>> instead of basing the API on the old HTTP/0,1 model.
>> (I think either is fine, with a slight preference for going
>> with the ‘future’)
>>
>> Or in other words: Why struct or tuple, just keep it as a string
>> like the other headers.
>>
>> If HTTPVersion is not exposed as a String but as a specific type,
>> that would then affect the way headers in general are handled
>> (and I’m very much in favour of NOT using strings for the common
>> ones for various reasons).
>>
>> hh
>>
>> _______________________________________________
>> swift-server-dev mailing list
>> swift-server-dev at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-server-dev
>>
> _______________________________________________
> swift-server-dev mailing list
> swift-server-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-server-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-server-dev/attachments/20170614/050a9abf/attachment.html>
More information about the swift-server-dev
mailing list