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:
parent
db07301fbb
commit
c7fb341c0e
@ -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
64
tests/data/test2400
Normal 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
72
tests/data/test2401
Normal 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
109
tests/data/test2402
Normal 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>
|
||||
@ -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");
|
||||
|
||||
@ -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
142
tests/libtest/lib2402.c
Normal 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;
|
||||
}
|
||||
@ -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";
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user