# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
-# Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2016, 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
sshversioninfo
);
+use pathhelp;
+
require "getpart.pm"; # array functions
require "valgrind.pm"; # valgrind report parser
require "ftp.pm";
my $HTTPPROXYPORT; # HTTP proxy port, when using CONNECT
my $HTTPPIPEPORT; # HTTP pipelining port
my $HTTPUNIXPATH; # HTTP server Unix domain socket path
+my $HTTP2PORT; # HTTP/2 server port
my $srcdir = $ENV{'srcdir'} || '.';
my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests
# Load serverpidfile hash with pidfile names for all possible servers.
#
sub init_serverpidfile_hash {
- for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp')) {
+ for my $proto (('ftp', 'http', 'imap', 'pop3', 'smtp', 'http/2')) {
for my $ssl (('', 's')) {
for my $ipvnum ((4, 6)) {
for my $idnum ((1, 2, 3)) {
}
}
}
- for my $proto (('http', 'imap', 'pop3', 'smtp')) {
+ for my $proto (('http', 'imap', 'pop3', 'smtp', 'http/2')) {
for my $ssl (('', 's')) {
my $serv = servername_id("$proto$ssl", "unix", 1);
my $pidf = server_pidfilename("$proto$ssl", "unix", 1);
}
#######################################################################
+# start the http2 server
+#
+sub runhttp2server {
+ my ($verbose, $port) = @_;
+ my $server;
+ my $srvrname;
+ my $pidfile;
+ my $logfile;
+ my $flags = "";
+ my $proto="http/2";
+ my $ipvnum = 4;
+ my $idnum = 0;
+ my $exe = "$perl $srcdir/http2-server.pl";
+ my $verbose_flag = "--verbose ";
+
+ $server = servername_id($proto, $ipvnum, $idnum);
+
+ $pidfile = $serverpidfile{$server};
+
+ # don't retry if the server doesn't work
+ if ($doesntrun{$pidfile}) {
+ return (0,0);
+ }
+
+ my $pid = processexists($pidfile);
+ if($pid > 0) {
+ stopserver($server, "$pid");
+ }
+ unlink($pidfile) if(-f $pidfile);
+
+ $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+ $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
+ $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
+ $flags .= "--port $HTTP2PORT ";
+ $flags .= $verbose_flag if($debugprotocol);
+
+ my $cmd = "$exe $flags";
+ my ($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
+
+ if($http2pid <= 0 || !pidexists($http2pid)) {
+ # it is NOT alive
+ logmsg "RUN: failed to start the $srvrname server\n";
+ stopserver($server, "$pid2");
+ $doesntrun{$pidfile} = 1;
+ return (0,0);
+ }
+
+ if($verbose) {
+ logmsg "RUN: $srvrname server is now running PID $http2pid\n";
+ }
+
+ return ($http2pid, $pid2);
+}
+
+#######################################################################
# start the http server
#
sub runhttpserver {
$curl =~ s/^(.*)(libcurl.*)/$1/g;
$libcurl = $2;
- if($curl =~ /mingw(32|64)/) {
- # This is a windows minw32 build, we need to translate the
- # given path to the "actual" windows path. The MSYS shell
- # has a builtin 'pwd -W' command which converts the path.
- $pwd = `sh -c "echo \$(pwd -W)"`;
- chomp($pwd);
- }
- elsif ($curl =~ /win32/) {
- # Native Windows builds don't understand the
- # output of cygwin's pwd. It will be
- # something like /cygdrive/c/<some path>.
- #
- # Use the cygpath utility to convert the
- # working directory to a Windows friendly
- # path. The -m option converts to use drive
- # letter:, but it uses / instead \. Forward
- # slashes (/) are easier for us. We don't
- # have to escape them to get them to curl
- # through a shell.
- chomp($pwd = `cygpath -m $pwd`);
- }
+ if($curl =~ /win32|mingw(32|64)/) {
+ # This is a Windows MinGW build or native build, we need to use
+ # Win32-style path.
+ $pwd = pathhelp::sys_native_current_path();
+ }
if ($libcurl =~ /winssl/i) {
$has_winssl=1;
$ssllib="WinSSL";
}
elsif ($libcurl =~ /polarssl/i) {
$has_polarssl=1;
+ $has_sslpinning=1;
$ssllib="polarssl";
}
elsif ($libcurl =~ /axtls/i) {
if($feat =~ /HTTP2/) {
# http2 enabled
$has_http2=1;
+
+ push @protocols, 'http/2';
}
}
#
$$thing =~ s/%HTTPTLSPORT/$HTTPTLSPORT/g;
$$thing =~ s/%HTTP6PORT/$HTTP6PORT/g;
$$thing =~ s/%HTTPSPORT/$HTTPSPORT/g;
+ $$thing =~ s/%HTTP2PORT/$HTTP2PORT/g;
$$thing =~ s/%HTTPPORT/$HTTPPORT/g;
$$thing =~ s/%HTTPPIPEPORT/$HTTPPIPEPORT/g;
$$thing =~ s/%PROXYPORT/$HTTPPROXYPORT/g;
next;
}
}
- elsif($1 eq "http2") {
+ elsif($1 eq "http/2") {
if($has_http2) {
next;
}
# verify redirected stdout
my @actual = loadarray($STDOUT);
+ # what parts to cut off from stdout
+ my @stripfile = getpart("verify", "stripfile");
+
+ foreach my $strip (@stripfile) {
+ chomp $strip;
+ my @newgen;
+ for(@actual) {
+ eval $strip;
+ if($_) {
+ push @newgen, $_;
+ }
+ }
+ # this is to get rid of array entries that vanished (zero
+ # length) because of replacements
+ @actual = @newgen;
+ }
+
# variable-replace in the stdout we have from the test case file
@validstdout = fixarray(@validstdout);
for(@what) {
my (@whatlist) = split(/\s+/,$_);
my $what = lc($whatlist[0]);
- $what =~ s/[^a-z0-9-]//g;
+ $what =~ s/[^a-z0-9\/-]//g;
my $certfile;
if($what =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
$run{'gopher-ipv6'}="$pid $pid2";
}
}
+ elsif($what eq "http/2") {
+ if(!$run{'http/2'}) {
+ ($pid, $pid2) = runhttp2server($verbose, $HTTP2PORT);
+ if($pid <= 0) {
+ return "failed starting HTTP/2 server";
+ }
+ logmsg sprintf ("* pid http/2 => %d %d\n", $pid, $pid2)
+ if($verbose);
+ $run{'http/2'}="$pid $pid2";
+ }
+ }
elsif($what eq "http") {
if($torture && $run{'http'} &&
!responsive_http_server("http", $verbose, 0, $HTTPPORT)) {
$HTTPTLS6PORT = $base++; # HTTP TLS (non-stunnel) IPv6 server port
$HTTPPROXYPORT = $base++; # HTTP proxy port, when using CONNECT
$HTTPPIPEPORT = $base++; # HTTP pipelining port
+$HTTP2PORT = $base++; # HTTP/2 port
$HTTPUNIXPATH = 'http.sock'; # HTTP server Unix domain socket path
#######################################################################