The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Benchmark ':all';
use HTTP::Parser::XS ':all';
use LWP::UserAgent;


my $buf = <<'...';
HTTP/1.0 200 OK
Date: Fri, 29 Oct 2010 05:19:06 GMT
Server: hi
Status: 200 OK
X-Transaction: 1414179016-1573-34157
ETag: "0694329108904124516f45127c9543d9"-gzip
Last-Modified: Fri, 29 Oct 2010 05:19:06 GMT
X-Runtime: 0.01082
Content-Type: text/html; charset=utf-8
Pragma: no-cache
X-Revision: DEV
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: _twitter_sess=BJKL5252d3Hjkmode=block
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Connection: close

...
$buf =~ s/\015?\012/\015\012/;

if (my $url = shift @ARGV) {
    my $ua = LWP::UserAgent->new(parse_head => 0);
    my $res = $ua->head($url);
    die $res->status_line unless $res->is_success;
    $buf = $res->as_string;
}

# $buf is valid?
my ($ret, $minor_version, $status, $msg) = parse_http_response($buf, HEADER_NONE);
$ret > 0 or die "*** Cannot parse header ***\n$buf";

cmpthese(
    -1, {
        'none' => sub {
            parse_http_response($buf, HEADER_NONE);
        },
        'arrayref' => sub {
            parse_http_response($buf, HEADERS_AS_ARRAYREF);
        },
        'arrayref+special' => sub {
            my %special = (
                'connection'        => '',
                'content-length'    => undef,
                'location'          => '',
                'content-encoding'  => '',
                'transfer-encoding' => '',
            );
            parse_http_response(
                $buf,
                HEADERS_AS_ARRAYREF,
                \%special,
            );
        },
        'special' => sub {
            my %special = (
                'connection'        => '',
                'content-length'    => undef,
                'location'          => '',
                'content-encoding'  => '',
                'transfer-encoding' => '',
            );
            parse_http_response(
                $buf,
                HEADER_NONE,
                \%special,
            );
        },
        'hashref' => sub {
            parse_http_response($buf, HEADERS_AS_HASHREF);
        },
    },
);