<div dir="ltr"><div><span style="font-size:12.800000190734863px">&gt; Was there a discussion on the module name yet? I would assume it to be more like S3.HTTPRequest, alongside the other protocols. Or is there even an explicit module, or just an abstract API?</span><br></div><div><br></div><div>There wasn&#39;t any discussion. I&#39;m just assuming it would a module called HTTP. Of course it could be anything else.</div><div><br></div><div>&gt; <span style="font-size:12.800000190734863px">It is Friday night and there about 3 opinions on that. Give it some time …</span></div><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">I didn&#39;t mean this is settled. I meant I&#39;m OK with the prefixes if eventually peo<font color="#000000">ple decide in favor of it.</font></span></div><div><span style="font-size:12.800000190734863px"><font color="#000000"><br></font></span></div><div><font color="#000000"><span style="font-size:12.800000190734863px">&gt; </span><span style="font-size:12.800000190734863px">no real complex project AFAIK had built on any of the swift web framework available yet.</span></font></div><div><span style="font-size:12.800000190734863px"><font color="#000000"><br></font></span></div><div><span style="font-size:12.800000190734863px"><font color="#000000">My response was to that particular section in the quote above. We do have complex projects running in production.  I&#39;m not saying S3 is completely mature. It isn&#39;t.</font></span></div><div><br></div>&gt; <span style="font-size:12.800000190734863px">That seems pretty optimistic given the past discussions. No protocols, structs, enums, etc. It may be what we end up with, but I don’t particularly like it :-) It still makes sense as a basis to go forward from.</span><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">Exactly my point. We need something to build upon. All I&#39;m proposing is that we start with the basics. Given the discussions we had so far the design below looks like the most consensual (or maybe the least controversial).</span><br><div><br></div><div><div>public struct HTTPVersion {</div><div>    public var major: Int</div><div>    public var minor: Int</div><div>    </div><div>    public init(major: Int, minor: Int) {</div><div>        self.major = major</div><div>        self.minor = minor</div><div>    }</div><div>}</div><div><br></div><div>public struct HTTPHeaders {</div><div>    public var headers: [(Field, String)]</div><div>    </div><div>    public init(_ headers: [(Field, String)]) {</div><div>        self.headers = headers</div><div>    }</div><div>    </div><div>    /// Field&#39;s implementation of `Equatable` performs a case-insensitive comparison.</div><div>    public struct Field {</div><div>        public let original: String</div><div>        </div><div>        public init(_ original: String) {</div><div>            self.original = original</div><div>        }</div><div>    }</div><div>}</div><div><br></div><div>public protocol HTTPMessage {</div><div>    var version: HTTPVersion { get set }</div><div>    var headers: HTTPHeaders { get set }</div><div>}</div><div><br></div><div>public struct HTTPRequest : HTTPMessage {</div><div>    public var method: HTTPMethod</div><div>    public var uri: String</div><div>    public var version: HTTPVersion</div><div>    public var headers: HTTPHeaders</div><div>    </div><div>    public init(</div><div>        method: HTTPMethod,</div><div>        uri: URI,</div><div>        headers: HTTPHeaders,</div><div>        version: HTTPVersion</div><div>    ) {</div><div>        self.method = method</div><div>        self.uri = uri</div><div>        self.headers = headers</div><div>        self.version = version</div><div>    }</div><div>}</div><div><br></div><div>public struct HTTPMethod {</div><div>    public let method: String</div><div>    </div><div>    init(_ method: String) {</div><div>        self.method = method.uppercased()</div><div>    }</div><div>}</div><div><br></div><div>public struct HTTPResponse : HTTPMessage {</div><div>    public var status: HTTPStatus</div><div>    public var headers: HTTPHeaders</div><div>    public var version: HTTPVersion</div><div>    </div><div>    public init(</div><div>        status: HTTPStatus,</div><div>        headers: HTTPHeaders,</div><div>        version: HTTPVersion</div><div>    ) {</div><div>        self.status = status</div><div>        self.headers = headers</div><div>        self.version = version</div><div>    }</div><div>}</div><div><br></div><div>public struct HTTPStatus {</div><div>    public let statusCode: Int</div><div>    public let reasonPhrase: String</div><div>    </div><div>    public init(statusCode: Int, reasonPhrase: String) {</div><div>        self.statusCode = statusCode</div><div>        self.reasonPhrase = reasonPhrase</div><div>    }</div><div>}</div></div><div><br></div></div></div>