From 8440616f53056b2330393d1b0740c89a30376c67 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 13 Aug 2018 12:12:14 +0200 Subject: http: fix for tiny "HTTP/0.9" response Deal with tiny "HTTP/0.9" (header-less) responses by checking the status-line early, even before a full "HTTP/" is received to allow detecting 0.9 properly. Test 1266 and 1267 added to verify. Fixes #2420 Closes #2872 --- tests/FILEFORMAT | 1 + tests/data/Makefile.inc | 2 +- tests/data/test1266 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tests/data/test1267 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tests/runtests.pl | 2 +- tests/server/sws.c | 15 ++++++++++++--- 6 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 tests/data/test1266 create mode 100644 tests/data/test1267 (limited to 'tests') diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT index d584ac163..135ded6c1 100644 --- a/tests/FILEFORMAT +++ b/tests/FILEFORMAT @@ -169,6 +169,7 @@ connection-monitor When used, this will log [DISCONNECT] to the server.input log when the connection is disconnected. upgrade when an HTTP upgrade header is found, the server will upgrade to http2 +swsclose instruct server to close connection after response For TFTP: writedelay: [secs] delay this amount between reply packets (each packet being diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 66d86a6cd..20274b37c 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -139,7 +139,7 @@ test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \ test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \ test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \ test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \ -test1260 test1261 test1262 test1263 test1264 test1265 \ +test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \ \ test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \ test1288 test1289 test1290 test1291 test1292 \ diff --git a/tests/data/test1266 b/tests/data/test1266 new file mode 100644 index 000000000..75ed7bdc9 --- /dev/null +++ b/tests/data/test1266 @@ -0,0 +1,46 @@ + + + +HTTP/0.9 + + + +# +# Server-side + + +o + + +swsclose + + + +# +# Client-side + + +http + + +HTTP GET with a single-byte HTTP/0.9 response + + +http://%HOSTIP:%HTTPPORT/1266 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1266 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/data/test1267 b/tests/data/test1267 new file mode 100644 index 000000000..8f2a63b78 --- /dev/null +++ b/tests/data/test1267 @@ -0,0 +1,46 @@ + + + +HTTP/0.9 + + + +# +# Server-side + + +HTTPr + + +swsclose + + + +# +# Client-side + + +http + + +HTTP GET with a invalid HTTP/1 response line start + + +http://%HOSTIP:%HTTPPORT/1267 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1267 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + diff --git a/tests/runtests.pl b/tests/runtests.pl index 7e066fd4d..71625b1f3 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -152,7 +152,7 @@ my $NEGTELNETPORT; # TELNET server port with negotiation my $srcdir = $ENV{'srcdir'} || '.'; my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests -my $VCURL=$CURL; # what curl binary to use to verify the servers with +my $VCURL="curl"; # what curl binary to use to verify the servers with # VCURL is handy to set to the system one when the one you # just built hangs or crashes and thus prevent verification my $DBGCURL=$CURL; #"../src/.libs/curl"; # alternative for debugging diff --git a/tests/server/sws.c b/tests/server/sws.c index 4879cfa8b..fbe7761d8 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2017, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -124,6 +124,8 @@ struct httprequest { bool connmon; /* monitor the state of the connection, log disconnects */ bool upgrade; /* test case allows upgrade to http2 */ bool upgrade_request; /* upgrade request found and allowed */ + bool close; /* similar to swsclose in response: close connection after + response is sent */ int done_processing; }; @@ -177,6 +179,9 @@ const char *serverlogfile = DEFAULT_LOGFILE; /* upgrade to http2 */ #define CMD_UPGRADE "upgrade" +/* close connection */ +#define CMD_SWSCLOSE "swsclose" + #define END_OF_HEADERS "\r\n\r\n" enum { @@ -361,7 +366,7 @@ static int parse_servercmd(struct httprequest *req) int error; filename = test2file(req->testno); - + req->close = FALSE; stream = fopen(filename, "rb"); if(!stream) { error = errno; @@ -414,6 +419,10 @@ static int parse_servercmd(struct httprequest *req) logmsg("enabled upgrade to http2"); req->upgrade = TRUE; } + else if(!strncmp(CMD_SWSCLOSE, cmd, strlen(CMD_SWSCLOSE))) { + logmsg("swsclose: close this connection after response"); + req->close = TRUE; + } else if(1 == sscanf(cmd, "pipe: %d", &num)) { logmsg("instructed to allow a pipe size of %d", num); if(num < 0) @@ -1194,7 +1203,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) /* If the word 'swsclose' is present anywhere in the reply chunk, the connection will be closed after the data has been sent to the requesting client... */ - if(strstr(buffer, "swsclose") || !count) { + if(strstr(buffer, "swsclose") || !count || req->close) { persistent = FALSE; logmsg("connection close instruction \"swsclose\" found in response"); } -- cgit v1.2.3