<font size=2 face="sans-serif">Based on where we are at the moment - which
is dealing with HTTPVersion as a separate type - it sounds like we're converging
on using a struct. As such if there's no strong objection I'll merge the
PR as-is.</font>
<br>
<br><font size=2 face="sans-serif">That doesn't close down the conversation
with respect to what we could/should do for HTTP/2 - just spins it off
separately.</font>
<br>
<br><font size=2 face="sans-serif">Chris</font>
<br>
<br>
<br><tt><font size=2>swift-server-dev-bounces@swift.org wrote on 14/06/2017
14:41:48:<br>
<br>
&gt; From: Michael Chiu via swift-server-dev &lt;swift-server-dev@swift.org&gt;</font></tt>
<br><tt><font size=2>&gt; To: Tanner Nelson &lt;tanner@vapor.codes&gt;</font></tt>
<br><tt><font size=2>&gt; Cc: Paulo Faria via swift-server-dev &lt;swift-server-dev@swift.org&gt;</font></tt>
<br><tt><font size=2>&gt; Date: 14/06/2017 15:19</font></tt>
<br><tt><font size=2>&gt; Subject: Re: [swift-server-dev] Convert HTTPVersion
to struct</font></tt>
<br><tt><font size=2>&gt; Sent by: swift-server-dev-bounces@swift.org</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; So are we going to write our own http parser?</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; If not, I don’t see the benefit of ditching version and method <br>
&gt; properties since both major/minor version and method are given by
<br>
&gt; the http_parser, and users are expecting to find it in the property
<br>
&gt; since these components are well defined in RFC and guaranteed its
<br>
&gt; existence in a proper http req/res. Hence they deserve to be an <br>
&gt; independent property. &nbsp;</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; On the other hand, there’s no one guarantee the existence of <br>
&gt; Content-Type and Content-Length etc header exists in HTTP protocol
<br>
&gt; (I can be wrong).</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; Michael.</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; On Jun 14, 2017, at 6:27 AM, Tanner Nelson via swift-server-dev &lt;<br>
&gt; swift-server-dev@swift.org&gt; wrote:</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; <br>
</font></tt>
<br><tt><font size=2>&gt; On Wed, Jun 14, 2017 at 2:11 PM Helge Heß via
swift-server-dev &lt;<br>
&gt; swift-server-dev@swift.org&gt; wrote:</font></tt>
<br><tt><font size=2>&gt; On 14 Jun 2017, at 14:59, Paulo Faria &lt;paulo@zewo.io&gt;
wrote:<br>
&gt; &gt; You're completely right we should care about HTTP 2.0 now. But
<br>
&gt; let's do it one step at a time, or else we won't get things done.
<br>
&gt; The current topic is the HTTPVersion type. So could you please give
<br>
&gt; your feedback in the HTTPVersion thread about how the current <br>
&gt; proposal of HTTPversion fits with HTTP 2.0? We should go from lower
<br>
&gt; abstractions to higher abstractions incrementally but definitely <br>
&gt; considering the upper abstractions. Let's keep focus and move on!
😊<br>
&gt; <br>
&gt; I gave my feedback on the type in the this thread already. Struct
is<br>
&gt; fine for me, tuple is OK too. I don’t actually care much as “The
<br>
&gt; HTTP version should only matter for logging purposes”. If it comes
<br>
&gt; with comparison operations and such, something is likely wrong with
the API.<br>
&gt; <br>
&gt; <br>
&gt; The only HTTP/2 specific note I have is this thing:<br>
&gt; <br>
&gt; &nbsp; From the HTTPRequest API design perspective there is a small<br>
&gt; &nbsp; change in that method/version are just headers in HTTP/2.<br>
&gt; &nbsp; I brought that up before.<br>
&gt; &nbsp; E.g. why does ‘method' deserve a special enum, but not<br>
&gt; &nbsp; content-type etc which is equally important for dispatching<br>
&gt; &nbsp; a request. Either approach is fine though.)</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; In that case, maybe we ditch the version and method properties in
<br>
&gt; favor of something more generic like:</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; (just spitballing some pseudo swift here)</font></tt>
<br><tt><font size=2>&gt; ```swift</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; &nbsp; &nbsp; struct Request {</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; ...</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; enum Metadata {</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case
original(major: Int, minor: Int, Method)</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case
headers</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; var metadata: Metadata</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; ...</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; &nbsp; &nbsp; extension Request {</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; var method: Method
{</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch
metadata {</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case
.original(_, _, let method):</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; return method</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case
.headers:</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; return Method(rawValue: headers[&quot;Method&quot;])</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&gt; &nbsp; &nbsp; }</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; ```</font></tt>
<br><tt><font size=2>&gt; Here an enum's ability to exhaustively switch
would be useful. Then <br>
&gt; `req.method` is implemented as an extension similar to how <br>
&gt; `req.version` and `req.contentType` could be implemented.</font></tt>
<br><tt><font size=2>&gt; <br>
&gt; <br>
&gt; This affects the discussion as it may make sense to expose the<br>
&gt; HTTPVersion as a regular header to mirror the new HTTP/2 setup<br>
&gt; instead of basing the API on the old HTTP/0,1 model.<br>
&gt; (I think either is fine, with a slight preference for going<br>
&gt; &nbsp;with the ‘future’)<br>
&gt; <br>
&gt; Or in other words: Why struct or tuple, just keep it as a string<br>
&gt; like the other headers.<br>
&gt; <br>
&gt; If HTTPVersion is not exposed as a String but as a specific type,<br>
&gt; that would then affect the way headers in general are handled<br>
&gt; (and I’m very much in favour of NOT using strings for the common<br>
&gt; &nbsp;ones for various reasons).<br>
&gt; <br>
&gt; hh<br>
&gt; <br>
&gt; _______________________________________________<br>
&gt; swift-server-dev mailing list<br>
&gt; swift-server-dev@swift.org<br>
&gt; </font></tt><a href="https://lists.swift.org/mailman/listinfo/swift-server-dev"><tt><font size=2>https://lists.swift.org/mailman/listinfo/swift-server-dev</font></tt></a>
<br><tt><font size=2>&gt; _______________________________________________<br>
&gt; swift-server-dev mailing list<br>
&gt; swift-server-dev@swift.org<br>
&gt; </font></tt><a href="https://lists.swift.org/mailman/listinfo/swift-server-dev"><tt><font size=2>https://lists.swift.org/mailman/listinfo/swift-server-dev</font></tt></a>
<br><tt><font size=2>&gt; _______________________________________________<br>
&gt; swift-server-dev mailing list<br>
&gt; swift-server-dev@swift.org<br>
&gt; </font></tt><a href="https://lists.swift.org/mailman/listinfo/swift-server-dev"><tt><font size=2>https://lists.swift.org/mailman/listinfo/swift-server-dev</font></tt></a><tt><font size=2><br>
</font></tt><font size=2 face="sans-serif"><br>
Unless stated otherwise above:<br>
IBM United Kingdom Limited - Registered in England and Wales with number
741598. <br>
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
3AU<br>
</font>