#!/usr/bin/perl

package net_server;

use strict;
use warnings;

if (grep {$_ eq '--help' || $_ eq '-h'} @ARGV) {
    require Pod::Usage;
    Pod::Usage::pod2usage(-verbose => 1);
    exit;
}

my $pkg;
if (@ARGV
    && $ARGV[0]
    && $ARGV[0] =~ /^(\w+)$/
    && ($pkg = $1)
    && eval { require "Net/Server/$pkg.pm" }
    ) {
    $pkg = "Net::Server::$pkg";
} else {
    if ($pkg && grep {-e "$_/Net/Server/$pkg.pm"} @INC) {
        die "Error trying to become a Net::Server::$pkg:\n\n$@";
    }
    $pkg = 'Net::Server::MultiType';
}

require base;
import base $pkg;

__PACKAGE__->run;
exit;

sub default_port {
    my $self = shift;
    return 8080 if $> && $self->isa('Net::Server::HTTP');
    return $self->SUPER::default_port;
}

__END__

=head1 NAME

net-server - Base Net::Server starting module

=head1 SYNOPSIS

    net-server [base type] [net server arguments]

    net-server PreFork ipv '*'

    net-server HTTP

    net-server HTTP app foo.cgi

    net-server HTTP app foo.cgi app /=bar.cgi

    net-server HTTP port 8080 port 8443/ssl ipv '*' server_type PreFork --SSL_key_file=my.key --SSL_cert_file=my.crt access_log_file STDERR

=head1 DESCRIPTION

The net-server program gives a simple way to test out code and try
port connection parameters.  Though the running server can be robust
enough for production, it is anticipated that this binary will just
be used for basic testing of net-server ports, acting as a simple echo
server, or for running development scripts as CGI.

=head1 OPTIONS

=over 4

=item C<base type>

The very first argument may be a Net::Server flavor.  This is given as
shorthand for writing out server_type "ServerFlavor".  Additionally,
this allows types such as HTTP and PSGI, which are not true
Net::Server base types, to subclass other server types via an
additional server_type argument.

    net-server PreFork

    net-server HTTP  # becomes a HTTP server in the Fork flavor

    net-server HTTP server_type PreFork  # preforking HTTP server

=item C<port>

Port to bind upon.  Default is 80 if running a HTTP server as root,
8080 if running a HTTP server as non-root, or 20203 otherwise.

Multiple value can be given for binding to multiple ports.  All of the
methods for specifying port attributes enumerated in L<Net::Server>
and L<Net::Server::Proto> are available here.

    net-server port 20201

    net-server port 20202

    net-server port 20203/IPv6

=item C<host>

Host to bind to.  Default is *.  Will bind to an IPv4 socket if an
IPv4 address is given.  Will bind to an IPv6 socket if an IPv6 address
is given (requires installation of IO::Socket::INET6).

If a hostname is given and C<ipv> is still set to 4, an IPv4 socket
will be created.  If a hostname is given and C<ipv> is set to 6, an
IPv6 socket will be created.  If a hostname is given and C<ipv> is set
to * (default), a lookup will be performed and any available IPv4 or
IPv6 addresses will be bound.  The C<ipv> parameter can be set
directly, or passed along in the port, or additionally can be passed
as part of the hostname.

    net-server host localhost

    net-server host localhost/IPv4

=back

There are many more options available.  Please see the L<Net::Server>
documentation.

=head1 AUTHOR

    Paul Seamons <paul@seamons.com>

=head1 LICENSE

This package may be distributed under the terms of either the

  GNU General Public License
    or the
  Perl Artistic License

=cut
