# NAME

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

# 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,
       daemon_args => { ... }, # HTTP::Daemon args
   );

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

   # Stop http server automatically at destruction time.

# DESCRIPTION

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

# FUNCTIONS

- `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);

- `run_https_server { ... }`

   Starts **HTTPS** server and returns the guard instance.

   If you use this method, you MUST install [HTTP::Daemon::SSL](https://metacpan.org/pod/HTTP::Daemon::SSL).

       extra_daemon_args
           SSL_key_file  => "certs/server-key.pem",
           SSL_cert_file => "certs/server-cert.pem";

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

       # can use $httpd guard object, same as OO-style
       my $ua = LWP::UserAgent->new(
           ssl_opts => {
               SSL_verify_mode => 0,
               verify_hostname => 0,
           },
       );
       $ua->get($httpd->endpoint);

# METHODS

- `new( %args )`

   Returns a new instance.

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

   `%args` are:

   - `timeout`

       timeout value (default: 5)

   - `listen`

       queue size for listen (default: 5)

   - `port`

       local bind port number (default: auto detection)

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

- `run( sub { ... } )`

   Starts this HTTP server.

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

- `scheme`

   Returns a scheme of running, "http" or "https".

       my $scheme = $httpd->scheme;

- `port`

   Returns a port number of running.

       my $port = $httpd->port;

- `host_port`

   Returns a URI host\_port of running. ("127.0.0.1:{port}")

       my $host_port = $httpd->host_port;

- `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);

# AUTHOR

NAKAGAWA Masaki <[email protected]>

# THANKS TO

xaicron

# LICENSE

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

# SEE ALSO

[Test::TCP](https://metacpan.org/pod/Test::TCP), [HTTP::Daemon](https://metacpan.org/pod/HTTP::Daemon), [HTTP::Daemon::SSL](https://metacpan.org/pod/HTTP::Daemon::SSL), [HTTP::Message::PSGI](https://metacpan.org/pod/HTTP::Message::PSGI)