[swift-server-dev] Convert HTTPVersion to struct

Tanner Nelson tanner at vapor.codes
Wed Jun 14 08:27:11 CDT 2017

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)

    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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-server-dev/attachments/20170614/3962416a/attachment.html>

More information about the swift-server-dev mailing list