Files
2022-09-16 11:48:59 +08:00

3672 lines
137 KiB
Diff

diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/CMakeLists.txt curl_h5/CMakeLists.txt
*** curl/CMakeLists.txt 2022-08-26 11:21:23.032000000 +0800
--- curl_h5/CMakeLists.txt 2022-08-26 11:21:58.876000000 +0800
***************
*** 991,996 ****
--- 991,997 ----
set(CMAKE_REQUIRED_LIBRARIES socket)
endif()
+ check_symbol_exists(fchmod "${CURL_INCLUDES}" HAVE_FCHMOD)
check_symbol_exists(basename "${CURL_INCLUDES}" HAVE_BASENAME)
check_symbol_exists(socket "${CURL_INCLUDES}" HAVE_SOCKET)
check_symbol_exists(select "${CURL_INCLUDES}" HAVE_SELECT)
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/configure.ac curl_h5/configure.ac
*** curl/configure.ac 2022-08-26 11:21:23.032000000 +0800
--- curl_h5/configure.ac 2022-08-26 11:21:58.876000000 +0800
***************
*** 3272,3277 ****
--- 3272,3278 ----
AC_CHECK_FUNCS([fnmatch \
+ fchmod \
geteuid \
getpass_r \
getppid \
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/docs/cmdline-opts/cookie.d curl_h5/docs/cmdline-opts/cookie.d
*** curl/docs/cmdline-opts/cookie.d 2022-08-26 11:21:23.040000000 +0800
--- curl_h5/docs/cmdline-opts/cookie.d 2022-08-26 11:21:58.884000000 +0800
***************
*** 5,13 ****
Help: Send cookies from string/file
Category: http
---
! Pass the data to the HTTP server in the Cookie header. It is supposedly
! the data previously received from the server in a "Set-Cookie:" line. The
! data should be in the format "NAME1=VALUE1; NAME2=VALUE2".
If no '=' symbol is used in the argument, it is instead treated as a filename
to read previously stored cookie from. This option also activates the cookie
--- 5,16 ----
Help: Send cookies from string/file
Category: http
---
! Pass the data to the HTTP server in the Cookie header. It is supposedly the
! data previously received from the server in a "Set-Cookie:" line. The data
! should be in the format "NAME1=VALUE1; NAME2=VALUE2". This makes curl use the
! cookie header with this content explicitly in all outgoing request(s). If
! multiple requests are done due to authentication, followed redirects or
! similar, they will all get this cookie passed on.
If no '=' symbol is used in the argument, it is instead treated as a filename
to read previously stored cookie from. This option also activates the cookie
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/HUAWEI-RELEASE curl_h5/HUAWEI-RELEASE
*** curl/HUAWEI-RELEASE 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/HUAWEI-RELEASE 2022-08-26 11:21:58.876000000 +0800
***************
*** 0 ****
--- 1 ----
+ RELEASE: h12
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/altsvc.c curl_h5/lib/altsvc.c
*** curl/lib/altsvc.c 2022-08-26 11:21:23.092000000 +0800
--- curl_h5/lib/altsvc.c 2022-08-26 11:21:58.940000000 +0800
***************
*** 34,40 ****
#include "parsedate.h"
#include "sendf.h"
#include "warnless.h"
! #include "rand.h"
#include "rename.h"
/* The last 3 #include files should be in this order */
--- 34,40 ----
#include "parsedate.h"
#include "sendf.h"
#include "warnless.h"
! #include "fopen.h"
#include "rename.h"
/* The last 3 #include files should be in this order */
***************
*** 329,336 ****
struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
! char *tempstore;
! unsigned char randsuffix[9];
if(!altsvc)
/* no cache activated */
--- 329,335 ----
struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
! char *tempstore = NULL;
if(!altsvc)
/* no cache activated */
***************
*** 344,360 ****
/* marked as read-only, no file or zero length file name */
return CURLE_OK;
! if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
! return CURLE_FAILED_INIT;
!
! tempstore = aprintf("%s.%s.tmp", file, randsuffix);
! if(!tempstore)
! return CURLE_OUT_OF_MEMORY;
!
! out = fopen(tempstore, FOPEN_WRITETEXT);
! if(!out)
! result = CURLE_WRITE_ERROR;
! else {
fputs("# Your alt-svc cache. https://curl.se/docs/alt-svc.html\n"
"# This file was generated by libcurl! Edit at your own risk.\n",
out);
--- 343,350 ----
/* marked as read-only, no file or zero length file name */
return CURLE_OK;
! result = Curl_fopen(data, file, &out, &tempstore);
! if(!result) {
fputs("# Your alt-svc cache. https://curl.se/docs/alt-svc.html\n"
"# This file was generated by libcurl! Edit at your own risk.\n",
out);
***************
*** 366,375 ****
break;
}
fclose(out);
! if(!result && Curl_rename(tempstore, file))
result = CURLE_WRITE_ERROR;
! if(result)
unlink(tempstore);
}
free(tempstore);
--- 356,365 ----
break;
}
fclose(out);
! if(!result && tempstore && Curl_rename(tempstore, file))
result = CURLE_WRITE_ERROR;
! if(result && tempstore)
unlink(tempstore);
}
free(tempstore);
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/conncache.c curl_h5/lib/conncache.c
*** curl/lib/conncache.c 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/conncache.c 2022-08-26 11:21:58.944000000 +0800
***************
*** 160,167 ****
/* report back which name we used */
*hostp = hostname;
! /* put the number first so that the hostname gets cut off if too long */
! msnprintf(buf, len, "%ld%s", port, hostname);
Curl_strntolower(buf, buf, len);
}
--- 160,171 ----
/* report back which name we used */
*hostp = hostname;
! /* put the numbers first so that the hostname gets cut off if too long */
! #ifdef ENABLE_IPV6
! msnprintf(buf, len, "%u/%ld/%s", conn->scope_id, port, hostname);
! #else
! msnprintf(buf, len, "%ld/%s", port, hostname);
! #endif
Curl_strntolower(buf, buf, len);
}
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/connect.c curl_h5/lib/connect.c
*** curl/lib/connect.c 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/connect.c 2022-08-26 11:21:58.944000000 +0800
***************
*** 619,624 ****
--- 619,625 ----
data->info.conn_scheme = conn->handler->scheme;
data->info.conn_protocol = conn->handler->protocol;
data->info.conn_primary_port = conn->port;
+ data->info.conn_remote_port = conn->remote_port;
data->info.conn_local_port = local_port;
}
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/content_encoding.c curl_h5/lib/content_encoding.c
*** curl/lib/content_encoding.c 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/content_encoding.c 2022-08-26 11:21:58.944000000 +0800
***************
*** 1025,1036 ****
--- 1025,1040 ----
return NULL;
}
+ /* allow no more than 5 "chained" compression steps */
+ #define MAX_ENCODE_STACK 5
+
/* Set-up the unencoding stack from the Content-Encoding header value.
* See RFC 7231 section 3.1.2.2. */
CURLcode Curl_build_unencoding_stack(struct Curl_easy *data,
const char *enclist, int maybechunked)
{
struct SingleRequest *k = &data->req;
+ int counter = 0;
do {
const char *name;
***************
*** 1065,1070 ****
--- 1069,1079 ----
if(!encoding)
encoding = &error_encoding; /* Defer error at stack use. */
+ if(++counter >= MAX_ENCODE_STACK) {
+ failf(data, "Reject response due to %u content encodings",
+ counter);
+ return CURLE_BAD_CONTENT_ENCODING;
+ }
/* Stack the unencoding stage. */
writer = new_unencoding_writer(data, encoding, k->writer_stack);
if(!writer)
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/cookie.c curl_h5/lib/cookie.c
*** curl/lib/cookie.c 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/cookie.c 2022-08-26 11:21:58.944000000 +0800
***************
*** 96,103 ****
#include "curl_get_line.h"
#include "curl_memrchr.h"
#include "parsedate.h"
- #include "rand.h"
#include "rename.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
--- 96,103 ----
#include "curl_get_line.h"
#include "curl_memrchr.h"
#include "parsedate.h"
#include "rename.h"
+ #include "fopen.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
***************
*** 469,474 ****
--- 469,478 ----
(void)data;
#endif
+ DEBUGASSERT(MAX_SET_COOKIE_AMOUNT <= 255); /* counter is an unsigned char */
+ if(data->req.setcookies >= MAX_SET_COOKIE_AMOUNT)
+ return NULL;
+
/* First, alloc and init a new struct for it */
co = calloc(1, sizeof(struct Cookie));
if(!co)
***************
*** 808,814 ****
freecookie(co);
return NULL;
}
!
}
else {
/*
--- 812,818 ----
freecookie(co);
return NULL;
}
! data->req.setcookies++;
}
else {
/*
***************
*** 1346,1352 ****
*
* It shall only return cookies that haven't expired.
*/
! struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
const char *host, const char *path,
bool secure)
{
--- 1350,1357 ----
*
* It shall only return cookies that haven't expired.
*/
! struct Cookie *Curl_cookie_getlist(struct Curl_easy *data,
! struct CookieInfo *c,
const char *host, const char *path,
bool secure)
{
***************
*** 1401,1406 ****
--- 1406,1416 ----
mainco = newco;
matches++;
+ if(matches >= MAX_COOKIE_SEND_AMOUNT) {
+ infof(data, "Included max number of cookies (%u) in request!",
+ matches);
+ break;
+ }
}
else
goto fail;
***************
*** 1602,1621 ****
use_stdout = TRUE;
}
else {
! unsigned char randsuffix[9];
!
! if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
! return 2;
!
! tempstore = aprintf("%s.%s.tmp", filename, randsuffix);
! if(!tempstore)
! return CURLE_OUT_OF_MEMORY;
!
! out = fopen(tempstore, FOPEN_WRITETEXT);
! if(!out) {
! error = CURLE_WRITE_ERROR;
goto error;
- }
}
fputs("# Netscape HTTP Cookie File\n"
--- 1612,1620 ----
use_stdout = TRUE;
}
else {
! error = Curl_fopen(data, filename, &out, &tempstore);
! if(error)
goto error;
}
fputs("# Netscape HTTP Cookie File\n"
***************
*** 1662,1668 ****
if(!use_stdout) {
fclose(out);
out = NULL;
! if(Curl_rename(tempstore, filename)) {
unlink(tempstore);
error = CURLE_WRITE_ERROR;
goto error;
--- 1661,1667 ----
if(!use_stdout) {
fclose(out);
out = NULL;
! if(tempstore && Curl_rename(tempstore, filename)) {
unlink(tempstore);
error = CURLE_WRITE_ERROR;
goto error;
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/cookie.h curl_h5/lib/cookie.h
*** curl/lib/cookie.h 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/cookie.h 2022-08-26 11:21:58.944000000 +0800
***************
*** 81,90 ****
*/
#define MAX_COOKIE_LINE 5000
! /* This is the maximum length of a cookie name or content we deal with: */
#define MAX_NAME 4096
#define MAX_NAME_TXT "4095"
struct Curl_easy;
/*
* Add a cookie to the internal list of cookies. The domain and path arguments
--- 81,106 ----
*/
#define MAX_COOKIE_LINE 5000
! /* Maximum length of an incoming cookie name or content we deal with. Longer
! cookies are ignored. */
#define MAX_NAME 4096
#define MAX_NAME_TXT "4095"
+ /* Maximum size for an outgoing cookie line libcurl will use in an http
+ request. This is the default maximum length used in some versions of Apache
+ httpd. */
+ #define MAX_COOKIE_HEADER_LEN 8190
+
+ /* Maximum number of cookies libcurl will send in a single request, even if
+ there might be more cookies that match. One reason to cap the number is to
+ keep the maximum HTTP request within the maximum allowed size. */
+ #define MAX_COOKIE_SEND_AMOUNT 150
+
+ /* Maximum number of Set-Cookie: lines accepted in a single response. If more
+ such header lines are received, they are ignored. This value must be less
+ than 256 since an unsigned char is used to count. */
+ #define MAX_SET_COOKIE_AMOUNT 50
+
struct Curl_easy;
/*
* Add a cookie to the internal list of cookies. The domain and path arguments
***************
*** 97,103 ****
const char *domain, const char *path,
bool secure);
! struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, const char *host,
const char *path, bool secure);
void Curl_cookie_freelist(struct Cookie *cookies);
void Curl_cookie_clearall(struct CookieInfo *cookies);
--- 113,120 ----
const char *domain, const char *path,
bool secure);
! struct Cookie *Curl_cookie_getlist(struct Curl_easy *data,
! struct CookieInfo *c, const char *host,
const char *path, bool secure);
void Curl_cookie_freelist(struct Cookie *cookies);
void Curl_cookie_clearall(struct CookieInfo *cookies);
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/curl_config.h.cmake curl_h5/lib/curl_config.h.cmake
*** curl/lib/curl_config.h.cmake 2022-08-26 11:21:23.096000000 +0800
--- curl_h5/lib/curl_config.h.cmake 2022-08-26 11:21:58.944000000 +0800
***************
*** 127,132 ****
--- 127,135 ----
/* Define to 1 if you have the <assert.h> header file. */
#cmakedefine HAVE_ASSERT_H 1
+ /* Define to 1 if you have the `fchmod' function. */
+ #cmakedefine HAVE_FCHMOD 1
+
/* Define to 1 if you have the `basename' function. */
#cmakedefine HAVE_BASENAME 1
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/fopen.c curl_h5/lib/fopen.c
*** curl/lib/fopen.c 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/lib/fopen.c 2022-08-26 11:21:58.952000000 +0800
***************
*** 0 ****
--- 1,113 ----
+ /***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2022, 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 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 "curl_setup.h"
+
+ #if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) || \
+ !defined(CURL_DISABLE_HSTS)
+
+ #ifdef HAVE_FCNTL_H
+ #include <fcntl.h>
+ #endif
+
+ #include "urldata.h"
+ #include "rand.h"
+ #include "fopen.h"
+ /* The last 3 #include files should be in this order */
+ #include "curl_printf.h"
+ #include "curl_memory.h"
+ #include "memdebug.h"
+
+ /*
+ * Curl_fopen() opens a file for writing with a temp name, to be renamed
+ * to the final name when completed. If there is an existing file using this
+ * name at the time of the open, this function will clone the mode from that
+ * file. if 'tempname' is non-NULL, it needs a rename after the file is
+ * written.
+ */
+ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
+ FILE **fh, char **tempname)
+ {
+ CURLcode result = CURLE_WRITE_ERROR;
+ unsigned char randsuffix[9];
+ char *tempstore = NULL;
+ struct_stat sb;
+ int fd = -1;
+ *tempname = NULL;
+
+ if(stat(filename, &sb) == -1 || !S_ISREG(sb.st_mode)) {
+ /* a non-regular file, fallback to direct fopen() */
+ *fh = fopen(filename, FOPEN_WRITETEXT);
+ if(*fh)
+ return CURLE_OK;
+ goto fail;
+ }
+
+ result = Curl_rand_hex(data, randsuffix, sizeof(randsuffix));
+ if(result)
+ goto fail;
+
+ tempstore = aprintf("%s.%s.tmp", filename, randsuffix);
+ if(!tempstore) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto fail;
+ }
+
+ result = CURLE_WRITE_ERROR;
+ fd = open(tempstore, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if(fd == -1)
+ goto fail;
+
+ #ifdef HAVE_FCHMOD
+ {
+ struct_stat nsb;
+ if((fstat(fd, &nsb) != -1) &&
+ (nsb.st_uid == sb.st_uid) && (nsb.st_gid == sb.st_gid)) {
+ /* if the user and group are the same, clone the original mode */
+ if(fchmod(fd, sb.st_mode) == -1)
+ goto fail;
+ }
+ }
+ #endif
+
+ *fh = fdopen(fd, FOPEN_WRITETEXT);
+ if(!*fh)
+ goto fail;
+
+ *tempname = tempstore;
+ return CURLE_OK;
+
+ fail:
+ if(fd != -1) {
+ close(fd);
+ unlink(tempstore);
+ }
+
+ free(tempstore);
+
+ *tempname = NULL;
+ return result;
+ }
+
+ #endif /* ! disabled */
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/fopen.h curl_h5/lib/fopen.h
*** curl/lib/fopen.h 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/lib/fopen.h 2022-08-26 11:21:58.952000000 +0800
***************
*** 0 ****
--- 1,30 ----
+ #ifndef HEADER_CURL_FOPEN_H
+ #define HEADER_CURL_FOPEN_H
+ /***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2022, 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 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
+ *
+ ***************************************************************************/
+
+ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
+ FILE **fh, char **tempname);
+
+ #endif
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/ftp.c curl_h5/lib/ftp.c
*** curl/lib/ftp.c 2022-08-26 11:21:23.104000000 +0800
--- curl_h5/lib/ftp.c 2022-08-26 11:21:58.952000000 +0800
***************
*** 2681,2689 ****
/* we have now received a full FTP server response */
switch(ftpc->state) {
case FTP_WAIT220:
! if(ftpcode == 230)
! /* 230 User logged in - already! */
! return ftp_state_user_resp(data, ftpcode, ftpc->state);
else if(ftpcode != 220) {
failf(data, "Got a %03d ftp-server response when 220 was expected",
ftpcode);
--- 2681,2692 ----
/* we have now received a full FTP server response */
switch(ftpc->state) {
case FTP_WAIT220:
! if(ftpcode == 230) {
! /* 230 User logged in - already! Take as 220 if TLS required. */
! if(data->set.use_ssl <= CURLUSESSL_TRY ||
! conn->bits.ftp_use_control_ssl)
! return ftp_state_user_resp(data, ftpcode, ftpc->state);
! }
else if(ftpcode != 220) {
failf(data, "Got a %03d ftp-server response when 220 was expected",
ftpcode);
***************
*** 2740,2745 ****
--- 2743,2751 ----
case FTP_AUTH:
/* we have gotten the response to a previous AUTH command */
+ if(pp->cache_size)
+ return CURLE_WEIRD_SERVER_REPLY; /* Forbid pipelining in response. */
+
/* RFC2228 (page 5) says:
*
* If the server is willing to accept the named security mechanism,
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/hsts.c curl_h5/lib/hsts.c
*** curl/lib/hsts.c 2022-08-26 11:21:23.104000000 +0800
--- curl_h5/lib/hsts.c 2022-08-26 11:21:58.956000000 +0800
***************
*** 35,41 ****
#include "sendf.h"
#include "strtoofft.h"
#include "parsedate.h"
! #include "rand.h"
#include "rename.h"
#include "strtoofft.h"
--- 35,41 ----
#include "sendf.h"
#include "strtoofft.h"
#include "parsedate.h"
! #include "fopen.h"
#include "rename.h"
#include "strtoofft.h"
***************
*** 325,332 ****
struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
! char *tempstore;
! unsigned char randsuffix[9];
if(!h)
/* no cache activated */
--- 325,331 ----
struct Curl_llist_element *n;
CURLcode result = CURLE_OK;
FILE *out;
! char *tempstore = NULL;
if(!h)
/* no cache activated */
***************
*** 340,356 ****
/* marked as read-only, no file or zero length file name */
goto skipsave;
! if(Curl_rand_hex(data, randsuffix, sizeof(randsuffix)))
! return CURLE_FAILED_INIT;
!
! tempstore = aprintf("%s.%s.tmp", file, randsuffix);
! if(!tempstore)
! return CURLE_OUT_OF_MEMORY;
!
! out = fopen(tempstore, FOPEN_WRITETEXT);
! if(!out)
! result = CURLE_WRITE_ERROR;
! else {
fputs("# Your HSTS cache. https://curl.se/docs/hsts.html\n"
"# This file was generated by libcurl! Edit at your own risk.\n",
out);
--- 339,346 ----
/* marked as read-only, no file or zero length file name */
goto skipsave;
! result = Curl_fopen(data, file, &out, &tempstore);
! if(!result) {
fputs("# Your HSTS cache. https://curl.se/docs/hsts.html\n"
"# This file was generated by libcurl! Edit at your own risk.\n",
out);
***************
*** 362,371 ****
break;
}
fclose(out);
! if(!result && Curl_rename(tempstore, file))
result = CURLE_WRITE_ERROR;
! if(result)
unlink(tempstore);
}
free(tempstore);
--- 352,361 ----
break;
}
fclose(out);
! if(!result && tempstore && Curl_rename(tempstore, file))
result = CURLE_WRITE_ERROR;
! if(result && tempstore)
unlink(tempstore);
}
free(tempstore);
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/http.c curl_h5/lib/http.c
*** curl/lib/http.c 2022-08-26 11:21:23.104000000 +0800
--- curl_h5/lib/http.c 2022-08-26 11:21:58.956000000 +0800
***************
*** 775,780 ****
--- 775,795 ----
return CURLE_OK;
}
+ /*
+ * Curl_allow_auth_to_host() tells if authentication, cookies or other
+ * "sensitive data" can (still) be sent to this host.
+ */
+ bool Curl_allow_auth_to_host(struct Curl_easy *data)
+ {
+ struct connectdata *conn = data->conn;
+ return (!data->state.this_is_a_follow ||
+ data->set.allow_auth_to_other_hosts ||
+ (data->state.first_host &&
+ strcasecompare(data->state.first_host, conn->host.name) &&
+ (data->state.first_remote_port == conn->remote_port) &&
+ (data->state.first_remote_protocol == conn->handler->protocol)));
+ }
+
/**
* Curl_http_output_auth() setups the authentication headers for the
* host/proxy and the correct authentication
***************
*** 847,863 ****
with it */
authproxy->done = TRUE;
! /* To prevent the user+password to get sent to other than the original
! host due to a location-follow, we do some weirdo checks here */
! if(!data->state.this_is_a_follow ||
#ifndef CURL_DISABLE_NETRC
! conn->bits.netrc ||
#endif
! !data->state.first_host ||
! data->set.allow_auth_to_other_hosts ||
! strcasecompare(data->state.first_host, conn->host.name)) {
result = output_auth_headers(data, conn, authhost, request, path, FALSE);
- }
else
authhost->done = TRUE;
--- 862,875 ----
with it */
authproxy->done = TRUE;
! /* To prevent the user+password to get sent to other than the original host
! due to a location-follow */
! if(Curl_allow_auth_to_host(data)
#ifndef CURL_DISABLE_NETRC
! || conn->bits.netrc
#endif
! )
result = output_auth_headers(data, conn, authhost, request, path, FALSE);
else
authhost->done = TRUE;
***************
*** 1913,1922 ****
checkprefix("Cookie:", compare)) &&
/* be careful of sending this potentially sensitive header to
other hosts */
! (data->state.this_is_a_follow &&
! data->state.first_host &&
! !data->set.allow_auth_to_other_hosts &&
! !strcasecompare(data->state.first_host, conn->host.name)))
;
else {
#ifdef USE_HYPER
--- 1925,1931 ----
checkprefix("Cookie:", compare)) &&
/* be careful of sending this potentially sensitive header to
other hosts */
! !Curl_allow_auth_to_host(data))
;
else {
#ifdef USE_HYPER
***************
*** 2088,2093 ****
--- 2097,2103 ----
return CURLE_OUT_OF_MEMORY;
data->state.first_remote_port = conn->remote_port;
+ data->state.first_remote_protocol = conn->handler->protocol;
}
Curl_safefree(data->state.aptr.host);
***************
*** 2697,2708 ****
--- 2707,2720 ----
}
#if !defined(CURL_DISABLE_COOKIES)
+
CURLcode Curl_http_cookies(struct Curl_easy *data,
struct connectdata *conn,
struct dynbuf *r)
{
CURLcode result = CURLE_OK;
char *addcookies = NULL;
+ bool linecap = FALSE;
if(data->set.str[STRING_COOKIE] && !Curl_checkheaders(data, "Cookie"))
addcookies = data->set.str[STRING_COOKIE];
***************
*** 2712,2718 ****
if(data->cookies && data->state.cookie_engine) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
! co = Curl_cookie_getlist(data->cookies,
data->state.aptr.cookiehost?
data->state.aptr.cookiehost:
conn->host.name,
--- 2724,2730 ----
if(data->cookies && data->state.cookie_engine) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
! co = Curl_cookie_getlist(data, data->cookies,
data->state.aptr.cookiehost?
data->state.aptr.cookiehost:
conn->host.name,
***************
*** 2731,2736 ****
--- 2743,2755 ----
if(result)
break;
}
+ if((Curl_dyn_len(r) + strlen(co->name) + strlen(co->value) + 1) >=
+ MAX_COOKIE_HEADER_LEN) {
+ infof(data, "Restricted outgoing cookies due to header size, "
+ "'%s' not sent", co->name);
+ linecap = TRUE;
+ break;
+ }
result = Curl_dyn_addf(r, "%s%s=%s", count?"; ":"",
co->name, co->value);
if(result)
***************
*** 2741,2747 ****
}
Curl_cookie_freelist(store);
}
! if(addcookies && !result) {
if(!count)
result = Curl_dyn_add(r, "Cookie: ");
if(!result) {
--- 2760,2766 ----
}
Curl_cookie_freelist(store);
}
! if(addcookies && !result && !linecap) {
if(!count)
result = Curl_dyn_add(r, "Cookie: ");
if(!result) {
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/http.h curl_h5/lib/http.h
*** curl/lib/http.h 2022-08-26 11:21:23.104000000 +0800
--- curl_h5/lib/http.h 2022-08-26 11:21:58.956000000 +0800
***************
*** 317,320 ****
--- 317,326 ----
bool proxytunnel); /* TRUE if this is the request setting
up the proxy tunnel */
+ /*
+ * Curl_allow_auth_to_host() tells if authentication, cookies or other
+ * "sensitive data" can (still) be sent to this host.
+ */
+ bool Curl_allow_auth_to_host(struct Curl_easy *data);
+
#endif /* HEADER_CURL_HTTP_H */
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/imap.c curl_h5/lib/imap.c
*** curl/lib/imap.c 2022-08-26 11:21:23.108000000 +0800
--- curl_h5/lib/imap.c 2022-08-26 11:21:58.960000000 +0800
***************
*** 935,956 ****
line += wordlen;
}
}
! else if(imapcode == IMAP_RESP_OK) {
! if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) {
! /* We don't have a SSL/TLS connection yet, but SSL is requested */
! if(imapc->tls_supported)
! /* Switch to TLS connection now */
! result = imap_perform_starttls(data, conn);
! else if(data->set.use_ssl == CURLUSESSL_TRY)
! /* Fallback and carry on with authentication */
! result = imap_perform_authentication(data, conn);
! else {
! failf(data, "STARTTLS not supported.");
! result = CURLE_USE_SSL_FAILED;
! }
}
! else
result = imap_perform_authentication(data, conn);
}
else
result = imap_perform_authentication(data, conn);
--- 935,952 ----
line += wordlen;
}
}
! else if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) {
! /* PREAUTH is not compatible with STARTTLS. */
! if(imapcode == IMAP_RESP_OK && imapc->tls_supported && !imapc->preauth) {
! /* Switch to TLS connection now */
! result = imap_perform_starttls(data, conn);
}
! else if(data->set.use_ssl <= CURLUSESSL_TRY)
result = imap_perform_authentication(data, conn);
+ else {
+ failf(data, "STARTTLS not available.");
+ result = CURLE_USE_SSL_FAILED;
+ }
}
else
result = imap_perform_authentication(data, conn);
***************
*** 968,973 ****
--- 964,973 ----
(void)instate; /* no use for this yet */
+ /* Pipelining in response is forbidden. */
+ if(data->conn->proto.imapc.pp.cache_size)
+ return CURLE_WEIRD_SERVER_REPLY;
+
if(imapcode != IMAP_RESP_OK) {
if(data->set.use_ssl != CURLUSESSL_TRY) {
failf(data, "STARTTLS denied");
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/krb5.c curl_h5/lib/krb5.c
*** curl/lib/krb5.c 2022-08-26 11:21:23.108000000 +0800
--- curl_h5/lib/krb5.c 2022-08-26 11:21:58.960000000 +0800
***************
*** 146,156 ****
enc.value = buf;
enc.length = len;
maj = gss_unwrap(&min, *context, &enc, &dec, NULL, NULL);
! if(maj != GSS_S_COMPLETE) {
! if(len >= 4)
! strcpy(buf, "599 ");
return -1;
- }
memcpy(buf, dec.value, dec.length);
len = curlx_uztosi(dec.length);
--- 146,153 ----
enc.value = buf;
enc.length = len;
maj = gss_unwrap(&min, *context, &enc, &dec, NULL, NULL);
! if(maj != GSS_S_COMPLETE)
return -1;
memcpy(buf, dec.value, dec.length);
len = curlx_uztosi(dec.length);
***************
*** 512,517 ****
--- 509,515 ----
{
int len;
CURLcode result;
+ int nread;
result = socket_read(fd, &len, sizeof(len));
if(result)
***************
*** 520,526 ****
if(len) {
/* only realloc if there was a length */
len = ntohl(len);
! buf->data = Curl_saferealloc(buf->data, len);
}
if(!len || !buf->data)
return CURLE_OUT_OF_MEMORY;
--- 518,527 ----
if(len) {
/* only realloc if there was a length */
len = ntohl(len);
! if(len > CURL_MAX_INPUT_LENGTH)
! len = 0;
! else
! buf->data = Curl_saferealloc(buf->data, len);
}
if(!len || !buf->data)
return CURLE_OUT_OF_MEMORY;
***************
*** 528,535 ****
result = socket_read(fd, buf->data, len);
if(result)
return result;
! buf->size = conn->mech->decode(conn->app_data, buf->data, len,
! conn->data_prot, conn);
buf->index = 0;
return CURLE_OK;
}
--- 529,539 ----
result = socket_read(fd, buf->data, len);
if(result)
return result;
! nread = conn->mech->decode(conn->app_data, buf->data, len,
! conn->data_prot, conn);
! if(nread < 0)
! return CURLE_RECV_ERROR;
! buf->size = (size_t)nread;
buf->index = 0;
return CURLE_OK;
}
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/Makefile.inc curl_h5/lib/Makefile.inc
*** curl/lib/Makefile.inc 2022-08-26 11:21:23.092000000 +0800
--- curl_h5/lib/Makefile.inc 2022-08-26 11:21:58.940000000 +0800
***************
*** 131,136 ****
--- 131,137 ----
escape.c \
file.c \
fileinfo.c \
+ fopen.c \
formdata.c \
ftp.c \
ftplistparser.c \
***************
*** 263,268 ****
--- 264,270 ----
escape.h \
file.h \
fileinfo.h \
+ fopen.h \
formdata.h \
ftp.h \
ftplistparser.h \
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/mqtt.c curl_h5/lib/mqtt.c
*** curl/lib/mqtt.c 2022-08-26 11:21:23.112000000 +0800
--- curl_h5/lib/mqtt.c 2022-08-26 11:21:58.960000000 +0800
***************
*** 128,133 ****
--- 128,137 ----
mq->sendleftovers = sendleftovers;
mq->nsend = nsend;
}
+ else {
+ mq->sendleftovers = NULL;
+ mq->nsend = 0;
+ }
return result;
}
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/pop3.c curl_h5/lib/pop3.c
*** curl/lib/pop3.c 2022-08-26 11:21:23.112000000 +0800
--- curl_h5/lib/pop3.c 2022-08-26 11:21:58.964000000 +0800
***************
*** 741,768 ****
}
}
}
- else if(pop3code == '+') {
- if(data->set.use_ssl && !conn->ssl[FIRSTSOCKET].use) {
- /* We don't have a SSL/TLS connection yet, but SSL is requested */
- if(pop3c->tls_supported)
- /* Switch to TLS connection now */
- result = pop3_perform_starttls(data, conn);
- else if(data->set.use_ssl == CURLUSESSL_TRY)
- /* Fallback and carry on with authentication */
- result = pop3_perform_authentication(data, conn);
- else {
- failf(data, "STLS not supported.");
- result = CURLE_USE_SSL_FAILED;
- }
- }
- else
- result = pop3_perform_authentication(data, conn);
- }
else {
/* Clear text is supported when CAPA isn't recognised */
! pop3c->authtypes |= POP3_TYPE_CLEARTEXT;
! result = pop3_perform_authentication(data, conn);
}
return result;
--- 741,763 ----
}
}
}
else {
/* Clear text is supported when CAPA isn't recognised */
! if(pop3code != '+')
! pop3c->authtypes |= POP3_TYPE_CLEARTEXT;
! if(!data->set.use_ssl || conn->ssl[FIRSTSOCKET].use)
! result = pop3_perform_authentication(data, conn);
! else if(pop3code == '+' && pop3c->tls_supported)
! /* Switch to TLS connection now */
! result = pop3_perform_starttls(data, conn);
! else if(data->set.use_ssl <= CURLUSESSL_TRY)
! /* Fallback and carry on with authentication */
! result = pop3_perform_authentication(data, conn);
! else {
! failf(data, "STLS not supported.");
! result = CURLE_USE_SSL_FAILED;
! }
}
return result;
***************
*** 777,782 ****
--- 772,781 ----
CURLcode result = CURLE_OK;
(void)instate; /* no use for this yet */
+ /* Pipelining in response is forbidden. */
+ if(data->conn->proto.pop3c.pp.cache_size)
+ return CURLE_WEIRD_SERVER_REPLY;
+
if(pop3code != '+') {
if(data->set.use_ssl != CURLUSESSL_TRY) {
failf(data, "STARTTLS denied");
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/setopt.c curl_h5/lib/setopt.c
*** curl/lib/setopt.c 2022-08-26 11:21:23.116000000 +0800
--- curl_h5/lib/setopt.c 2022-08-26 11:21:58.968000000 +0800
***************
*** 2311,2316 ****
--- 2311,2317 ----
case CURLOPT_SSL_OPTIONS:
arg = va_arg(param, long);
+ data->set.ssl.primary.ssl_options = (unsigned char)(arg & 0xff);
data->set.ssl.enable_beast = !!(arg & CURLSSLOPT_ALLOW_BEAST);
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
data->set.ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
***************
*** 2324,2329 ****
--- 2325,2331 ----
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_SSL_OPTIONS:
arg = va_arg(param, long);
+ data->set.proxy_ssl.primary.ssl_options = (unsigned char)(arg & 0xff);
data->set.proxy_ssl.enable_beast = !!(arg & CURLSSLOPT_ALLOW_BEAST);
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
data->set.proxy_ssl.no_partialchain = !!(arg & CURLSSLOPT_NO_PARTIALCHAIN);
***************
*** 2744,2792 ****
case CURLOPT_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME],
va_arg(param, char *));
! if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
! data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
break;
case CURLOPT_PROXY_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
va_arg(param, char *));
#ifndef CURL_DISABLE_PROXY
! if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
! !data->set.proxy_ssl.authtype)
! data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
#endif
break;
case CURLOPT_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD],
va_arg(param, char *));
! if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
! data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
break;
case CURLOPT_PROXY_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
va_arg(param, char *));
#ifndef CURL_DISABLE_PROXY
if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
! !data->set.proxy_ssl.authtype)
! data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
#endif
break;
case CURLOPT_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
if(!argptr ||
strncasecompare(argptr, "SRP", strlen("SRP")))
! data->set.ssl.authtype = CURL_TLSAUTH_SRP;
else
! data->set.ssl.authtype = CURL_TLSAUTH_NONE;
break;
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
if(!argptr ||
strncasecompare(argptr, "SRP", strlen("SRP")))
! data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP;
else
! data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE;
break;
#endif
#endif
--- 2746,2796 ----
case CURLOPT_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME],
va_arg(param, char *));
! if(data->set.str[STRING_TLSAUTH_USERNAME] &&
! !data->set.ssl.primary.authtype)
! data->set.ssl.primary.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
break;
case CURLOPT_PROXY_TLSAUTH_USERNAME:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY],
va_arg(param, char *));
#ifndef CURL_DISABLE_PROXY
! if(data->set.str[STRING_TLSAUTH_USERNAME] &&
! !data->set.ssl.primary.authtype)
! data->set.ssl.primary.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
#endif
break;
case CURLOPT_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD],
va_arg(param, char *));
! if(data->set.str[STRING_TLSAUTH_USERNAME] &&
! !data->set.ssl.primary.authtype)
! data->set.ssl.primary.authtype = CURL_TLSAUTH_SRP; /* default */
break;
case CURLOPT_PROXY_TLSAUTH_PASSWORD:
result = Curl_setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY],
va_arg(param, char *));
#ifndef CURL_DISABLE_PROXY
if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] &&
! !data->set.proxy_ssl.primary.authtype)
! data->set.proxy_ssl.primary.authtype = CURL_TLSAUTH_SRP; /* default */
#endif
break;
case CURLOPT_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
if(!argptr ||
strncasecompare(argptr, "SRP", strlen("SRP")))
! data->set.ssl.primary.authtype = CURL_TLSAUTH_SRP;
else
! data->set.ssl.primary.authtype = CURL_TLSAUTH_NONE;
break;
#ifndef CURL_DISABLE_PROXY
case CURLOPT_PROXY_TLSAUTH_TYPE:
argptr = va_arg(param, char *);
if(!argptr ||
strncasecompare(argptr, "SRP", strlen("SRP")))
! data->set.proxy_ssl.primary.authtype = CURL_TLSAUTH_SRP;
else
! data->set.proxy_ssl.primary.authtype = CURL_TLSAUTH_NONE;
break;
#endif
#endif
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/smtp.c curl_h5/lib/smtp.c
*** curl/lib/smtp.c 2022-08-26 11:21:23.116000000 +0800
--- curl_h5/lib/smtp.c 2022-08-26 11:21:58.968000000 +0800
***************
*** 835,840 ****
--- 835,844 ----
CURLcode result = CURLE_OK;
(void)instate; /* no use for this yet */
+ /* Pipelining in response is forbidden. */
+ if(data->conn->proto.smtpc.pp.cache_size)
+ return CURLE_WEIRD_SERVER_REPLY;
+
if(smtpcode != 220) {
if(data->set.use_ssl != CURLUSESSL_TRY) {
failf(data, "STARTTLS denied, code %d", smtpcode);
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/strcase.c curl_h5/lib/strcase.c
*** curl/lib/strcase.c 2022-08-26 11:21:23.116000000 +0800
--- curl_h5/lib/strcase.c 2022-08-26 11:21:58.968000000 +0800
***************
*** 251,256 ****
--- 251,266 ----
} while(*src++ && --n);
}
+ /* Compare case-sensitive NUL-terminated strings, taking care of possible
+ * null pointers. Return true if arguments match.
+ */
+ bool Curl_safecmp(char *a, char *b)
+ {
+ if(a && b)
+ return !strcmp(a, b);
+ return !a && !b;
+ }
+
/* --- public functions --- */
int curl_strequal(const char *first, const char *second)
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/strcase.h curl_h5/lib/strcase.h
*** curl/lib/strcase.h 2022-08-26 11:21:23.116000000 +0800
--- curl_h5/lib/strcase.h 2022-08-26 11:21:58.968000000 +0800
***************
*** 48,51 ****
--- 48,53 ----
void Curl_strntoupper(char *dest, const char *src, size_t n);
void Curl_strntolower(char *dest, const char *src, size_t n);
+ bool Curl_safecmp(char *a, char *b);
+
#endif /* HEADER_CURL_STRCASE_H */
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/transfer.c curl_h5/lib/transfer.c
*** curl/lib/transfer.c 2022-08-26 11:21:23.120000000 +0800
--- curl_h5/lib/transfer.c 2022-08-26 11:21:58.972000000 +0800
***************
*** 1652,1661 ****
return CURLE_OUT_OF_MEMORY;
}
else {
-
uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
if(uc)
return Curl_uc_to_curlcode(uc);
}
if(type == FOLLOW_FAKE) {
--- 1652,1708 ----
return CURLE_OUT_OF_MEMORY;
}
else {
uc = curl_url_get(data->state.uh, CURLUPART_URL, &newurl, 0);
if(uc)
return Curl_uc_to_curlcode(uc);
+
+ /* Clear auth if this redirects to a different port number or protocol,
+ unless permitted */
+ if(!data->set.allow_auth_to_other_hosts && (type != FOLLOW_FAKE)) {
+ char *portnum;
+ int port;
+ bool clear = FALSE;
+
+ if(data->set.use_port && data->state.allow_port)
+ /* a custom port is used */
+ port = (int)data->set.use_port;
+ else {
+ uc = curl_url_get(data->state.uh, CURLUPART_PORT, &portnum,
+ CURLU_DEFAULT_PORT);
+ if(uc) {
+ free(newurl);
+ return Curl_uc_to_curlcode(uc);
+ }
+ port = atoi(portnum);
+ free(portnum);
+ }
+ if(port != data->info.conn_remote_port) {
+ infof(data, "Clear auth, redirects to port from %u to %u",
+ data->info.conn_remote_port, port);
+ clear = TRUE;
+ }
+ else {
+ char *scheme;
+ const struct Curl_handler *p;
+ uc = curl_url_get(data->state.uh, CURLUPART_SCHEME, &scheme, 0);
+ if(uc) {
+ free(newurl);
+ return Curl_uc_to_curlcode(uc);
+ }
+
+ p = Curl_builtin_scheme(scheme);
+ if(p && (p->protocol != data->info.conn_protocol)) {
+ infof(data, "Clear auth, redirects scheme from %s to %s",
+ data->info.conn_scheme, scheme);
+ clear = TRUE;
+ }
+ free(scheme);
+ }
+ if(clear) {
+ Curl_safefree(data->state.aptr.user);
+ Curl_safefree(data->state.aptr.passwd);
+ }
+ }
}
if(type == FOLLOW_FAKE) {
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/url.c curl_h5/lib/url.c
*** curl/lib/url.c 2022-08-26 11:21:23.120000000 +0800
--- curl_h5/lib/url.c 2022-08-26 11:21:58.972000000 +0800
***************
*** 547,553 ****
set->ssl.primary.verifypeer = TRUE;
set->ssl.primary.verifyhost = TRUE;
#ifdef USE_TLS_SRP
! set->ssl.authtype = CURL_TLSAUTH_NONE;
#endif
set->ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth
type */
--- 547,553 ----
set->ssl.primary.verifypeer = TRUE;
set->ssl.primary.verifyhost = TRUE;
#ifdef USE_TLS_SRP
! set->ssl.primary.authtype = CURL_TLSAUTH_NONE;
#endif
set->ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth
type */
***************
*** 784,789 ****
--- 784,790 ----
Curl_safefree(conn->passwd);
Curl_safefree(conn->sasl_authzid);
Curl_safefree(conn->options);
+ Curl_safefree(conn->oauth_bearer);
Curl_dyn_free(&conn->trailer);
Curl_safefree(conn->host.rawalloc); /* host name buffer */
Curl_safefree(conn->conn_to_host.rawalloc); /* host name buffer */
***************
*** 1088,1093 ****
--- 1089,1100 ----
}
}
+ static bool ssh_config_matches(struct connectdata *one,
+ struct connectdata *two)
+ {
+ return (Curl_safecmp(one->proto.sshc.rsa, two->proto.sshc.rsa) &&
+ Curl_safecmp(one->proto.sshc.rsa_pub, two->proto.sshc.rsa_pub));
+ }
/*
* Given one filled in connection struct (named needle), this function should
* detect if there already is one that has all the significant details
***************
*** 1332,1338 ****
/* This protocol requires credentials per connection,
so verify that we're using the same name and password as well */
if(strcmp(needle->user, check->user) ||
! strcmp(needle->passwd, check->passwd)) {
/* one of them was different */
continue;
}
--- 1339,1347 ----
/* This protocol requires credentials per connection,
so verify that we're using the same name and password as well */
if(strcmp(needle->user, check->user) ||
! strcmp(needle->passwd, check->passwd) ||
! !Curl_safecmp(needle->sasl_authzid, check->sasl_authzid) ||
! !Curl_safecmp(needle->oauth_bearer, check->oauth_bearer)) {
/* one of them was different */
continue;
}
***************
*** 1345,1350 ****
--- 1354,1364 ----
(data->state.httpwant < CURL_HTTP_VERSION_2_0))
continue;
+ if(get_protocol_family(needle->handler) == PROTO_FAMILY_SSH) {
+ if(!ssh_config_matches(needle, check))
+ continue;
+ }
+
if((needle->handler->flags&PROTOPT_SSL)
#ifndef CURL_DISABLE_PROXY
|| !needle->bits.httpproxy || needle->bits.tunnel_proxy
***************
*** 1745,1755 ****
--- 1759,1775 ----
conn->ssl_config.verifystatus = data->set.ssl.primary.verifystatus;
conn->ssl_config.verifypeer = data->set.ssl.primary.verifypeer;
conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
+ conn->ssl_config.ssl_options = data->set.ssl.primary.ssl_options;
+ #ifdef USE_TLS_SRP
+ #endif
#ifndef CURL_DISABLE_PROXY
conn->proxy_ssl_config.verifystatus =
data->set.proxy_ssl.primary.verifystatus;
conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer;
conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
+ conn->proxy_ssl_config.ssl_options = data->set.proxy_ssl.primary.ssl_options;
+ #ifdef USE_TLS_SRP
+ #endif
#endif
conn->ip_version = data->set.ipver;
conn->bits.connect_only = data->set.connect_only;
***************
*** 3592,3597 ****
--- 3612,3625 ----
}
}
+ if(data->set.str[STRING_BEARER]) {
+ conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]);
+ if(!conn->oauth_bearer) {
+ result = CURLE_OUT_OF_MEMORY;
+ goto out;
+ }
+ }
+
#ifdef USE_UNIX_SOCKETS
if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
***************
*** 3794,3800 ****
data->set.str[STRING_SSL_ISSUERCERT_PROXY];
data->set.proxy_ssl.primary.issuercert_blob =
data->set.blobs[BLOB_SSL_ISSUERCERT_PROXY];
! data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY];
data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY];
data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY];
data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY];
--- 3822,3829 ----
data->set.str[STRING_SSL_ISSUERCERT_PROXY];
data->set.proxy_ssl.primary.issuercert_blob =
data->set.blobs[BLOB_SSL_ISSUERCERT_PROXY];
! data->set.proxy_ssl.primary.CRLfile =
! data->set.str[STRING_SSL_CRLFILE_PROXY];
data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY];
data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY];
data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY];
***************
*** 3802,3819 ****
data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY];
data->set.proxy_ssl.key_blob = data->set.blobs[BLOB_KEY_PROXY];
#endif
! data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE];
data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE];
data->set.ssl.key = data->set.str[STRING_KEY];
data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE];
data->set.ssl.key_passwd = data->set.str[STRING_KEY_PASSWD];
data->set.ssl.primary.clientcert = data->set.str[STRING_CERT];
#ifdef USE_TLS_SRP
! data->set.ssl.username = data->set.str[STRING_TLSAUTH_USERNAME];
! data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD];
#ifndef CURL_DISABLE_PROXY
! data->set.proxy_ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_PROXY];
! data->set.proxy_ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD_PROXY];
#endif
#endif
data->set.ssl.key_blob = data->set.blobs[BLOB_KEY];
--- 3831,3850 ----
data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY];
data->set.proxy_ssl.key_blob = data->set.blobs[BLOB_KEY_PROXY];
#endif
! data->set.ssl.primary.CRLfile = data->set.str[STRING_SSL_CRLFILE];
data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE];
data->set.ssl.key = data->set.str[STRING_KEY];
data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE];
data->set.ssl.key_passwd = data->set.str[STRING_KEY_PASSWD];
data->set.ssl.primary.clientcert = data->set.str[STRING_CERT];
#ifdef USE_TLS_SRP
! data->set.ssl.primary.username = data->set.str[STRING_TLSAUTH_USERNAME];
! data->set.ssl.primary.password = data->set.str[STRING_TLSAUTH_PASSWORD];
#ifndef CURL_DISABLE_PROXY
! data->set.proxy_ssl.primary.username =
! data->set.str[STRING_TLSAUTH_USERNAME_PROXY];
! data->set.proxy_ssl.primary.password =
! data->set.str[STRING_TLSAUTH_PASSWORD_PROXY];
#endif
#endif
data->set.ssl.key_blob = data->set.blobs[BLOB_KEY];
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/urldata.h curl_h5/lib/urldata.h
*** curl/lib/urldata.h 2022-08-26 11:21:23.120000000 +0800
--- curl_h5/lib/urldata.h 2022-08-26 11:21:58.976000000 +0800
***************
*** 253,262 ****
--- 253,269 ----
char *cipher_list; /* list of ciphers to use */
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
char *pinned_key;
+ char *CRLfile; /* CRL to check certificate revocation */
struct curl_blob *cert_blob;
struct curl_blob *ca_info_blob;
struct curl_blob *issuercert_blob;
+ #ifdef USE_TLS_SRP
+ char *username; /* TLS username (for, e.g., SRP) */
+ char *password; /* TLS password (for, e.g., SRP) */
+ enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
+ #endif
char *curves; /* list of curves to use */
+ unsigned char ssl_options; /* the CURLOPT_SSL_OPTIONS bitmask */
BIT(verifypeer); /* set TRUE if this is desired */
BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
BIT(verifystatus); /* set TRUE if certificate status must be checked */
***************
*** 266,272 ****
struct ssl_config_data {
struct ssl_primary_config primary;
long certverifyresult; /* result from the certificate verification */
- char *CRLfile; /* CRL to check certificate revocation */
curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
void *fsslctxp; /* parameter for call back */
char *cert_type; /* format for certificate (default: PEM)*/
--- 273,278 ----
***************
*** 274,284 ****
struct curl_blob *key_blob;
char *key_type; /* format for private key (default: PEM) */
char *key_passwd; /* plain text private key password */
- #ifdef USE_TLS_SRP
- char *username; /* TLS username (for, e.g., SRP) */
- char *password; /* TLS password (for, e.g., SRP) */
- enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
- #endif
BIT(certinfo); /* gather lots of certificate info */
BIT(falsestart);
BIT(enable_beast); /* allow this flaw for interoperability's sake*/
--- 280,285 ----
***************
*** 704,709 ****
--- 705,711 ----
#ifndef CURL_DISABLE_DOH
struct dohdata *doh; /* DoH specific data for this request */
#endif
+ unsigned char setcookies;
BIT(header); /* incoming data has HTTP header */
BIT(content_range); /* set TRUE if Content-Range: was found */
BIT(upload_done); /* set to TRUE when doing chunked transfer-encoding
***************
*** 979,984 ****
--- 981,987 ----
char *passwd; /* password string, allocated */
char *options; /* options string, allocated */
char *sasl_authzid; /* authorisation identity string, allocated */
+ char *oauth_bearer; /* OAUTH2 bearer, allocated */
unsigned char httpversion; /* the HTTP version*10 reported by the server */
struct curltime now; /* "current" time */
struct curltime created; /* creation time */
***************
*** 1154,1160 ****
reused, in the connection cache. */
char conn_primary_ip[MAX_IPADR_LEN];
! int conn_primary_port;
char conn_local_ip[MAX_IPADR_LEN];
int conn_local_port;
const char *conn_scheme;
--- 1157,1167 ----
reused, in the connection cache. */
char conn_primary_ip[MAX_IPADR_LEN];
! int conn_primary_port; /* this is the destination port to the connection,
! which might have been a proxy */
! int conn_remote_port; /* this is the "remote port", which is the port
! number of the used URL, independent of proxy or
! not */
char conn_local_ip[MAX_IPADR_LEN];
int conn_local_port;
const char *conn_scheme;
***************
*** 1323,1336 ****
char *ulbuf; /* allocated upload buffer or NULL */
curl_off_t current_speed; /* the ProgressShow() function sets this,
bytes / second */
! char *first_host; /* host name of the first (not followed) request.
! if set, this should be the host name that we will
! sent authorization to, no else. Used to make Location:
! following not keep sending user+password... This is
! strdup() data.
! */
int retrycount; /* number of retries on a new connection */
- int first_remote_port; /* remote port of the first (not followed) request */
struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
long sessionage; /* number of the most recent session */
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
--- 1330,1345 ----
char *ulbuf; /* allocated upload buffer or NULL */
curl_off_t current_speed; /* the ProgressShow() function sets this,
bytes / second */
!
! /* host name, port number and protocol of the first (not followed) request.
! if set, this should be the host name that we will sent authorization to,
! no else. Used to make Location: following not keep sending user+password.
! This is strdup()ed data. */
! char *first_host;
! int first_remote_port;
! unsigned int first_remote_protocol;
!
int retrycount; /* number of retries on a new connection */
struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
long sessionage; /* number of the most recent session */
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vssh/ssh.h curl_h5/lib/vssh/ssh.h
*** curl/lib/vssh/ssh.h 2022-08-26 11:21:23.124000000 +0800
--- curl_h5/lib/vssh/ssh.h 2022-08-26 11:21:58.976000000 +0800
***************
*** 7,13 ****
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
! * Copyright (C) 1998 - 2021, 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
--- 7,13 ----
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
! * Copyright (C) 1998 - 2022, 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
***************
*** 131,138 ****
/* common */
const char *passphrase; /* pass-phrase to use */
! char *rsa_pub; /* path name */
! char *rsa; /* path name */
bool authed; /* the connection has been authenticated fine */
bool acceptfail; /* used by the SFTP_QUOTE (continue if
quote command fails) */
--- 131,138 ----
/* common */
const char *passphrase; /* pass-phrase to use */
! char *rsa_pub; /* strdup'ed public key file */
! char *rsa; /* strdup'ed private key file */
bool authed; /* the connection has been authenticated fine */
bool acceptfail; /* used by the SFTP_QUOTE (continue if
quote command fails) */
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vtls/gtls.c curl_h5/lib/vtls/gtls.c
*** curl/lib/vtls/gtls.c 2022-08-26 11:21:23.128000000 +0800
--- curl_h5/lib/vtls/gtls.c 2022-08-26 11:21:58.980000000 +0800
***************
*** 431,438 ****
}
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
! infof(data, "Using TLS-SRP username: %s", SSL_SET_OPTION(username));
rc = gnutls_srp_allocate_client_credentials(
&backend->srp_client_cred);
--- 431,439 ----
}
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(primary.authtype) == CURL_TLSAUTH_SRP) {
! infof(data, "Using TLS-SRP username: %s",
! SSL_SET_OPTION(primary.username));
rc = gnutls_srp_allocate_client_credentials(
&backend->srp_client_cred);
***************
*** 443,450 ****
}
rc = gnutls_srp_set_client_credentials(backend->srp_client_cred,
! SSL_SET_OPTION(username),
! SSL_SET_OPTION(password));
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_srp_set_client_cred() failed: %s",
gnutls_strerror(rc));
--- 444,451 ----
}
rc = gnutls_srp_set_client_credentials(backend->srp_client_cred,
! SSL_SET_OPTION(primary.username),
! SSL_SET_OPTION(primary.password));
if(rc != GNUTLS_E_SUCCESS) {
failf(data, "gnutls_srp_set_client_cred() failed: %s",
gnutls_strerror(rc));
***************
*** 500,518 ****
}
#endif
! if(SSL_SET_OPTION(CRLfile)) {
/* set the CRL list file */
rc = gnutls_certificate_set_x509_crl_file(backend->cred,
! SSL_SET_OPTION(CRLfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
failf(data, "error reading crl file %s (%s)",
! SSL_SET_OPTION(CRLfile), gnutls_strerror(rc));
return CURLE_SSL_CRL_BADFILE;
}
else
infof(data, "found %d CRL in %s",
! rc, SSL_SET_OPTION(CRLfile));
}
/* Initialize TLS session as a client */
--- 501,519 ----
}
#endif
! if(SSL_SET_OPTION(primary.CRLfile)) {
/* set the CRL list file */
rc = gnutls_certificate_set_x509_crl_file(backend->cred,
! SSL_SET_OPTION(primary.CRLfile),
GNUTLS_X509_FMT_PEM);
if(rc < 0) {
failf(data, "error reading crl file %s (%s)",
! SSL_SET_OPTION(primary.CRLfile), gnutls_strerror(rc));
return CURLE_SSL_CRL_BADFILE;
}
else
infof(data, "found %d CRL in %s",
! rc, SSL_SET_OPTION(primary.CRLfile));
}
/* Initialize TLS session as a client */
***************
*** 585,591 ****
#ifdef HAVE_GNUTLS_SRP
/* Only add SRP to the cipher list if SRP is requested. Otherwise
* GnuTLS will disable TLS 1.3 support. */
! if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
size_t len = strlen(prioritylist);
char *prioritysrp = malloc(len + sizeof(GNUTLS_SRP) + 1);
--- 586,592 ----
#ifdef HAVE_GNUTLS_SRP
/* Only add SRP to the cipher list if SRP is requested. Otherwise
* GnuTLS will disable TLS 1.3 support. */
! if(SSL_SET_OPTION(primary.authtype) == CURL_TLSAUTH_SRP) {
size_t len = strlen(prioritylist);
char *prioritysrp = malloc(len + sizeof(GNUTLS_SRP) + 1);
***************
*** 677,683 ****
#ifdef HAVE_GNUTLS_SRP
/* put the credentials to the current session */
! if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP) {
rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP,
backend->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
--- 678,684 ----
#ifdef HAVE_GNUTLS_SRP
/* put the credentials to the current session */
! if(SSL_SET_OPTION(primary.authtype) == CURL_TLSAUTH_SRP) {
rc = gnutls_credentials_set(session, GNUTLS_CRD_SRP,
backend->srp_client_cred);
if(rc != GNUTLS_E_SUCCESS) {
***************
*** 858,865 ****
SSL_CONN_CONFIG(verifyhost) ||
SSL_CONN_CONFIG(issuercert)) {
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
! && SSL_SET_OPTION(username) != NULL
&& !SSL_CONN_CONFIG(verifypeer)
&& gnutls_cipher_get(session)) {
/* no peer cert, but auth is ok if we have SRP user and cipher and no
--- 859,866 ----
SSL_CONN_CONFIG(verifyhost) ||
SSL_CONN_CONFIG(issuercert)) {
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(primary.authtype) == CURL_TLSAUTH_SRP
! && SSL_SET_OPTION(primary.username)
&& !SSL_CONN_CONFIG(verifypeer)
&& gnutls_cipher_get(session)) {
/* no peer cert, but auth is ok if we have SRP user and cipher and no
***************
*** 917,923 ****
failf(data, "server certificate verification failed. CAfile: %s "
"CRLfile: %s", SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile):
"none",
! SSL_SET_OPTION(CRLfile)?SSL_SET_OPTION(CRLfile):"none");
return CURLE_PEER_FAILED_VERIFICATION;
}
else
--- 918,925 ----
failf(data, "server certificate verification failed. CAfile: %s "
"CRLfile: %s", SSL_CONN_CONFIG(CAfile) ? SSL_CONN_CONFIG(CAfile):
"none",
! SSL_SET_OPTION(primary.CRLfile) ?
! SSL_SET_OPTION(primary.CRLfile) : "none");
return CURLE_PEER_FAILED_VERIFICATION;
}
else
***************
*** 1530,1537 ****
gnutls_certificate_free_credentials(backend->cred);
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(authtype) == CURL_TLSAUTH_SRP
! && SSL_SET_OPTION(username) != NULL)
gnutls_srp_free_client_credentials(backend->srp_client_cred);
#endif
--- 1532,1539 ----
gnutls_certificate_free_credentials(backend->cred);
#ifdef HAVE_GNUTLS_SRP
! if(SSL_SET_OPTION(primary.authtype) == CURL_TLSAUTH_SRP
! && SSL_SET_OPTION(primary.username) != NULL)
gnutls_srp_free_client_credentials(backend->srp_client_cred);
#endif
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vtls/mbedtls.c curl_h5/lib/vtls/mbedtls.c
*** curl/lib/vtls/mbedtls.c 2022-08-26 11:21:23.128000000 +0800
--- curl_h5/lib/vtls/mbedtls.c 2022-08-26 11:21:58.980000000 +0800
***************
*** 255,261 ****
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
! const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
const char * const hostname = SSL_HOST_NAME();
const long int port = SSL_HOST_PORT();
int ret = -1;
--- 255,261 ----
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
! const char * const ssl_crlfile = SSL_SET_OPTION(primary.CRLfile);
const char * const hostname = SSL_HOST_NAME();
const long int port = SSL_HOST_PORT();
int ret = -1;
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vtls/nss.c curl_h5/lib/vtls/nss.c
*** curl/lib/vtls/nss.c 2022-08-26 11:21:23.128000000 +0800
--- curl_h5/lib/vtls/nss.c 2022-08-26 11:21:58.980000000 +0800
***************
*** 972,977 ****
--- 972,980 ----
PR_Free(common_name);
}
+ /* A number of certs that will never occur in a real server handshake */
+ #define TOO_MANY_CERTS 300
+
static CURLcode display_conn_info(struct Curl_easy *data, PRFileDesc *sock)
{
CURLcode result = CURLE_OK;
***************
*** 1007,1012 ****
--- 1010,1020 ----
cert2 = CERT_FindCertIssuer(cert, now, certUsageSSLCA);
while(cert2) {
i++;
+ if(i >= TOO_MANY_CERTS) {
+ CERT_DestroyCertificate(cert2);
+ failf(data, "certificate loop");
+ return CURLE_SSL_CERTPROBLEM;
+ }
if(cert2->isRoot) {
CERT_DestroyCertificate(cert2);
break;
***************
*** 1986,1998 ****
}
}
! if(SSL_SET_OPTION(CRLfile)) {
! const CURLcode rv = nss_load_crl(SSL_SET_OPTION(CRLfile));
if(rv) {
result = rv;
goto error;
}
! infof(data, " CRLfile: %s", SSL_SET_OPTION(CRLfile));
}
if(SSL_SET_OPTION(primary.clientcert)) {
--- 1994,2006 ----
}
}
! if(SSL_SET_OPTION(primary.CRLfile)) {
! const CURLcode rv = nss_load_crl(SSL_SET_OPTION(primary.CRLfile));
if(rv) {
result = rv;
goto error;
}
! infof(data, " CRLfile: %s", SSL_SET_OPTION(primary.CRLfile));
}
if(SSL_SET_OPTION(primary.clientcert)) {
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vtls/openssl.c curl_h5/lib/vtls/openssl.c
*** curl/lib/vtls/openssl.c 2022-08-26 11:21:23.128000000 +0800
--- curl_h5/lib/vtls/openssl.c 2022-08-26 11:21:58.980000000 +0800
***************
*** 2605,2611 ****
#endif
const long int ssl_version = SSL_CONN_CONFIG(version);
#ifdef USE_OPENSSL_SRP
! const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(authtype);
#endif
char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
--- 2605,2611 ----
#endif
const long int ssl_version = SSL_CONN_CONFIG(version);
#ifdef USE_OPENSSL_SRP
! const enum CURL_TLSAUTH ssl_authtype = SSL_SET_OPTION(primary.authtype);
#endif
char * const ssl_cert = SSL_SET_OPTION(primary.clientcert);
const struct curl_blob *ssl_cert_blob = SSL_SET_OPTION(primary.cert_blob);
***************
*** 2616,2622 ****
(ca_info_blob ? NULL : SSL_CONN_CONFIG(CAfile));
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
! const char * const ssl_crlfile = SSL_SET_OPTION(CRLfile);
char error_buffer[256];
struct ssl_backend_data *backend = connssl->backend;
bool imported_native_ca = false;
--- 2616,2622 ----
(ca_info_blob ? NULL : SSL_CONN_CONFIG(CAfile));
const char * const ssl_capath = SSL_CONN_CONFIG(CApath);
const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
! const char * const ssl_crlfile = SSL_SET_OPTION(primary.CRLfile);
char error_buffer[256];
struct ssl_backend_data *backend = connssl->backend;
bool imported_native_ca = false;
***************
*** 2866,2881 ****
#endif
#ifdef USE_OPENSSL_SRP
! if(ssl_authtype == CURL_TLSAUTH_SRP) {
! char * const ssl_username = SSL_SET_OPTION(username);
!
infof(data, "Using TLS-SRP username: %s", ssl_username);
if(!SSL_CTX_set_srp_username(backend->ctx, ssl_username)) {
failf(data, "Unable to set SRP user name");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
! if(!SSL_CTX_set_srp_password(backend->ctx, SSL_SET_OPTION(password))) {
failf(data, "failed setting SRP password");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
--- 2866,2882 ----
#endif
#ifdef USE_OPENSSL_SRP
! if((ssl_authtype == CURL_TLSAUTH_SRP) &&
! Curl_allow_auth_to_host(data)) {
! char * const ssl_username = SSL_SET_OPTION(primary.username);
! char * const ssl_password = SSL_SET_OPTION(primary.password);
infof(data, "Using TLS-SRP username: %s", ssl_username);
if(!SSL_CTX_set_srp_username(backend->ctx, ssl_username)) {
failf(data, "Unable to set SRP user name");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
! if(!SSL_CTX_set_srp_password(backend->ctx, ssl_password)) {
failf(data, "failed setting SRP password");
return CURLE_BAD_FUNCTION_ARGUMENT;
}
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/lib/vtls/vtls.c curl_h5/lib/vtls/vtls.c
*** curl/lib/vtls/vtls.c 2022-08-26 11:21:23.132000000 +0800
--- curl_h5/lib/vtls/vtls.c 2022-08-26 11:21:58.984000000 +0800
***************
*** 125,139 ****
return !memcmp(first->data, second->data, first->len); /* same data */
}
- static bool safecmp(char *a, char *b)
- {
- if(a && b)
- return !strcmp(a, b);
- else if(!a && !b)
- return TRUE; /* match */
- return FALSE; /* no match */
- }
-
bool
Curl_ssl_config_matches(struct ssl_primary_config *data,
--- 125,130 ----
***************
*** 141,161 ****
{
if((data->version == needle->version) &&
(data->version_max == needle->version_max) &&
(data->verifypeer == needle->verifypeer) &&
(data->verifyhost == needle->verifyhost) &&
(data->verifystatus == needle->verifystatus) &&
blobcmp(data->cert_blob, needle->cert_blob) &&
blobcmp(data->ca_info_blob, needle->ca_info_blob) &&
blobcmp(data->issuercert_blob, needle->issuercert_blob) &&
! safecmp(data->CApath, needle->CApath) &&
! safecmp(data->CAfile, needle->CAfile) &&
! safecmp(data->issuercert, needle->issuercert) &&
! safecmp(data->clientcert, needle->clientcert) &&
! safecmp(data->random_file, needle->random_file) &&
! safecmp(data->egdsocket, needle->egdsocket) &&
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
Curl_safe_strcasecompare(data->curves, needle->curves) &&
Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
return TRUE;
--- 132,159 ----
{
if((data->version == needle->version) &&
(data->version_max == needle->version_max) &&
+ (data->ssl_options == needle->ssl_options) &&
(data->verifypeer == needle->verifypeer) &&
(data->verifyhost == needle->verifyhost) &&
(data->verifystatus == needle->verifystatus) &&
blobcmp(data->cert_blob, needle->cert_blob) &&
blobcmp(data->ca_info_blob, needle->ca_info_blob) &&
blobcmp(data->issuercert_blob, needle->issuercert_blob) &&
! Curl_safecmp(data->CApath, needle->CApath) &&
! Curl_safecmp(data->CAfile, needle->CAfile) &&
! Curl_safecmp(data->issuercert, needle->issuercert) &&
! Curl_safecmp(data->clientcert, needle->clientcert) &&
! Curl_safecmp(data->random_file, needle->random_file) &&
! Curl_safecmp(data->egdsocket, needle->egdsocket) &&
! #ifdef USE_TLS_SRP
! Curl_safecmp(data->username, needle->username) &&
! Curl_safecmp(data->password, needle->password) &&
! (data->authtype == needle->authtype) &&
! #endif
Curl_safe_strcasecompare(data->cipher_list, needle->cipher_list) &&
Curl_safe_strcasecompare(data->cipher_list13, needle->cipher_list13) &&
Curl_safe_strcasecompare(data->curves, needle->curves) &&
+ Curl_safe_strcasecompare(data->CRLfile, needle->CRLfile) &&
Curl_safe_strcasecompare(data->pinned_key, needle->pinned_key))
return TRUE;
***************
*** 172,177 ****
--- 170,179 ----
dest->verifyhost = source->verifyhost;
dest->verifystatus = source->verifystatus;
dest->sessionid = source->sessionid;
+ dest->ssl_options = source->ssl_options;
+ #ifdef USE_TLS_SRP
+ dest->authtype = source->authtype;
+ #endif
CLONE_BLOB(cert_blob);
CLONE_BLOB(ca_info_blob);
***************
*** 186,191 ****
--- 188,198 ----
CLONE_STRING(cipher_list13);
CLONE_STRING(pinned_key);
CLONE_STRING(curves);
+ CLONE_STRING(CRLfile);
+ #ifdef USE_TLS_SRP
+ CLONE_STRING(username);
+ CLONE_STRING(password);
+ #endif
return TRUE;
}
***************
*** 205,210 ****
--- 212,222 ----
Curl_safefree(sslc->ca_info_blob);
Curl_safefree(sslc->issuercert_blob);
Curl_safefree(sslc->curves);
+ Curl_safefree(sslc->CRLfile);
+ #ifdef USE_TLS_SRP
+ Curl_safefree(sslc->username);
+ Curl_safefree(sslc->password);
+ #endif
}
#ifdef USE_SSL
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/Makefile.inc curl_h5/tests/data/Makefile.inc
*** curl/tests/data/Makefile.inc 2022-08-26 11:21:23.164000000 +0800
--- curl_h5/tests/data/Makefile.inc 2022-08-26 11:21:59.016000000 +0800
***************
*** 61,67 ****
test343 test344 test345 test346 test347 test348 test349 test350 test351 \
test352 test353 test354 test355 test356 test357 test358 test359 test360 \
test361 test362 test363 test364 \
! \
test393 test394 test395 test396 test397 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
--- 61,67 ----
test343 test344 test345 test346 test347 test348 test349 test350 test351 \
test352 test353 test354 test355 test356 test357 test358 test359 test360 \
test361 test362 test363 test364 \
! test387 \
test393 test394 test395 test396 test397 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
***************
*** 69,74 ****
--- 69,76 ----
\
test430 test431 test432 test433 test434 \
\
+ test442 test443 test444 \
+ \
test490 test491 test492 test493 test494 \
\
test500 test501 test502 test503 test504 test505 test506 test507 test508 \
***************
*** 106,112 ****
test863 test864 test865 test866 test867 test868 test869 test870 test871 \
test872 test873 test874 test875 test876 test877 test878 test879 test880 \
test881 test882 test883 test884 test885 test886 test887 test888 test889 \
! test890 test891 test892 test893 test894 test895 test896 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
--- 108,114 ----
test863 test864 test865 test866 test867 test868 test869 test870 test871 \
test872 test873 test874 test875 test876 test877 test878 test879 test880 \
test881 test882 test883 test884 test885 test886 test887 test888 test889 \
! test890 test891 test892 test893 test894 test895 test896 test898 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
***************
*** 116,122 ****
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
test954 test955 test956 test957 test958 test959 test960 test961 test962 \
test963 test964 test965 test966 test967 test968 test969 test970 test971 \
! test972 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
--- 118,126 ----
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
test954 test955 test956 test957 test958 test959 test960 test961 test962 \
test963 test964 test965 test966 test967 test968 test969 test970 test971 \
! test972 test973 test974 test975 test976 \
! \
! test980 test981 test982 test983 test984 test985 test986 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test387 curl_h5/tests/data/test387
*** curl/tests/data/test387 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test387 2022-08-26 11:21:59.064000000 +0800
***************
*** 0 ****
--- 1,53 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ gzip
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data nocheck="yes">
+ HTTP/1.1 200 OK
+ Transfer-Encoding: gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip,gzip
+
+ -foo-
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ Response with overly long compression chain
+ </name>
+ <command>
+ http://%HOSTIP:%HTTPPORT/%TESTNUMBER -sS
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /%TESTNUMBER HTTP/1.1
+ Host: %HOSTIP:%HTTPPORT
+ User-Agent: curl/%VERSION
+ Accept: */*
+
+ </protocol>
+
+ # CURLE_BAD_CONTENT_ENCODING is 61
+ <errorcode>
+ 61
+ </errorcode>
+ <stderr mode="text">
+ curl: (61) Reject response due to 5 content encodings
+ </stderr>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test442 curl_h5/tests/data/test442
*** curl/tests/data/test442 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test442 2022-08-26 11:21:59.064000000 +0800
***************
*** 0 ****
--- 1,209 ----
+ # perl:
+ #
+ # for(1 .. 151) {
+ # print join("\t",
+ # "attack.invalid", "TRUE", "/", "FALSE", "0",
+ # "name$_", "could-be-large-$_")."\n";
+ # }
+ #
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ cookies
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 6
+
+ -foo-
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ Send capped huge number of matching cookies
+ </name>
+ <command>
+ http://attack.invalid:%HTTPPORT/a/b/%TESTNUMBER -b log/cookie%TESTNUMBER --resolve attack.invalid:%HTTPPORT:%HOSTIP -L
+ </command>
+ <file name="log/cookie%TESTNUMBER" mode="text">
+ attack.invalid TRUE / FALSE 0 name1 could-be-large-1
+ attack.invalid TRUE / FALSE 0 name2 could-be-large-2
+ attack.invalid TRUE / FALSE 0 name3 could-be-large-3
+ attack.invalid TRUE / FALSE 0 name4 could-be-large-4
+ attack.invalid TRUE / FALSE 0 name5 could-be-large-5
+ attack.invalid TRUE / FALSE 0 name6 could-be-large-6
+ attack.invalid TRUE / FALSE 0 name7 could-be-large-7
+ attack.invalid TRUE / FALSE 0 name8 could-be-large-8
+ attack.invalid TRUE / FALSE 0 name9 could-be-large-9
+ attack.invalid TRUE / FALSE 0 name10 could-be-large-10
+ attack.invalid TRUE / FALSE 0 name11 could-be-large-11
+ attack.invalid TRUE / FALSE 0 name12 could-be-large-12
+ attack.invalid TRUE / FALSE 0 name13 could-be-large-13
+ attack.invalid TRUE / FALSE 0 name14 could-be-large-14
+ attack.invalid TRUE / FALSE 0 name15 could-be-large-15
+ attack.invalid TRUE / FALSE 0 name16 could-be-large-16
+ attack.invalid TRUE / FALSE 0 name17 could-be-large-17
+ attack.invalid TRUE / FALSE 0 name18 could-be-large-18
+ attack.invalid TRUE / FALSE 0 name19 could-be-large-19
+ attack.invalid TRUE / FALSE 0 name20 could-be-large-20
+ attack.invalid TRUE / FALSE 0 name21 could-be-large-21
+ attack.invalid TRUE / FALSE 0 name22 could-be-large-22
+ attack.invalid TRUE / FALSE 0 name23 could-be-large-23
+ attack.invalid TRUE / FALSE 0 name24 could-be-large-24
+ attack.invalid TRUE / FALSE 0 name25 could-be-large-25
+ attack.invalid TRUE / FALSE 0 name26 could-be-large-26
+ attack.invalid TRUE / FALSE 0 name27 could-be-large-27
+ attack.invalid TRUE / FALSE 0 name28 could-be-large-28
+ attack.invalid TRUE / FALSE 0 name29 could-be-large-29
+ attack.invalid TRUE / FALSE 0 name30 could-be-large-30
+ attack.invalid TRUE / FALSE 0 name31 could-be-large-31
+ attack.invalid TRUE / FALSE 0 name32 could-be-large-32
+ attack.invalid TRUE / FALSE 0 name33 could-be-large-33
+ attack.invalid TRUE / FALSE 0 name34 could-be-large-34
+ attack.invalid TRUE / FALSE 0 name35 could-be-large-35
+ attack.invalid TRUE / FALSE 0 name36 could-be-large-36
+ attack.invalid TRUE / FALSE 0 name37 could-be-large-37
+ attack.invalid TRUE / FALSE 0 name38 could-be-large-38
+ attack.invalid TRUE / FALSE 0 name39 could-be-large-39
+ attack.invalid TRUE / FALSE 0 name40 could-be-large-40
+ attack.invalid TRUE / FALSE 0 name41 could-be-large-41
+ attack.invalid TRUE / FALSE 0 name42 could-be-large-42
+ attack.invalid TRUE / FALSE 0 name43 could-be-large-43
+ attack.invalid TRUE / FALSE 0 name44 could-be-large-44
+ attack.invalid TRUE / FALSE 0 name45 could-be-large-45
+ attack.invalid TRUE / FALSE 0 name46 could-be-large-46
+ attack.invalid TRUE / FALSE 0 name47 could-be-large-47
+ attack.invalid TRUE / FALSE 0 name48 could-be-large-48
+ attack.invalid TRUE / FALSE 0 name49 could-be-large-49
+ attack.invalid TRUE / FALSE 0 name50 could-be-large-50
+ attack.invalid TRUE / FALSE 0 name51 could-be-large-51
+ attack.invalid TRUE / FALSE 0 name52 could-be-large-52
+ attack.invalid TRUE / FALSE 0 name53 could-be-large-53
+ attack.invalid TRUE / FALSE 0 name54 could-be-large-54
+ attack.invalid TRUE / FALSE 0 name55 could-be-large-55
+ attack.invalid TRUE / FALSE 0 name56 could-be-large-56
+ attack.invalid TRUE / FALSE 0 name57 could-be-large-57
+ attack.invalid TRUE / FALSE 0 name58 could-be-large-58
+ attack.invalid TRUE / FALSE 0 name59 could-be-large-59
+ attack.invalid TRUE / FALSE 0 name60 could-be-large-60
+ attack.invalid TRUE / FALSE 0 name61 could-be-large-61
+ attack.invalid TRUE / FALSE 0 name62 could-be-large-62
+ attack.invalid TRUE / FALSE 0 name63 could-be-large-63
+ attack.invalid TRUE / FALSE 0 name64 could-be-large-64
+ attack.invalid TRUE / FALSE 0 name65 could-be-large-65
+ attack.invalid TRUE / FALSE 0 name66 could-be-large-66
+ attack.invalid TRUE / FALSE 0 name67 could-be-large-67
+ attack.invalid TRUE / FALSE 0 name68 could-be-large-68
+ attack.invalid TRUE / FALSE 0 name69 could-be-large-69
+ attack.invalid TRUE / FALSE 0 name70 could-be-large-70
+ attack.invalid TRUE / FALSE 0 name71 could-be-large-71
+ attack.invalid TRUE / FALSE 0 name72 could-be-large-72
+ attack.invalid TRUE / FALSE 0 name73 could-be-large-73
+ attack.invalid TRUE / FALSE 0 name74 could-be-large-74
+ attack.invalid TRUE / FALSE 0 name75 could-be-large-75
+ attack.invalid TRUE / FALSE 0 name76 could-be-large-76
+ attack.invalid TRUE / FALSE 0 name77 could-be-large-77
+ attack.invalid TRUE / FALSE 0 name78 could-be-large-78
+ attack.invalid TRUE / FALSE 0 name79 could-be-large-79
+ attack.invalid TRUE / FALSE 0 name80 could-be-large-80
+ attack.invalid TRUE / FALSE 0 name81 could-be-large-81
+ attack.invalid TRUE / FALSE 0 name82 could-be-large-82
+ attack.invalid TRUE / FALSE 0 name83 could-be-large-83
+ attack.invalid TRUE / FALSE 0 name84 could-be-large-84
+ attack.invalid TRUE / FALSE 0 name85 could-be-large-85
+ attack.invalid TRUE / FALSE 0 name86 could-be-large-86
+ attack.invalid TRUE / FALSE 0 name87 could-be-large-87
+ attack.invalid TRUE / FALSE 0 name88 could-be-large-88
+ attack.invalid TRUE / FALSE 0 name89 could-be-large-89
+ attack.invalid TRUE / FALSE 0 name90 could-be-large-90
+ attack.invalid TRUE / FALSE 0 name91 could-be-large-91
+ attack.invalid TRUE / FALSE 0 name92 could-be-large-92
+ attack.invalid TRUE / FALSE 0 name93 could-be-large-93
+ attack.invalid TRUE / FALSE 0 name94 could-be-large-94
+ attack.invalid TRUE / FALSE 0 name95 could-be-large-95
+ attack.invalid TRUE / FALSE 0 name96 could-be-large-96
+ attack.invalid TRUE / FALSE 0 name97 could-be-large-97
+ attack.invalid TRUE / FALSE 0 name98 could-be-large-98
+ attack.invalid TRUE / FALSE 0 name99 could-be-large-99
+ attack.invalid TRUE / FALSE 0 name100 could-be-large-100
+ attack.invalid TRUE / FALSE 0 name101 could-be-large-101
+ attack.invalid TRUE / FALSE 0 name102 could-be-large-102
+ attack.invalid TRUE / FALSE 0 name103 could-be-large-103
+ attack.invalid TRUE / FALSE 0 name104 could-be-large-104
+ attack.invalid TRUE / FALSE 0 name105 could-be-large-105
+ attack.invalid TRUE / FALSE 0 name106 could-be-large-106
+ attack.invalid TRUE / FALSE 0 name107 could-be-large-107
+ attack.invalid TRUE / FALSE 0 name108 could-be-large-108
+ attack.invalid TRUE / FALSE 0 name109 could-be-large-109
+ attack.invalid TRUE / FALSE 0 name110 could-be-large-110
+ attack.invalid TRUE / FALSE 0 name111 could-be-large-111
+ attack.invalid TRUE / FALSE 0 name112 could-be-large-112
+ attack.invalid TRUE / FALSE 0 name113 could-be-large-113
+ attack.invalid TRUE / FALSE 0 name114 could-be-large-114
+ attack.invalid TRUE / FALSE 0 name115 could-be-large-115
+ attack.invalid TRUE / FALSE 0 name116 could-be-large-116
+ attack.invalid TRUE / FALSE 0 name117 could-be-large-117
+ attack.invalid TRUE / FALSE 0 name118 could-be-large-118
+ attack.invalid TRUE / FALSE 0 name119 could-be-large-119
+ attack.invalid TRUE / FALSE 0 name120 could-be-large-120
+ attack.invalid TRUE / FALSE 0 name121 could-be-large-121
+ attack.invalid TRUE / FALSE 0 name122 could-be-large-122
+ attack.invalid TRUE / FALSE 0 name123 could-be-large-123
+ attack.invalid TRUE / FALSE 0 name124 could-be-large-124
+ attack.invalid TRUE / FALSE 0 name125 could-be-large-125
+ attack.invalid TRUE / FALSE 0 name126 could-be-large-126
+ attack.invalid TRUE / FALSE 0 name127 could-be-large-127
+ attack.invalid TRUE / FALSE 0 name128 could-be-large-128
+ attack.invalid TRUE / FALSE 0 name129 could-be-large-129
+ attack.invalid TRUE / FALSE 0 name130 could-be-large-130
+ attack.invalid TRUE / FALSE 0 name131 could-be-large-131
+ attack.invalid TRUE / FALSE 0 name132 could-be-large-132
+ attack.invalid TRUE / FALSE 0 name133 could-be-large-133
+ attack.invalid TRUE / FALSE 0 name134 could-be-large-134
+ attack.invalid TRUE / FALSE 0 name135 could-be-large-135
+ attack.invalid TRUE / FALSE 0 name136 could-be-large-136
+ attack.invalid TRUE / FALSE 0 name137 could-be-large-137
+ attack.invalid TRUE / FALSE 0 name138 could-be-large-138
+ attack.invalid TRUE / FALSE 0 name139 could-be-large-139
+ attack.invalid TRUE / FALSE 0 name140 could-be-large-140
+ attack.invalid TRUE / FALSE 0 name141 could-be-large-141
+ attack.invalid TRUE / FALSE 0 name142 could-be-large-142
+ attack.invalid TRUE / FALSE 0 name143 could-be-large-143
+ attack.invalid TRUE / FALSE 0 name144 could-be-large-144
+ attack.invalid TRUE / FALSE 0 name145 could-be-large-145
+ attack.invalid TRUE / FALSE 0 name146 could-be-large-146
+ attack.invalid TRUE / FALSE 0 name147 could-be-large-147
+ attack.invalid TRUE / FALSE 0 name148 could-be-large-148
+ attack.invalid TRUE / FALSE 0 name149 could-be-large-149
+ attack.invalid TRUE / FALSE 0 name150 could-be-large-150
+ attack.invalid TRUE / FALSE 0 name151 could-be-large-151
+ </file>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /a/b/%TESTNUMBER HTTP/1.1
+ Host: attack.invalid:%HTTPPORT
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Cookie: name150=could-be-large-150; name149=could-be-large-149; name148=could-be-large-148; name147=could-be-large-147; name146=could-be-large-146; name145=could-be-large-145; name144=could-be-large-144; name143=could-be-large-143; name142=could-be-large-142; name141=could-be-large-141; name140=could-be-large-140; name139=could-be-large-139; name138=could-be-large-138; name137=could-be-large-137; name136=could-be-large-136; name135=could-be-large-135; name134=could-be-large-134; name133=could-be-large-133; name132=could-be-large-132; name131=could-be-large-131; name130=could-be-large-130; name129=could-be-large-129; name128=could-be-large-128; name127=could-be-large-127; name126=could-be-large-126; name125=could-be-large-125; name124=could-be-large-124; name123=could-be-large-123; name122=could-be-large-122; name121=could-be-large-121; name120=could-be-large-120; name119=could-be-large-119; name118=could-be-large-118; name117=could-be-large-117; name116=could-be-large-116; name115=could-be-large-115; name114=could-be-large-114; name113=could-be-large-113; name112=could-be-large-112; name111=could-be-large-111; name110=could-be-large-110; name109=could-be-large-109; name108=could-be-large-108; name107=could-be-large-107; name106=could-be-large-106; name105=could-be-large-105; name104=could-be-large-104; name103=could-be-large-103; name102=could-be-large-102; name101=could-be-large-101; name100=could-be-large-100; name99=could-be-large-99; name98=could-be-large-98; name97=could-be-large-97; name96=could-be-large-96; name95=could-be-large-95; name94=could-be-large-94; name93=could-be-large-93; name92=could-be-large-92; name91=could-be-large-91; name90=could-be-large-90; name89=could-be-large-89; name88=could-be-large-88; name87=could-be-large-87; name86=could-be-large-86; name85=could-be-large-85; name84=could-be-large-84; name83=could-be-large-83; name82=could-be-large-82; name81=could-be-large-81; name80=could-be-large-80; name79=could-be-large-79; name78=could-be-large-78; name77=could-be-large-77; name76=could-be-large-76; name75=could-be-large-75; name74=could-be-large-74; name73=could-be-large-73; name72=could-be-large-72; name71=could-be-large-71; name70=could-be-large-70; name69=could-be-large-69; name68=could-be-large-68; name67=could-be-large-67; name66=could-be-large-66; name65=could-be-large-65; name64=could-be-large-64; name63=could-be-large-63; name62=could-be-large-62; name61=could-be-large-61; name60=could-be-large-60; name59=could-be-large-59; name58=could-be-large-58; name57=could-be-large-57; name56=could-be-large-56; name55=could-be-large-55; name54=could-be-large-54; name53=could-be-large-53; name52=could-be-large-52; name51=could-be-large-51; name50=could-be-large-50; name49=could-be-large-49; name48=could-be-large-48; name47=could-be-large-47; name46=could-be-large-46; name45=could-be-large-45; name44=could-be-large-44; name43=could-be-large-43; name42=could-be-large-42; name41=could-be-large-41; name40=could-be-large-40; name39=could-be-large-39; name38=could-be-large-38; name37=could-be-large-37; name36=could-be-large-36; name35=could-be-large-35; name34=could-be-large-34; name33=could-be-large-33; name32=could-be-large-32; name31=could-be-large-31; name30=could-be-large-30; name29=could-be-large-29; name28=could-be-large-28; name27=could-be-large-27; name26=could-be-large-26; name25=could-be-large-25; name24=could-be-large-24; name23=could-be-large-23; name22=could-be-large-22; name21=could-be-large-21; name20=could-be-large-20; name19=could-be-large-19; name18=could-be-large-18; name17=could-be-large-17; name16=could-be-large-16; name15=could-be-large-15; name14=could-be-large-14; name13=could-be-large-13; name12=could-be-large-12; name11=could-be-large-11; name10=could-be-large-10; name9=could-be-large-9; name8=could-be-large-8; name7=could-be-large-7; name6=could-be-large-6; name5=could-be-large-5; name4=could-be-large-4; name3=could-be-large-3; name2=could-be-large-2; name1=could-be-large-1
+
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test443 curl_h5/tests/data/test443
*** curl/tests/data/test443 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test443 2022-08-26 11:21:59.064000000 +0800
***************
*** 0 ****
--- 1,78 ----
+ # perl:
+ #
+ #for(1 .. 20) {
+ # print join("\t",
+ # "attack.invalid", "TRUE", "/", "FALSE", "0",
+ # "huge-$_", ('a' x 500)."-$_")."\n";
+ #}
+ #
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ cookies
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 6
+
+ -foo-
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ Cookie header in request no longer than 8K
+ </name>
+ <command>
+ http://attack.invalid:%HTTPPORT/a/b/%TESTNUMBER -b log/cookie%TESTNUMBER --resolve attack.invalid:%HTTPPORT:%HOSTIP -L
+ </command>
+ <file name="log/cookie%TESTNUMBER" mode="text">
+ attack.invalid TRUE / FALSE 0 huge-1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-1
+ attack.invalid TRUE / FALSE 0 huge-2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-2
+ attack.invalid TRUE / FALSE 0 huge-3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-3
+ attack.invalid TRUE / FALSE 0 huge-4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-4
+ attack.invalid TRUE / FALSE 0 huge-5 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-5
+ attack.invalid TRUE / FALSE 0 huge-6 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-6
+ attack.invalid TRUE / FALSE 0 huge-7 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-7
+ attack.invalid TRUE / FALSE 0 huge-8 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-8
+ attack.invalid TRUE / FALSE 0 huge-9 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9
+ attack.invalid TRUE / FALSE 0 huge-10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10
+ attack.invalid TRUE / FALSE 0 huge-11 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-11
+ attack.invalid TRUE / FALSE 0 huge-12 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-12
+ attack.invalid TRUE / FALSE 0 huge-13 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-13
+ attack.invalid TRUE / FALSE 0 huge-14 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-14
+ attack.invalid TRUE / FALSE 0 huge-15 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-15
+ attack.invalid TRUE / FALSE 0 huge-16 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-16
+ attack.invalid TRUE / FALSE 0 huge-17 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-17
+ attack.invalid TRUE / FALSE 0 huge-18 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-18
+ attack.invalid TRUE / FALSE 0 huge-19 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-19
+ attack.invalid TRUE / FALSE 0 huge-20 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-20
+ </file>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /a/b/%TESTNUMBER HTTP/1.1
+ Host: attack.invalid:%HTTPPORT
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Cookie: huge-20=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-20; huge-19=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-19; huge-18=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-18; huge-17=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-17; huge-16=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-16; huge-15=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-15; huge-14=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-14; huge-13=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-13; huge-12=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-12; huge-11=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-11; huge-10=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10; huge-9=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-9; huge-8=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-8; huge-7=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-7; huge-6=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-6
+
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test444 curl_h5/tests/data/test444
*** curl/tests/data/test444 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test444 2022-08-26 11:21:59.064000000 +0800
***************
*** 0 ****
--- 1,189 ----
+ # perl:
+ #
+ #for(1 .. 200) {
+ #
+ #}
+ #
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ cookies
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 6
+ Set-Cookie: cookie-1=yes;
+ Set-Cookie: cookie-2=yes;
+ Set-Cookie: cookie-3=yes;
+ Set-Cookie: cookie-4=yes;
+ Set-Cookie: cookie-5=yes;
+ Set-Cookie: cookie-6=yes;
+ Set-Cookie: cookie-7=yes;
+ Set-Cookie: cookie-8=yes;
+ Set-Cookie: cookie-9=yes;
+ Set-Cookie: cookie-10=yes;
+ Set-Cookie: cookie-11=yes;
+ Set-Cookie: cookie-12=yes;
+ Set-Cookie: cookie-13=yes;
+ Set-Cookie: cookie-14=yes;
+ Set-Cookie: cookie-15=yes;
+ Set-Cookie: cookie-16=yes;
+ Set-Cookie: cookie-17=yes;
+ Set-Cookie: cookie-18=yes;
+ Set-Cookie: cookie-19=yes;
+ Set-Cookie: cookie-20=yes;
+ Set-Cookie: cookie-21=yes;
+ Set-Cookie: cookie-22=yes;
+ Set-Cookie: cookie-23=yes;
+ Set-Cookie: cookie-24=yes;
+ Set-Cookie: cookie-25=yes;
+ Set-Cookie: cookie-26=yes;
+ Set-Cookie: cookie-27=yes;
+ Set-Cookie: cookie-28=yes;
+ Set-Cookie: cookie-29=yes;
+ Set-Cookie: cookie-30=yes;
+ Set-Cookie: cookie-31=yes;
+ Set-Cookie: cookie-32=yes;
+ Set-Cookie: cookie-33=yes;
+ Set-Cookie: cookie-34=yes;
+ Set-Cookie: cookie-35=yes;
+ Set-Cookie: cookie-36=yes;
+ Set-Cookie: cookie-37=yes;
+ Set-Cookie: cookie-38=yes;
+ Set-Cookie: cookie-39=yes;
+ Set-Cookie: cookie-40=yes;
+ Set-Cookie: cookie-41=yes;
+ Set-Cookie: cookie-42=yes;
+ Set-Cookie: cookie-43=yes;
+ Set-Cookie: cookie-44=yes;
+ Set-Cookie: cookie-45=yes;
+ Set-Cookie: cookie-46=yes;
+ Set-Cookie: cookie-47=yes;
+ Set-Cookie: cookie-48=yes;
+ Set-Cookie: cookie-49=yes;
+ Set-Cookie: cookie-50=yes;
+ Set-Cookie: cookie-51=yes;
+ Set-Cookie: cookie-52=yes;
+ Set-Cookie: cookie-53=yes;
+ Set-Cookie: cookie-54=yes;
+ Set-Cookie: cookie-55=yes;
+ Set-Cookie: cookie-56=yes;
+ Set-Cookie: cookie-57=yes;
+ Set-Cookie: cookie-58=yes;
+ Set-Cookie: cookie-59=yes;
+ Set-Cookie: cookie-60=yes;
+ Set-Cookie: cookie-61=yes;
+ Set-Cookie: cookie-62=yes;
+ Set-Cookie: cookie-63=yes;
+ Set-Cookie: cookie-64=yes;
+ Set-Cookie: cookie-65=yes;
+ Set-Cookie: cookie-66=yes;
+ Set-Cookie: cookie-67=yes;
+ Set-Cookie: cookie-68=yes;
+ Set-Cookie: cookie-69=yes;
+ Set-Cookie: cookie-70=yes;
+ Set-Cookie: cookie-71=yes;
+ Set-Cookie: cookie-72=yes;
+ Set-Cookie: cookie-73=yes;
+ Set-Cookie: cookie-74=yes;
+ Set-Cookie: cookie-75=yes;
+ Set-Cookie: cookie-76=yes;
+ Set-Cookie: cookie-77=yes;
+ Set-Cookie: cookie-78=yes;
+ Set-Cookie: cookie-79=yes;
+ Set-Cookie: cookie-80=yes;
+
+ -foo-
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ Many Set-Cookie response headers
+ </name>
+ <command>
+ http://attack.invalid:%HTTPPORT/a/b/%TESTNUMBER -c log/cookie%TESTNUMBER --resolve attack.invalid:%HTTPPORT:%HOSTIP
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /a/b/%TESTNUMBER HTTP/1.1
+ Host: attack.invalid:%HTTPPORT
+ User-Agent: curl/%VERSION
+ Accept: */*
+
+ </protocol>
+ <file name="log/cookie%TESTNUMBER" mode="text">
+ # Netscape HTTP Cookie File
+ # https://curl.se/docs/http-cookies.html
+ # This file was generated by libcurl! Edit at your own risk.
+
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-50 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-49 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-48 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-47 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-46 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-45 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-44 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-43 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-42 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-41 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-40 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-39 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-38 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-37 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-36 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-35 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-34 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-33 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-32 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-31 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-30 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-29 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-28 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-27 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-26 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-25 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-24 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-23 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-22 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-21 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-20 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-19 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-18 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-17 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-16 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-15 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-14 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-13 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-12 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-11 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-10 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-9 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-8 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-7 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-6 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-5 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-4 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-3 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-2 yes
+ attack.invalid FALSE /a/b/ FALSE 0 cookie-1 yes
+ </file>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test898 curl_h5/tests/data/test898
*** curl/tests/data/test898 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test898 2022-08-26 11:21:59.080000000 +0800
***************
*** 0 ****
--- 1,90 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ --location
+ Authorization
+ Cookie
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ </data>
+ <data2>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </data2>
+
+ <datacheck>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </datacheck>
+
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ HTTP with custom auth and cookies redirected to HTTP on a diff port
+ </name>
+ <command>
+ -x http://%HOSTIP:%HTTPPORT http://firsthost.com -L -H "Authorization: Basic am9lOnNlY3JldA==" -H "Cookie: userpwd=am9lOnNlY3JldA=="
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET http://firsthost.com/ HTTP/1.1
+ Host: firsthost.com
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+ Authorization: Basic am9lOnNlY3JldA==
+ Cookie: userpwd=am9lOnNlY3JldA==
+
+ GET http://firsthost.com:9999/a/path/%TESTNUMBER0002 HTTP/1.1
+ Host: firsthost.com:9999
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test973 curl_h5/tests/data/test973
*** curl/tests/data/test973 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test973 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,88 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ FTP
+ --location
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: ftp://%HOSTIP:%FTPPORT/a/path/%TESTNUMBER0002
+
+ </data>
+ <data2>
+ data
+ to
+ see
+ that FTP
+ works
+ so does it?
+ </data2>
+
+ <datacheck>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: ftp://%HOSTIP:%FTPPORT/a/path/%TESTNUMBER0002
+
+ data
+ to
+ see
+ that FTP
+ works
+ so does it?
+ </datacheck>
+
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ ftp
+ </server>
+ <name>
+ HTTP with auth redirected to FTP w/o auth
+ </name>
+ <command>
+ http://%HOSTIP:%HTTPPORT/%TESTNUMBER -L -u joe:secret
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /%TESTNUMBER HTTP/1.1
+ Host: %HOSTIP:%HTTPPORT
+ Authorization: Basic am9lOnNlY3JldA==
+ User-Agent: curl/%VERSION
+ Accept: */*
+
+ USER anonymous
+ PASS ftp@example.com
+ PWD
+ CWD a
+ CWD path
+ EPSV
+ TYPE I
+ SIZE %TESTNUMBER0002
+ RETR %TESTNUMBER0002
+ QUIT
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test974 curl_h5/tests/data/test974
*** curl/tests/data/test974 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test974 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,87 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ --location
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ </data>
+ <data2>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </data2>
+
+ <datacheck>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </datacheck>
+
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ HTTP with auth redirected to HTTP on a diff port w/o auth
+ </name>
+ <command>
+ -x http://%HOSTIP:%HTTPPORT http://firsthost.com -L -u joe:secret
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET http://firsthost.com/ HTTP/1.1
+ Host: firsthost.com
+ Authorization: Basic am9lOnNlY3JldA==
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+
+ GET http://firsthost.com:9999/a/path/%TESTNUMBER0002 HTTP/1.1
+ Host: firsthost.com:9999
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test975 curl_h5/tests/data/test975
*** curl/tests/data/test975 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test975 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,88 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ FTP
+ --location-trusted
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: ftp://%HOSTIP:%FTPPORT/a/path/%TESTNUMBER0002
+
+ </data>
+ <data2>
+ data
+ to
+ see
+ that FTP
+ works
+ so does it?
+ </data2>
+
+ <datacheck>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: ftp://%HOSTIP:%FTPPORT/a/path/%TESTNUMBER0002
+
+ data
+ to
+ see
+ that FTP
+ works
+ so does it?
+ </datacheck>
+
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ ftp
+ </server>
+ <name>
+ HTTP with auth redirected to FTP allowing auth to continue
+ </name>
+ <command>
+ http://%HOSTIP:%HTTPPORT/%TESTNUMBER --location-trusted -u joe:secret
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET /%TESTNUMBER HTTP/1.1
+ Host: %HOSTIP:%HTTPPORT
+ Authorization: Basic am9lOnNlY3JldA==
+ User-Agent: curl/%VERSION
+ Accept: */*
+
+ USER joe
+ PASS secret
+ PWD
+ CWD a
+ CWD path
+ EPSV
+ TYPE I
+ SIZE %TESTNUMBER0002
+ RETR %TESTNUMBER0002
+ QUIT
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test976 curl_h5/tests/data/test976
*** curl/tests/data/test976 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test976 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,88 ----
+ <testcase>
+ <info>
+ <keywords>
+ HTTP
+ --location-trusted
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <data>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ </data>
+ <data2>
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </data2>
+
+ <datacheck>
+ HTTP/1.1 301 redirect
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 0
+ Connection: close
+ Content-Type: text/html
+ Location: http://firsthost.com:9999/a/path/%TESTNUMBER0002
+
+ HTTP/1.1 200 OK
+ Date: Tue, 09 Nov 2010 14:49:00 GMT
+ Server: test-server/fake
+ Content-Length: 4
+ Connection: close
+ Content-Type: text/html
+
+ hey
+ </datacheck>
+
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <server>
+ http
+ </server>
+ <name>
+ HTTP with auth redirected to HTTP on a diff port --location-trusted
+ </name>
+ <command>
+ -x http://%HOSTIP:%HTTPPORT http://firsthost.com --location-trusted -u joe:secret
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ <protocol>
+ GET http://firsthost.com/ HTTP/1.1
+ Host: firsthost.com
+ Authorization: Basic am9lOnNlY3JldA==
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+
+ GET http://firsthost.com:9999/a/path/%TESTNUMBER0002 HTTP/1.1
+ Host: firsthost.com:9999
+ Authorization: Basic am9lOnNlY3JldA==
+ User-Agent: curl/%VERSION
+ Accept: */*
+ Proxy-Connection: Keep-Alive
+
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test980 curl_h5/tests/data/test980
*** curl/tests/data/test980 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test980 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,52 ----
+ <testcase>
+ <info>
+ <keywords>
+ SMTP
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ CAPA STARTTLS
+ AUTH PLAIN
+ REPLY STARTTLS 454 currently unavailable\r\n235 Authenticated\r\n250 2.1.0 Sender ok\r\n250 2.1.5 Recipient ok\r\n354 Enter mail\r\n250 2.0.0 Accepted
+ REPLY AUTH 535 5.7.8 Authentication credentials invalid
+ </servercmd>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ smtp
+ </server>
+ <name>
+ SMTP STARTTLS pipelined server response
+ </name>
+ <stdin>
+ mail body
+ </stdin>
+ <command>
+ smtp://%HOSTIP:%SMTPPORT/%TESTNUMBER --mail-rcpt recipient@example.com --mail-from sender@example.com -u user:secret --ssl --sasl-ir -T -
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ # 8 is CURLE_WEIRD_SERVER_REPLY
+ <errorcode>
+ 8
+ </errorcode>
+ <protocol>
+ EHLO %TESTNUMBER
+ STARTTLS
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test981 curl_h5/tests/data/test981
*** curl/tests/data/test981 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test981 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,59 ----
+ <testcase>
+ <info>
+ <keywords>
+ IMAP
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ CAPA STARTTLS
+ REPLY STARTTLS A002 BAD currently unavailable\r\nA003 OK Authenticated\r\nA004 OK Accepted
+ REPLY LOGIN A003 BAD Authentication credentials invalid
+ </servercmd>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ imap
+ </server>
+ <name>
+ IMAP STARTTLS pipelined server response
+ </name>
+ <command>
+ imap://%HOSTIP:%IMAPPORT/%TESTNUMBER -T log/upload%TESTNUMBER -u user:secret --ssl
+ </command>
+ <file name="log/upload%TESTNUMBER">
+ Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
+ From: Fred Foobar <foobar@example.COM>
+ Subject: afternoon meeting
+ To: joe@example.com
+ Message-Id: <B27397-0100000@example.COM>
+ MIME-Version: 1.0
+ Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
+
+ Hello Joe, do you think we can meet at 3:30 tomorrow?
+ </file>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ # 8 is CURLE_WEIRD_SERVER_REPLY
+ <errorcode>
+ 8
+ </errorcode>
+ <protocol>
+ A001 CAPABILITY
+ A002 STARTTLS
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test982 curl_h5/tests/data/test982
*** curl/tests/data/test982 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test982 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,57 ----
+ <testcase>
+ <info>
+ <keywords>
+ POP3
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ CAPA STLS USER
+ REPLY STLS -ERR currently unavailable\r\n+OK user accepted\r\n+OK authenticated
+ REPLY PASS -ERR Authentication credentials invalid
+ </servercmd>
+ <data nocheck="yes">
+ From: me@somewhere
+ To: fake@nowhere
+
+ body
+
+ --
+ yours sincerely
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ pop3
+ </server>
+ <name>
+ POP3 STARTTLS pipelined server response
+ </name>
+ <command>
+ pop3://%HOSTIP:%POP3PORT/%TESTNUMBER -u user:secret --ssl
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ # 8 is CURLE_WEIRD_SERVER_REPLY
+ <errorcode>
+ 8
+ </errorcode>
+ <protocol>
+ CAPA
+ STLS
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test983 curl_h5/tests/data/test983
*** curl/tests/data/test983 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test983 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,52 ----
+ <testcase>
+ <info>
+ <keywords>
+ FTP
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ REPLY AUTH 500 unknown command\r\n500 unknown command\r\n331 give password\r\n230 Authenticated\r\n257 "/"\r\n200 OK\r\n200 OK\r\n200 OK\r\n226 Transfer complete
+ REPLY PASS 530 Login incorrect
+ </servercmd>
+ </reply>
+
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ ftp
+ </server>
+ <name>
+ FTP STARTTLS pipelined server response
+ </name>
+ <file name="log/test%TESTNUMBER.txt">
+ data
+ to
+ see
+ that FTPS
+ works
+ so does it?
+ </file>
+ <command>
+ --ssl --ftp-ssl-control ftp://%HOSTIP:%FTPPORT/%TESTNUMBER -T log/test%TESTNUMBER.txt -u user:secret -P %CLIENTIP
+ </command>
+ </client>
+
+ # Verify data after the test has been "shot"
+ <verify>
+ # 8 is CURLE_WEIRD_SERVER_REPLY
+ <errorcode>
+ 8
+ </errorcode>
+ <protocol>
+ AUTH SSL
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test984 curl_h5/tests/data/test984
*** curl/tests/data/test984 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test984 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,56 ----
+ <testcase>
+ <info>
+ <keywords>
+ IMAP
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ REPLY CAPABILITY A001 BAD Not implemented
+ </servercmd>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ imap
+ </server>
+ <name>
+ IMAP require STARTTLS with failing capabilities
+ </name>
+ <command>
+ imap://%HOSTIP:%IMAPPORT/%TESTNUMBER -T log/upload%TESTNUMBER -u user:secret --ssl-reqd
+ </command>
+ <file name="log/upload%TESTNUMBER">
+ Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
+ From: Fred Foobar <foobar@example.COM>
+ Subject: afternoon meeting
+ To: joe@example.com
+ Message-Id: <B27397-0100000@example.COM>
+ MIME-Version: 1.0
+ Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
+
+ Hello Joe, do you think we can meet at 3:30 tomorrow?
+ </file>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ # 64 is CURLE_USE_SSL_FAILED
+ <errorcode>
+ 64
+ </errorcode>
+ <protocol>
+ A001 CAPABILITY
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test985 curl_h5/tests/data/test985
*** curl/tests/data/test985 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test985 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,54 ----
+ <testcase>
+ <info>
+ <keywords>
+ POP3
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ REPLY CAPA -ERR Not implemented
+ </servercmd>
+ <data nocheck="yes">
+ From: me@somewhere
+ To: fake@nowhere
+
+ body
+
+ --
+ yours sincerely
+ </data>
+ </reply>
+
+ #
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ pop3
+ </server>
+ <name>
+ POP3 require STARTTLS with failing capabilities
+ </name>
+ <command>
+ pop3://%HOSTIP:%POP3PORT/%TESTNUMBER -u user:secret --ssl-reqd
+ </command>
+ </client>
+
+ #
+ # Verify data after the test has been "shot"
+ <verify>
+ # 64 is CURLE_USE_SSL_FAILED
+ <errorcode>
+ 64
+ </errorcode>
+ <protocol>
+ CAPA
+ </protocol>
+ </verify>
+ </testcase>
diff -crN '--exclude=.git' '--exclude=.gitee' '--exclude=.vscode' curl/tests/data/test986 curl_h5/tests/data/test986
*** curl/tests/data/test986 1970-01-01 08:00:00.000000000 +0800
--- curl_h5/tests/data/test986 2022-08-26 11:21:59.084000000 +0800
***************
*** 0 ****
--- 1,53 ----
+ <testcase>
+ <info>
+ <keywords>
+ FTP
+ STARTTLS
+ </keywords>
+ </info>
+
+ #
+ # Server-side
+ <reply>
+ <servercmd>
+ REPLY welcome 230 Welcome
+ REPLY AUTH 500 unknown command
+ </servercmd>
+ </reply>
+
+ # Client-side
+ <client>
+ <features>
+ SSL
+ </features>
+ <server>
+ ftp
+ </server>
+ <name>
+ FTP require STARTTLS while preauthenticated
+ </name>
+ <file name="log/test%TESTNUMBER.txt">
+ data
+ to
+ see
+ that FTPS
+ works
+ so does it?
+ </file>
+ <command>
+ --ssl-reqd --ftp-ssl-control ftp://%HOSTIP:%FTPPORT/%TESTNUMBER -T log/test%TESTNUMBER.txt -u user:secret
+ </command>
+ </client>
+
+ # Verify data after the test has been "shot"
+ <verify>
+ # 64 is CURLE_USE_SSL_FAILED
+ <errorcode>
+ 64
+ </errorcode>
+ <protocol>
+ AUTH SSL
+ AUTH TLS
+ </protocol>
+ </verify>
+ </testcase>