aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/httpserver.pl87
1 files changed, 71 insertions, 16 deletions
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 622a6e75e..d7e52f4e0 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -3,14 +3,17 @@ use Socket;
use Carp;
use FileHandle;
+use strict;
+
sub spawn; # forward declaration
sub logmsg { #print "$0 $$: @_ at ", scalar localtime, "\n"
}
my $port = $ARGV[0];
-my $proto = getprotobyname('tcp');
+my $proto = getprotobyname('tcp') || 6;
$port = $1 if $port =~ /(\d+)/; # untaint port number
+my $protocol;
if($ARGV[1] =~ /^ftp$/i) {
$protocol="FTP";
}
@@ -18,6 +21,8 @@ else {
$protocol="HTTP";
}
+my $verbose=0; # set to 1 for debugging
+
socket(Server, PF_INET, SOCK_STREAM, $proto)|| die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
pack("l", 1)) || die "setsockopt: $!";
@@ -40,18 +45,53 @@ sub REAPER {
}
# USER is ok in fresh state
-%commandok = ( "USER" => "fresh",
- "PASS" => "passwd",
- "PASV" => "loggedin",
- );
+my %commandok = ( "USER" => "fresh",
+ "PASS" => "passwd",
+ # "PASV" => "loggedin", we can't handle PASV yet
+ "PORT" => "loggedin",
+ );
+
+my %statechange = ( 'USER' => 'passwd', # USER goes to passwd state
+ 'PASS' => 'loggedin', # PASS goes to loggedin state
+ 'PORT' => 'ported', # PORT goes to ported
+ );
+
+my %displaytext = ('USER' => '331 We are happy you popped in!', # output FTP line
+ 'PASS' => '230 Welcome you silly person',
+ );
+
+my %commandfunc = ( 'PORT', \&PORT_command );
-%statechange = ( 'USER' => 'passwd', # USER goes to passwd state
- 'PASS' => 'loggedin', # PASS goes to loggedin state
- );
+sub PORT_command {
+ my $arg = $_[0];
+ print STDERR "fooo: $arg\n";
-%displaytext = ('USER' => '331 We are happy you popped in!', # output FTP line
- 'PASS' => '230 Welcome you silly person',
- );
+ # "193,15,23,1,172,201"
+
+ if($arg !~ /(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/) {
+ print STDERR "bad PORT-line: $arg\n";
+ print "314 silly you, go away\r\n";
+ return 1;
+ }
+ my $iaddr = inet_aton("$1.$2.$3.$4");
+ my $paddr = sockaddr_in(($5<<8)+$6, $iaddr);
+ my $proto = getprotobyname('tcp') || 6;
+
+ socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "major failure";
+ print STDERR "socket()\n";
+
+ connect(SOCK, $paddr) || return 1;
+ print STDERR "connect()\n";
+
+ my $line;
+ while (defined($line = <SOCK>)) {
+ print STDERR $line;
+ }
+
+ close(SOCK);
+ print STDERR "close()\n";
+
+}
$SIG{CHLD} = \&REAPER;
@@ -94,7 +134,7 @@ for ( $waitedpid = 0;
"220-running the curl suite test server\r\n",
"220 running the curl suite test server\r\n";
- $state="fresh";
+ my $state="fresh";
while(1) {
@@ -109,12 +149,13 @@ for ( $waitedpid = 0;
"badly formed command received: ".$_;
exit 0;
}
- $FTPCMD=$1;
- $full=$_;
+ my $FTPCMD=$1;
+ my $FTPARG=$2;
+ my $full=$_;
print STDERR "GOT: ($1) $_\n";
- $ok = $commandok{$FTPCMD};
+ my $ok = $commandok{$FTPCMD};
if($ok !~ /$state/) {
print "314 $FTPCMD not OK ($ok) in state: $state!\r\n";
exit;
@@ -125,15 +166,24 @@ for ( $waitedpid = 0;
print "314 Wwwwweeeeird internal error state: $state\r\n";
exit;
}
+
+ # see if the new state is a function caller.
+ my $func = $commandfunc{$FTPCMD};
+ if($func) {
+ # it is!
+ spawn \&$func($FTPARG);
+ }
+
print STDERR "gone to state $state\n";
- $text = $displaytext{$FTPCMD};
+ my $text = $displaytext{$FTPCMD};
print "$text\r\n";
}
exit;
}
# otherwise, we're doing HTTP
+ my @headers;
while(<STDIN>) {
if($_ =~ /([A-Z]*) (.*) HTTP\/1.(\d)/) {
$request=$1;
@@ -144,6 +194,10 @@ for ( $waitedpid = 0;
$cl=$1;
}
+ if($verbose) {
+ print STDERR "IN: $_";
+ }
+
push @headers, $_;
if($left > 0) {
@@ -181,6 +235,7 @@ for ( $waitedpid = 0;
# test number that this server will use to know what
# contents to pass back to the client
#
+ my $testnum;
if($path =~ /.*\/(\d*)/) {
$testnum=$1;
}