The parser stores headers in a Ruby hash table so that when a header
is found twice its value replaces the old one. As per RFC[1] this is
not correct, since duplicated headers should all be considered. In
particular, they are semantically equivalent to a single header with
comma separated values. In this case, we follow existing practice of
joining values with a comma and a single space character.
[1] See RFC2616 section 4.2:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
Puma::IOBuffer is a very simple memory buffer that allows for fast
append without additional object overhead.
Additionally, turns out that IO#write on 1.9.3 is extremely
non-performant because it allows a Hash object on every invocation.
Avoid calling IO#write in a loop on 1.9.3! Use IO#syswrite if you can
(for instance when you don't care about the encoding of the output
(sockets)).
As far as I could tell, the buffer given to the http parser isn't
modified. Because it is not modified, we can use the
RSTRING_NOT_MODIFIED header to ensure that Rubinius hasn't do the extra
work to copy the data back and forth.