# 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 "Listening on address:port %s\n", $httpd->host_port;
   # or
   printf "Listening on address %s port %s\n", $httpd->host, $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%3A%3ADaemon%3A%3ASSL).

       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)

   - `host`

       local address to listen on (default: 127.0.0.1)

   - `port`

       TCP port to listen on (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;

- `host`

   Returns the address the server is listening on.

- `port`

   Returns the TCP port the server is listening on.

       my $port = $httpd->port;

- `host_port`

   Returns the host:port from `endpoint` (e.g., "127.0.0.1:1234", "\[::1\]:1234").

       my $host_port = $httpd->host_port;

- `endpoint`

   Returns a URI object to the running server (e.g., "http://127.0.0.1:1234",
   "https://\[::1\]:1234"). If `host` returns `undef`, `''`, `'0.0.0.0'`,
   or `'::'`, the host portion of the URI is set to `localhost`.

       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%3A%3ATCP), [HTTP::Daemon](https://metacpan.org/pod/HTTP%3A%3ADaemon), [HTTP::Daemon::SSL](https://metacpan.org/pod/HTTP%3A%3ADaemon%3A%3ASSL), [HTTP::Message::PSGI](https://metacpan.org/pod/HTTP%3A%3AMessage%3A%3APSGI)