tests: add 3 new HTTP/2 test cases, plus https: support for nghttpx

- a simple https get
- a simple https post
- a multi get of 4 requests and check that same connection was used

Closes #10114
This commit is contained in:
Stefan Eissing 2022-12-19 12:31:06 +01:00 committed by Daniel Stenberg
parent db07301fbb
commit c7fb341c0e
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
8 changed files with 423 additions and 5 deletions

View File

@ -243,6 +243,8 @@ test2200 test2201 test2202 test2203 test2204 test2205 \
\
test2300 test2301 test2302 test2303 test2304 \
\
test2400 test2401 test2402 \
\
test2500 \
\
test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 \

64
tests/data/test2400 Normal file
View File

@ -0,0 +1,64 @@
<testcase>
<info>
<keywords>
HTTP
HTTP GET
HTTP/2
HTTPS
</keywords>
</info>
#
# Server-side
<reply>
<data nocheck="yes">
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
-foo-
</data>
</reply>
#
# Client-side
<client>
<features>
debug
h2c
SSL
</features>
<server>
http
http/2
</server>
<name>
HTTP/2 GET
</name>
<setenv>
</setenv>
<command>
-k --http2 "https://%HOSTIP:%HTTP2TLSPORT/%TESTNUMBER"
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<stdout crlf="yes">
HTTP/2 200
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 6
content-type: text/html
funny-head: yesyes
server: nghttpx
via: 1.1 nghttpx
-foo-
</stdout>
</verify>
</testcase>

72
tests/data/test2401 Normal file
View File

@ -0,0 +1,72 @@
<testcase>
<info>
<keywords>
HTTP
HTTP POST
HTTP/2
HTTPS
</keywords>
</info>
#
# Server-side
<reply>
<data nocheck="yes">
HTTP/1.1 201 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Connection: close
Content-Length: 0
Funny-head: yesyes
</data>
</reply>
#
# Client-side
<client>
<features>
debug
h2c
SSL
</features>
<server>
http
http/2
</server>
<name>
HTTP/2 GET
</name>
<setenv>
</setenv>
<command>
-k --http2 "https://%HOSTIP:%HTTP2TLSPORT/%TESTNUMBER" -d "moo"
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<stdout>
HTTP/2 201
date: Tue, 09 Nov 2010 14:49:00 GMT
content-length: 0
funny-head: yesyes
server: nghttpx
via: 1.1 nghttpx
</stdout>
<protocol nonewline="yes">
POST /2401 HTTP/1.1
Host: %HOSTIP:%HTTP2TLSPORT
User-Agent: curl/%VERSION
Accept: */*
Content-Length: 3
Content-Type: application/x-www-form-urlencoded
X-Forwarded-Proto: https
Via: 2 nghttpx
moo
</protocol>
</verify>
</testcase>

109
tests/data/test2402 Normal file
View File

@ -0,0 +1,109 @@
<testcase>
<info>
<keywords>
HTTP
HTTP/2
multi
verbose logs
</keywords>
</info>
# Server-side
<reply>
<data1 crlf=yes">
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Server: server.example.com
Content-Length: 47
file contents should appear once for each file
</data1>
<data2>
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Server: server.example.com
Content-Length: 47
file contents should appear once for each file
</data2>
<data3>
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Server: server.example.com
Content-Length: 47
file contents should appear once for each file
</data3>
<data4>
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Server: server.example.com
Content-Length: 47
file contents should appear once for each file
</data4>
</reply>
# Client-side
<client>
<features>
h2c
SSL
</features>
<server>
http
http/2
</server>
<tool>
lib%TESTNUMBER
</tool>
<name>
HTTP GET multiple over HTTP/2
</name>
<command>
https://%HOSTIP:%HTTP2TLSPORT/path/%TESTNUMBER %HOSTIP %HTTP2TLSPORT
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<protocol crlf="yes">
GET /path/%TESTNUMBER0001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
X-Forwarded-Proto: https
Via: 2 nghttpx
GET /path/%TESTNUMBER0002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
X-Forwarded-Proto: https
Via: 2 nghttpx
GET /path/%TESTNUMBER0003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
X-Forwarded-Proto: https
Via: 2 nghttpx
GET /path/%TESTNUMBER0004 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
X-Forwarded-Proto: https
Via: 2 nghttpx
</protocol>
<strip>
^Host:.*
</strip>
<file name="log/stderr%TESTNUMBER" mode="text">
* Connection #0 to host localhost left intact
* Connection #0 to host localhost left intact
* Connection #0 to host localhost left intact
* Connection #0 to host localhost left intact
</file>
<stripfile>
$_ = '' if (($_ !~ /left intact/) && ($_ !~ /Closing connection/))
</stripfile>
</verify>
</testcase>

View File

@ -25,13 +25,17 @@
# This script invokes nghttpx properly to have it serve HTTP/2 for us.
# nghttpx runs as a proxy in front of our "actual" HTTP/1 server.
use Cwd;
use Cwd 'abs_path';
my $pidfile = "log/nghttpx.pid";
my $logfile = "log/http2.log";
my $nghttpx = "nghttpx";
my $listenport = 9015;
my $listenport2 = 9016;
my $connect = "127.0.0.1,8990";
my $conf = "nghttpx.conf";
my $cert = "Server-localhost-sv";
#***************************************************************************
# Process command line options
@ -58,6 +62,12 @@ while(@ARGV) {
shift @ARGV;
}
}
elsif($ARGV[0] eq '--port2') {
if($ARGV[1]) {
$listenport2 = $ARGV[1];
shift @ARGV;
}
}
elsif($ARGV[0] eq '--connect') {
if($ARGV[1]) {
$connect = $ARGV[1];
@ -83,11 +93,20 @@ while(@ARGV) {
shift @ARGV;
}
my $path = getcwd();
my $srcdir = $path;
$certfile = "$srcdir/certs/$cert.pem";
$keyfile = "$srcdir/certs/$cert.key";
$certfile = abs_path($certfile);
$keyfile = abs_path($keyfile);
my $cmdline="$nghttpx --backend=$connect ".
"--frontend=\"*,$listenport;no-tls\" ".
"--frontend=\"*,$listenport2\" ".
"--log-level=INFO ".
"--pid-file=$pidfile ".
"--conf=$conf ".
"--errorlog-file=$logfile";
"--errorlog-file=$logfile ".
"$keyfile $certfile";
print "RUN: $cmdline\n" if($verbose);
system("$cmdline 2>/dev/null");

View File

@ -70,6 +70,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib1933 lib1934 lib1935 lib1936 lib1937 lib1938 lib1939 lib1940 \
lib1945 lib1946 lib1947 lib1948 lib1955 lib1956 lib1957 lib1958 lib1959 \
lib2301 lib2302 lib2304 \
lib2402 \
lib3010 lib3025 lib3026 lib3027 \
lib3100 lib3101
@ -798,6 +799,10 @@ lib2302_LDADD = $(TESTUTIL_LIBS)
lib2304_SOURCES = lib2304.c $(SUPPORTFILES)
lib2304_LDADD = $(TESTUTIL_LIBS)
lib2402_SOURCES = lib2402.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib2402_LDADD = $(TESTUTIL_LIBS)
lib2402_CPPFLAGS = $(AM_CPPFLAGS) -DLIB2402
lib3010_SOURCES = lib3010.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib3010_LDADD = $(TESTUTIL_LIBS)
lib3010_CPPFLAGS = $(AM_CPPFLAGS)

142
tests/libtest/lib2402.c Normal file
View File

@ -0,0 +1,142 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2013 - 2022, Linus Nielsen Feltzing <linus@haxx.se>
*
* 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 https://curl.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.
*
* SPDX-License-Identifier: curl
*
***************************************************************************/
#include "test.h"
#include "testutil.h"
#include "warnless.h"
#include "memdebug.h"
#define TEST_HANG_TIMEOUT 60 * 1000
#define NUM_HANDLES 4
int test(char *URL)
{
int res = 0;
CURL *curl[NUM_HANDLES] = {0};
int running;
CURLM *m = NULL;
int i;
char target_url[256];
char dnsentry[256];
struct curl_slist *slist = NULL;
char *port = libtest_arg3;
char *address = libtest_arg2;
(void)URL;
msnprintf(dnsentry, sizeof(dnsentry), "localhost:%s:%s",
port, address);
printf("%s\n", dnsentry);
slist = curl_slist_append(slist, dnsentry);
if(!slist) {
fprintf(stderr, "curl_slist_append() failed\n");
goto test_cleanup;
}
start_test_timing();
global_init(CURL_GLOBAL_ALL);
multi_init(m);
multi_setopt(m, CURLMOPT_MAXCONNECTS, 1L);
/* get NUM_HANDLES easy handles */
for(i = 0; i < NUM_HANDLES; i++) {
/* get an easy handle */
easy_init(curl[i]);
/* specify target */
msnprintf(target_url, sizeof(target_url),
"https://localhost:%s/path/2402%04i",
port, i + 1);
target_url[sizeof(target_url) - 1] = '\0';
easy_setopt(curl[i], CURLOPT_URL, target_url);
/* go http2 */
easy_setopt(curl[i], CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
/* no peer verify */
easy_setopt(curl[i], CURLOPT_SSL_VERIFYPEER, 0L);
easy_setopt(curl[i], CURLOPT_SSL_VERIFYHOST, 0L);
/* wait for first connection establised to see if we can share it */
easy_setopt(curl[i], CURLOPT_PIPEWAIT, 1L);
/* go verbose */
easy_setopt(curl[i], CURLOPT_VERBOSE, 1L);
/* include headers */
easy_setopt(curl[i], CURLOPT_HEADER, 1L);
easy_setopt(curl[i], CURLOPT_RESOLVE, slist);
}
fprintf(stderr, "Start at URL 0\n");
for(i = 0; i < NUM_HANDLES; i++) {
/* add handle to multi */
multi_add_handle(m, curl[i]);
for(;;) {
struct timeval interval;
fd_set rd, wr, exc;
int maxfd = -99;
interval.tv_sec = 1;
interval.tv_usec = 0;
multi_perform(m, &running);
abort_on_test_timeout();
if(!running)
break; /* done */
FD_ZERO(&rd);
FD_ZERO(&wr);
FD_ZERO(&exc);
multi_fdset(m, &rd, &wr, &exc, &maxfd);
/* At this point, maxfd is guaranteed to be greater or equal than -1. */
select_test(maxfd + 1, &rd, &wr, &exc, &interval);
abort_on_test_timeout();
}
wait_ms(1); /* to ensure different end times */
}
test_cleanup:
/* proper cleanup sequence - type PB */
for(i = 0; i < NUM_HANDLES; i++) {
curl_multi_remove_handle(m, curl[i]);
curl_easy_cleanup(curl[i]);
}
curl_slist_free_all(slist);
curl_multi_cleanup(m);
curl_global_cleanup();
return res;
}

View File

@ -158,7 +158,8 @@ my $GOPHER6PORT=$noport; # Gopher IPv6 server port
my $HTTPTLSPORT=$noport; # HTTP TLS (non-stunnel) server port
my $HTTPTLS6PORT=$noport; # HTTP TLS (non-stunnel) IPv6 server port
my $HTTPPROXYPORT=$noport; # HTTP proxy port, when using CONNECT
my $HTTP2PORT=$noport; # HTTP/2 server port
my $HTTP2PORT=$noport; # HTTP/2 no-tls server port
my $HTTP2TLSPORT=$noport; # HTTP/2 tls server port
my $HTTP3PORT=$noport; # HTTP/3 server port
my $DICTPORT=$noport; # DICT server port
my $SMBPORT=$noport; # SMB server port
@ -1561,9 +1562,11 @@ sub runhttp2server {
my ($http2pid, $pid2);
my $port = 23113;
my $port2 = 23114;
for(1 .. 10) {
$port += int(rand(900));
my $aflags = "--port $port $flags";
$port2 += int(rand(900));
my $aflags = "--port $port --port2 $port2 $flags";
my $cmd = "$exe $aflags";
($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
@ -1585,7 +1588,7 @@ sub runhttp2server {
logmsg "RUN: failed to start the $srvrname server\n" if(!$http2pid);
return ($http2pid, $pid2, $port);
return ($http2pid, $pid2, $port, $port2);
}
#######################################################################
@ -3507,6 +3510,7 @@ sub subVariables {
$$thing =~ s/${prefix}HTTPSPORT/$HTTPSPORT/g;
$$thing =~ s/${prefix}HTTPSPROXYPORT/$HTTPSPROXYPORT/g;
$$thing =~ s/${prefix}HTTP2PORT/$HTTP2PORT/g;
$$thing =~ s/${prefix}HTTP2TLSPORT/$HTTP2TLSPORT/g;
$$thing =~ s/${prefix}HTTP3PORT/$HTTP3PORT/g;
$$thing =~ s/${prefix}HTTPPORT/$HTTPPORT/g;
$$thing =~ s/${prefix}PROXYPORT/$HTTPPROXYPORT/g;
@ -5122,7 +5126,8 @@ sub startservers {
}
elsif($what eq "http/2") {
if(!$run{'http/2'}) {
($pid, $pid2, $HTTP2PORT) = runhttp2server($verbose);
($pid, $pid2, $HTTP2PORT, $HTTP2TLSPORT) =
runhttp2server($verbose);
if($pid <= 0) {
return "failed starting HTTP/2 server";
}