[swift-server-dev] HTTP Parser

Samuel Kallner KALLNER at il.ibm.com
Fri Nov 4 03:50:22 CDT 2016


I agree with Paulo. One of Swift's strong points is its ability to bind 
with all sorts of existing "system" C based APIs. Especially C APIs that 
are extremely well tested and maintained. We should all remember that 
while many of us may have taken the http_parser from Node, Node itself 
took it from Nginx. This code comes with great pedigree.

Why should we spend time developing an HTTP parser in Swift when we should 
be spending our collective time higher up the Web Server Framework 
toolchain? Alfredo Delli Bovi quoted the work that was done Dave Sperling 
to port the HTTP Parser Kitura was using to Swift. While he ported the 
code, he did not write the complete Unit Test Suite needed for that code. 
His own estimate was that writing the tests would be approximately two to 
three times the effort of the original port. I also seem to remember that 
the performance hit for that particular code was more than 33%.

Another point, which is especially true on current Swift drivers, is that 
any code that is going to parse something like HTTP requests and responses 
is probably going to have to work at the byte level and not that String 
level. This is due to performance issues. At the byte level its actually a 
lot easier to write C code, than Swift code. This may change in the 
future, but lets wait until this kind of thing gets more performant in 
Swift.

Some have said that readability is more important than performance. I for 
one, who have read the http_parser code from time to time, find rather 
readable for a tightly written finite state machine. Here I also beg to 
disagree that performance isn't important. In a server one wants to spend 
cycles doing real work for the requestor, not figuring out what he wants 
you to do. To scale one needs to be performant.

Shmuel Kallner
STSM Smart Client Platforms group
Tel: +972-4829-6430
e-mail: kallner at il.ibm.com




From:   Paulo Faria 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:   04/11/2016 00:15
Subject:        Re: [swift-server-dev] HTTP Parser
Sent by:        swift-server-dev-bounces at swift.org



I think wrapping a battle-tested C library is the way to go. Using a C 
library is not the same as writing one. In our case we?ll have to deal 
with C APIs anyway (POSIX), so the experience won?t be something we?re not 
used to already. Pragmatically here are the pros and cons:

Pros
- Faster to wrap a C lib than to write everything in Swift
- Safer to use a battle-tested C lib
- Better performance when handling strings (major current bottleneck for 
Swift)

Cons
- We need the OK from Chris Lattner
- If a bug is found we have to either:
  - fix it ourselves and push back upstream
  - if it?s something we don?t know how to fix we report and wait for the 
fix

I?ve been using http_parser on Zewo for over an year and I haven?t found a 
single bug yet. That?s *very* unlikely to happen if we write a Swift 
parser ourselves.

About the binary data discussion. I think something so important like that 
should reside in the standard library. I don?t think a protocol is a good 
idea because it promotes the creation of even more binary abstractions 
which is no good. I know the proposal of a new ?data? type on the standard 
library falls on what I just said, *but* in a perfect world Foundation 
would lose NSData in favor of the standard library Data pretty much like 
it did for NSString/String. Eventually all other frameworks would be using 
standard library?s Data too.

The feeling I got from Ted Kremenek is that we should picture the best 
scenario and then see where our work might land. This is the perfect case 
for that.


On Nov 3, 2016, at 6:49 PM, Logan Wright via swift-server-dev <
swift-server-dev at swift.org> wrote:

Following up with what Tanner and Chris said. I think HTTP 2 is 
particularly difficult, and you're right chris, bringing in a c library, 
even if just temporarily will help expedite the process in an efficient 
way.

I am however pretty ardently against porting C code to Swift as opposed to 
rethinking things for a Swift paradigm. If that's the case, I'd prefer to 
either link to the c code, or bring it into the Swift compiler. The end 
result would appear to be the same.

 - Logan

On Thu, Nov 3, 2016 at 4:46 PM Tanner Nelson via swift-server-dev <
swift-server-dev at swift.org> wrote:

Tanner Nelson
Vapor 
+1 (435) 773-2831

On Nov 3, 2016, at 4:34 PM, Helge Heß via swift-server-dev <
swift-server-dev at swift.org> wrote:

On 3 Nov 2016, at 19:41, Alfredo Delli Bovi <alfredo.dellibovi at gmail.com> 
wrote:
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.

They claim that their port is just ~1/3 slower, that seems perfectly 
reasonable to me. I?m all for using it.

As far as I can tell, the package in question here is a carbon copy of the 
C parser (UnsafePointers, asserts, global funcs). The only difference is 
it's 1/3 slower. 

A big performance hit like that is not worth it unless we're getting 
improved readability or safety out of the code. 


I also agree with the overall sentiment that a ?pure? Swift solution 
should be preferred.

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.

Yes, the API should sit on top of this and be essentially parser agnostic.

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/20161104/d58d8b69/attachment.html>


More information about the swift-server-dev mailing list