=head1 NAME

Test::Fake::HTTPD - a fake HTTP server

=head1 SYNOPSIS

DSL-style

   use Test::Fake::HTTPD;

   my $httpd = run_http_server {
       my $req = shift;
       # ...

       # 1. HTTP::Response ok
       return $http_response;
       # 2. Plack::Response ok
       return $plack_response;
       # 3. PSGI response ok
       return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello World' ] ];
   };

   printf "You can connect to your server at %s.\n", $httpd->host_port;
   # or
   printf "You can connect to your server at 127.0.0.1:%d.\n", $httpd->port;

   # access to fake HTTP server
   use LWP::UserAgent;
   my $res = LWP::UserAgent->new->get($httpd->endpoint); # "http://127.0.0.1:{port}"

   # Stop http server automatically at destruction time.

OO-style

   use Test::Fake::HTTPD;

   my $httpd = Test::Fake::HTTPD->new(
       timeout => 5,
   );

   $httpd->run(sub {
       my $req = shift;
       # ...
       [ 200, [ 'Content-Type', 'text/plain' ], [ 'Hello World' ] ];
   });

   # Stop http server automatically at destruction time.

=head1 DESCRIPTION

Test::Fake::HTTPD is a fake HTTP server module for testing.

=head1 FUNCTIONS

=over 4

=item * C<run_http_server { ... }>

Starts HTTP server and returns the guard instance.

 my $httpd = run_http_server {
     my $req = shift;
     # ...
     return $http_or_plack_or_psgi_res;
 };

 # can use $httpd guard object, same as OO-style
 LWP::UserAgent->new->get($httpd->endpoint);

=back

=head1 METHODS

=over 4

=item * C<new( %args )>

Returns a new instance.

 my $httpd = Test::Fake::HTTPD->new(%args);

C<%args> are:

=over 8

=item * C<timeout>

timeout value (default: 5)

=item * C<listen>

queue size for listen (default: 5)

=item * C<port>

local bind port number (default: auto detection)

=back

 my $httpd = Test::Fake::HTTPD->new(
     timeout => 10,
     listen  => 10,
     port    => 3333,
 );

=item * C<run( sub { ... } )>

Starts this HTTP server.

 $httpd->run(sub { ... });

=item * C<port>

Returns a port number of running.

 my $port = $httpd->port;

=item * C<host_port>

Returns a URI host_port of running. ("127.0.0.1:{port}")

 my $host_port = $httpd->host_port;

=item * C<endpoint>

Returns an endpoint URI of running. ("http://127.0.0.1:{port}" URI object)

 use LWP::UserAgent;

 my $res = LWP::UserAgent->new->get($httpd->endpoint);

 my $url = $httpd->endpoint;
 $url->path('/foo/bar');
 my $res = LWP::UserAgent->new->get($url);

=back

=head1 AUTHOR

NAKAGAWA Masaki E<lt>[email protected]<gt>

=head1 THANKS TO

xaicron

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 SEE ALSO

L<Test::TCP>, L<HTTP::Daemon>, L<HTTP::Message::PSGI>


=cut