1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
package TestServer;
use warnings;
use strict;
BEGIN {
delete $ENV{http_proxy}; # All our tests are running on localhost
}
use base 'HTTP::Server::Simple::CGI';
use Carp ();
our $pid;
sub new {
my $class = shift;
die 'An instance of TestServer has already been started.' if $pid;
# XXX This should really be a random port.
return $class->SUPER::new(13432, @_);
}
sub run {
my $self = shift;
$pid = $self->SUPER::run(@_);
$SIG{__DIE__} = \&stop;
return $pid;
}
sub handle_request {
my $self = shift;
my $cgi = shift;
my $file = (split( /\//,$cgi->path_info))[-1]||'index.html';
$file =~ s/\s+//g;
my $filename = "t/html/$file";
if ( -r $filename ) {
if (my $response=do { local (@ARGV, $/) = $filename; <> }) {
print "HTTP/1.0 200 OK\r\n";
print "Content-Type: text/html\r\nContent-Length: ", length($response), "\r\n\r\n", $response;
return;
}
}
print "HTTP/1.0 404 Not Found\r\n\r\n";
return;
}
sub background {
my $self = shift;
$pid = $self->SUPER::background()
or Carp::confess( q{Can't start the test server} );
sleep 1; # background() may come back prematurely, so give it a second to fire up
return $pid;
}
sub root {
my $self = shift;
my $port = $self->port;
return "http://localhost:$port";
}
sub stop {
if ( $pid ) {
kill( 9, $pid ) unless $^S;
undef $pid;
}
return;
}
1;
|