Revert "Update to 7.40.1"
[platform/upstream/curl.git] / tests / httpserver.pl
index 2bbf839..a38c3ce 100755 (executable)
-#!/usr/bin/perl
-use Socket;
-use Carp;
-use FileHandle;
-
-#use strict;
-
-require "getpart.pm";
-
-sub spawn;  # forward declaration
-sub logmsg { #print "$0 $$: @_ at ", scalar localtime, "\n"
- }
-
-my $verbose=0; # set to 1 for debugging
-
-my $port = 8999; # just a default
-do {
-    if($ARGV[0] eq "-v") {
-        $verbose=1;
-    }
-    elsif($ARGV[0] =~ /^(\d+)$/) {
-        $port = $1;
-    }
-} while(shift @ARGV);
-
-my $proto = getprotobyname('tcp') || 6;
-
-socket(Server, PF_INET, SOCK_STREAM, $proto)|| die "socket: $!";
-setsockopt(Server, SOL_SOCKET, SO_REUSEADDR,
-           pack("l", 1)) || die "setsockopt: $!";
-bind(Server, sockaddr_in($port, INADDR_ANY))|| die "bind: $!";
-listen(Server,SOMAXCONN) || die "listen: $!";
-
-if($verbose) {
-    print "HTTP server started on port $port\n";
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+BEGIN {
+    push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
+    push(@INC, ".");
 }
 
-open(PID, ">.http.pid");
-print PID $$;
-close(PID);
-
-my $PID=$$;
-
-my $waitedpid = 0;
-my $paddr;
-
-sub REAPER {
-    $waitedpid = wait;
-    $SIG{CHLD} = \&REAPER;  # loathe sysV
-    logmsg "reaped $waitedpid" . ($? ? " with exit $?" : '');
-}
-
-sub performcmd {
-    my @cmd = @_;
-    for(@cmd) {
-        if($_ =~ /^ *wait *(\d*)/) {
-            # instructed to sleep!
-            sleep($1);
+use strict;
+use warnings;
+
+use serverhelp qw(
+    server_pidfilename
+    server_logfilename
+    );
+
+my $verbose = 0;     # set to 1 for debugging
+my $port = 8990;     # just a default
+my $ipvnum = 4;      # default IP version of http server
+my $idnum = 1;       # dafault http server instance number
+my $proto = 'http';  # protocol the http server speaks
+my $pidfile;         # http server pid file
+my $logfile;         # http server log file
+my $connect;         # IP to connect to on CONNECT
+my $srcdir;
+my $gopher = 0;
+
+my $flags  = "";
+my $path   = '.';
+my $logdir = $path .'/log';
+
+while(@ARGV) {
+    if($ARGV[0] eq '--pidfile') {
+        if($ARGV[1]) {
+            $pidfile = $ARGV[1];
+            shift @ARGV;
         }
     }
-}
-
-$SIG{CHLD} = \&REAPER;
-
-for ( $waitedpid = 0;
-      ($paddr = accept(Client,Server)) || $waitedpid;
-        $waitedpid = 0, close Client)
-{
-    next if $waitedpid and not $paddr;
-    my($port,$iaddr) = sockaddr_in($paddr);
-    my $name = gethostbyaddr($iaddr,AF_INET);
-
-    logmsg "connection from $name [", inet_ntoa($iaddr), "] at port $port";
-
-    # this code is forked and run
-    spawn sub {
-        my ($request, $path, $ver, $left, $cl);
-
-        my @headers;
-
-        while(<STDIN>) {
-            if($_ =~ /([A-Z]*) (.*) HTTP\/1.(\d)/) {
-                $request=$1;
-                $path=$2;
-                $ver=$3;
-            }
-            elsif($_ =~ /^Content-Length: (\d*)/) {
-                $cl=$1;
-            }
-
-            if($verbose) {
-                print STDERR "IN: $_";
-            }
-            
-            push @headers, $_;
-
-            if($left > 0) {
-                $left -= length($_);
-                if($left == 0) {
-                    $left = -1; # just to force a loop break here
-                }
-            }
-            # print STDERR "RCV ($left): $_";
-
-            if(!$left &&
-               ($_ eq "\r\n") or ($_ eq "")) {
-                if($request =~ /^(POST|PUT)$/) {
-                    $left=$cl;
-                }
-                elsif($request =~ /^CONNECT$/) {
-                    if($verbose) {
-                        print STDERR "We're emulating a SSL proxy!\n";
-                    }
-                    $left = -1;
-                }
-                else {
-                    $left = -1; # force abort
-                }
-            }
-            if($left < 0) {
-                last;
-            }
+    elsif($ARGV[0] eq '--logfile') {
+        if($ARGV[1]) {
+            $logfile = $ARGV[1];
+            shift @ARGV;
         }
-
-        if($request =~ /^CONNECT$/) {
-            # ssl proxy mode
-            print "HTTP/1.1 400 WE CANNOT ROOL NOW\r\n",
-            "Server: bahoooba\r\n\r\n";
-            exit;
+    }
+    elsif($ARGV[0] eq '--srcdir') {
+        if($ARGV[1]) {
+            $srcdir = $ARGV[1];
+            shift @ARGV;
+        }
+    }
+    elsif($ARGV[0] eq '--ipv4') {
+        $ipvnum = 4;
+    }
+    elsif($ARGV[0] eq '--ipv6') {
+        $ipvnum = 6;
+    }
+    elsif($ARGV[0] eq '--gopher') {
+        $gopher = 1;
+    }
+    elsif($ARGV[0] eq '--port') {
+        if($ARGV[1] =~ /^(\d+)$/) {
+            $port = $1;
+            shift @ARGV;
         }
-        elsif($path =~ /verifiedserver/) {
-            # this is a hard-coded query-string for the test script
-            # to verify that this is the server actually running!
-            print "HTTP/1.1 999 WE ROOLZ: $PID\r\n";
-            exit;
+    }
+    elsif($ARGV[0] eq '--connect') {
+        if($ARGV[1]) {
+            $connect = $ARGV[1];
+            shift @ARGV;
         }
-        else {
-
-            #
-            # we always start the path with a number, this is the
-            # test number that this server will use to know what
-            # contents to pass back to the client
-            #
-            my $testnum;
-            if($path =~ /.*\/(\d*)/) {
-                $testnum=$1;
-            }
-            else {
-                $testnum=0;
-            }
-            open(INPUT, ">>log/server.input");
-
-            binmode(INPUT,":raw"); # this makes it work better on cygwin
-
-            for(@headers) {
-                print INPUT $_;
-            }
-            close(INPUT);
-            
-            if(0 == $testnum ) {
-                print "HTTP/1.1 200 OK\r\n",
-                "header: yes\r\n",
-                "\r\n",
-                "You must enter a test number to get good data back\r\n";
-            }
-            else {
-                my $part="";
-                if($testnum > 10000) {
-                    $part = $testnum % 10000;
-                    $testnum = sprintf("%d", $testnum/10000);
-                }
-                if($verbose) {
-                    print STDERR "OUT: sending reply $testnum (part $part)\n";
-                }
-
-                loadtest("data/test$testnum");
-
-
-                my @cmd = getpart("reply", "cmd");
-                performcmd(@cmd);
-
-                # flush data:
-                $| = 1;
-
-                # send a custom reply to the client
-                my @data = getpart("reply", "data$part");
-                for(@data) {
-                    print $_;
-                    if($verbose) {
-                        print STDERR "OUT: $_";
-                    }
-                }
-                my @postcmd = getpart("reply", "postcmd");
-                performcmd(@postcmd);
-            }
+    }
+    elsif($ARGV[0] eq '--id') {
+        if($ARGV[1] =~ /^(\d+)$/) {
+            $idnum = $1 if($1 > 0);
+            shift @ARGV;
         }
-     #   print "Hello there, $name, it's now ", scalar localtime, "\r\n";
-    };
-}
-
-
-sub spawn {
-    my $coderef = shift;
-
-
-    unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE') {
-        confess "usage: spawn CODEREF";
     }
-
-
-    my $pid;
-    if (!defined($pid = fork)) {
-        logmsg "cannot fork: $!";
-        return;
-    } elsif ($pid) {
-        logmsg "begat $pid";
-        return; # I'm the parent
+    elsif($ARGV[0] eq '--verbose') {
+        $verbose = 1;
+    }
+    else {
+        print STDERR "\nWarning: httpserver.pl unknown parameter: $ARGV[0]\n";
     }
-    # else I'm the child -- go spawn
+    shift @ARGV;
+}
 
+if(!$srcdir) {
+    $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+    $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+    $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
 
-    open(STDIN,  "<&Client")   || die "can't dup client to stdin";
-    open(STDOUT, ">&Client")   || die "can't dup client to stdout";
-    ## open(STDERR, ">&STDOUT") || die "can't dup stdout to stderr";
-    exit &$coderef();
+$flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+$flags .= "--gopher " if($gopher);
+$flags .= "--connect $connect " if($connect);
+$flags .= "--ipv$ipvnum --port $port --srcdir \"$srcdir\"";
+
+if($verbose) {
+    print STDERR "RUN: server/sws $flags\n";
 }
+
+exec("server/sws $flags");