-#!/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");