Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > os > by-pkgid > ff7ddd0f916dc80d2a586f3ca8986ca3 > files > 11

perl-Mojolicious-0.999929-1.fc14.noarch.rpm

#!/usr/bin/env perl

use strict;
use warnings;

# Use bundled libraries
use FindBin;
use lib "$FindBin::Bin/../lib";

# Kif, I'm feeling the Captain's Itch.
# I'll get the powder, sir.
use Mojo::IOLoop;

# The loop
my $loop = Mojo::IOLoop->new;

# Buffer for incoming data
my $buffer = {};

# Minimal ioloop example demonstrating how to cheat at HTTP benchmarks :)
$loop->listen(
    port      => 3000,
    accept_cb => sub {
        my ($loop, $id) = @_;

        # Initialize buffer
        $buffer->{$id} = '';
    },
    read_cb => sub {
        my ($loop, $id, $chunk) = @_;

        # Append chunk to buffer
        $buffer->{$id} .= $chunk;

        # Check if we got start line and headers (no body support)
        if (index $buffer->{$id}, "\x0d\x0a\x0d\x0a") {

            # Clean buffer
            delete $buffer->{$id};

            # Write a minimal HTTP response
            # (not spec compliant but benchmarks won't care)
            $loop->write($id => "HTTP/1.1 200 OK\x0d\x0a"
                  . "Connection: keep-alive\x0d\x0aContent-Length: 11\x0d\x0a"
                  . "\x0d\x0aHello Mojo!");
        }
    },
    error_cb => sub {
        my ($self, $id) = @_;

        # Clean buffer
        delete $buffer->{$id};
    }
) or die "Couldn't create listen socket!\n";

print <<'EOF';
Starting server on port 3000.
Try something like "ab -c 30 -n 100000 -k http://127.0.0.1:3000/" for testing.
On a MacBook Pro 13" this results in about 19k req/s.
EOF

# Start loop
$loop->start;

1;