bd3a29ad创建于 2022年9月16日历史提交
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>