[swift-server-dev] HTTP Parser
Chris Bailey
BAILEYC at uk.ibm.com
Thu Nov 3 15:27:33 CDT 2016
I think one thing that needs to be considered is HTTP/2 support -
implementing HTTP/2 is significantly more complex that HTTP 1.x, so if we
want to support HTTP/2 it may make more sense to look at what we can reuse
(the nghttp2 library?)
Chris
From: Tanner Nelson via swift-server-dev <swift-server-dev at swift.org>
To: Logan Wright <logan at qutheory.io>
Cc: Swift Server Dev <swift-server-dev at swift.org>
Date: 03/11/2016 18:51
Subject: Re: [swift-server-dev] HTTP Parser
Sent by: swift-server-dev-bounces at swift.org
I think it's important to remember that performance is not the only
concern.
If we need to use the node_http parser because of time constraints, I'd
prefer that over creating a non-Swifty copy. If you want the functionality
of UnsafePointers, C is the better language to be working in.
Going forward I think a Swifty HTTP parser could get decent performance.
More importantly though it would be incredibly concise, readable, and
maintainable.
Tanner Nelson
Vapor
+1 (435) 773-2831
On Nov 3, 2016, at 2:42 PM, Logan Wright via swift-server-dev <
swift-server-dev at swift.org> wrote:
Completely agree Alex, I also feel strongly about the language in general,
and I think if we're going to take the time to build out Swift server
apis, they should be in well, Swift.
In terms of performance, Swift will only continue to improve in
performance, and given our access to the compiler team and the smart minds
in this room. I think we can beat the node parser with time.
- Logan
On Thu, Nov 3, 2016 at 2:41 PM Alfredo Delli Bovi <
alfredo.dellibovi at gmail.com> wrote:
Hi people,
There has been some discussions about this in Kitura already (
https://github.com/IBM-Swift/Kitura-net/issues/52) and I think we can use
what they found out at the moment.
In my opinion, if we are not able to give the same (or better) performance
we should go for a wrapper of a more performant lib, such as http_parser.
Of course it’s also matter of the workload that have, we could always
start with a wrapper, so we are able to define the APIs layer and ship a
version with it and later on changing the implementation with a pure
Swift.
—
Alfredo Delli Bovi
On 3 Nov 2016, at 19:35, Logan Wright via swift-server-dev <
swift-server-dev at swift.org> wrote:
Helge, definitely depends on the underlying network/dispatch scheme that
we go with. I doubt we'd pull in my original code 1:1. But it does speak
to my experience w/ the RFC spec in particular.
I'd personally opt for pure-swift over c-wrapper. I think it will be
easier to maintain/deploy/optimize going forward. I don't have an inherent
problem w/ the nodejs parser aside from that if people strongly prefer to
use c-code here.
- Logan
On Thu, Nov 3, 2016 at 1:27 PM Helge Heß via swift-server-dev <
swift-server-dev at swift.org> wrote:
Hi Logan,
On 03 Nov 2016, at 17:50, Logan Wright <logan at qutheory.io> wrote:
> Yup, you can see a lot of it in the underlying engine module from Vapor.
is it this one?:
https://github.com/vapor/engine/blob/master/Sources/HTTP/Parser/HTTPParser.swift
that seems to be a pull based / blocking parser, right? That probably
doesn’t work for a lot of environments.
Personally I’d suggest a small wrapper around this one:
https://github.com/nodejs/http-parser
It is small, fast, highly efficient, zero copy, push based, supports
chunked&upgrade and is extremely well tested and widely deployed.
I also did a straight port of that to Swift, though if you can use the C
version I wouldn't use the port as it is significantly slower (and may
have extra bugs introduced during the port):
https://github.com/NozeIO/Noze.io/tree/master/Sources/http_parser
My approach here was to keep it close to the original, which makes for
really ugly code :-)
I think it may be worthwhile to do another attempt of a port of the
parser, but less 1:1 like mine, in a Swiftier way (the original uses a lot
of goto’s :-).
As mentioned, I wouldn’t expect people to use the low level API but rather
have nice objects filled by the underlying parser. What about `WORequest`
& `WOResponse`? :-)
BTW: Something I consider important to discuss across all areas of
interest (crypto, sockets, HTTP) is a protocol to represent a chunks of
bytes and chunks of chunks of bytes (buckets and brigades in Apache
terms). Of course that could be just NSData or DispatchData but I expect
that some frameworks have their own way to represent such buffers, hence a
protocol would be nice.
Why important? Well, because there needs to be a way to pass the data
between those components w/o copying it :-)
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
_______________________________________________
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/20161103/f607d331/attachment.html>
More information about the swift-server-dev
mailing list