---
name: "Test::Fake::HTTPD"
section: "3pm"
platform: "linux"
package: "libtest-fake-httpd-perl"
version: "0.09-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Test::Fake::HTTPD"
---

# Test::Fake::HTTPD(3pm)

a fake HTTP server

## 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.

  ```
    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 \<masaki@cpan.org\>

## 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, HTTP::Daemon, HTTP::Daemon::SSL, HTTP::Message::PSGI
