tests:webclient: extend webclient to support HTTP/0.9, 1.0 and 1.1 requests.

Enable spcifying HTTP protocol version on command line ( --http-version).
Enable specifying method (GET, CONNECT, ...) on the command line (--method).
Add POD documentation.
Use pod2usage() to print help message.

Michael
This commit is contained in:
Michael Adam 2009-09-16 22:27:57 +02:00
parent b5a69151fa
commit 4ef7901115

View File

@ -21,19 +21,77 @@
use strict; use strict;
use IO::Socket; use IO::Socket;
use Getopt::Long;
use Pod::Usage;
my $EOL = "\015\012"; my $EOL = "\015\012";
my $VERSION = "0.1"; my $VERSION = "0.1";
my $NAME = "Tinyproxy-Web-Client"; my $NAME = "Tinyproxy-Web-Client";
my $user_agent = "$NAME/$VERSION"; my $user_agent = "$NAME/$VERSION";
my $user_agent_header = "User-Agent: $user_agent$EOL";
my $http_version = 1.0;
my $method = "GET";
my $help = 0;
unless (@ARGV > 1) { my $default_port = "80";
die "usage: $0 host[:port] document ..."; my $port = $default_port;
sub process_options() {
my $result = GetOptions("help|?" => \$help,
"http-version=s" => \$http_version,
"method=s" => \$method);
die "Error reading cmdline options! $!" unless $result;
pod2usage(1) if $help;
# some post-processing:
} }
my $host = shift(@ARGV);
my $port = "http(80)"; sub build_request($$$$$)
{
my ( $host, $port, $version, $method, $document ) = @_;
my $request = "";
$method = uc($method);
if ($version eq '0.9') {
if ($method ne 'GET') {
die "invalid method '$method'";
}
$request = "$method $document$EOL"
. "$EOL";
} elsif ($version eq '1.0') {
if ($method ne 'GET') {
die "invalid method '$method'";
}
$request = "$method $document HTTP/$version$EOL"
. $user_agent_header
. "$EOL";
} elsif ($version eq '1.1') {
$request = "$method $document HTTP/$version$EOL"
. "Host: $host" . (($port and ($port ne $default_port))?":$port":"") . "$EOL"
. $user_agent_header
. "Connection: close$EOL"
. "$EOL";
} else {
die "invalid version '$version'";
}
return $request;
}
# main
process_options();
unless (@ARGV > 1) {
pod2usage(1);
}
my $hostarg = shift(@ARGV);
my $host = $hostarg;
if ($host =~ /^([^:]+):(.*)/) { if ($host =~ /^([^:]+):(.*)/) {
$port = $2; $port = $2;
@ -52,9 +110,7 @@ foreach my $document (@ARGV) {
$remote->autoflush(1); $remote->autoflush(1);
print $remote "GET $document HTTP/1.0" . $EOL . print $remote build_request($host, $port, $http_version, $method, $document);
"User-Agent: $user_agent$EOL" .
$EOL;
while (<$remote>) { while (<$remote>) {
print; print;
@ -62,3 +118,42 @@ foreach my $document (@ARGV) {
close $remote; close $remote;
} }
exit(0);
__END__
=head1 webclient.pl
A simple WEB client written in perl.
=head1 SYNOPSIS
webclient.pl [options] host[:port] document [document ...]
=head1 OPTIONS
=over 8
=item B<--help>
Print a brief help message and exit.
=item B<--http-version>
Specify the HTTP protocol version to use (0.9, 1.0, 1.1). Default is 1.0.
=item B<--method>
Specify the HTTP request method ('GET', 'CONNECT', ...). Default is 'GET'.
=back
=head1 DESCRIPTION
This is a basic web client. It permits to send http request messages to
web servers or web proxy servers. The result is printed as is to standard output,
including headers. This is meant as a tool for diagnosing and testing
web servers and proxy servers.
=cut