curl/tests/libtest/lib1940.c
Daniel Stenberg c9b60f0053
http: restore header folding behavior
Folded header lines will now get passed through like before. The headers
API is adapted and will provide the content unfolded.

Added test 1274 and extended test 1940 to verify.

Reported-by: Petr Pisar
Fixes #8844
Closes #8899
2022-05-24 23:33:47 +02:00

118 lines
3.3 KiB
C

/***************************************************************************
* _ _ ____ _
* 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.haxx.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.
*
***************************************************************************/
#include "test.h"
#include "memdebug.h"
static const char *show[]={
"daTE",
"Server",
"content-type",
"content-length",
"location",
"set-cookie",
"silly-thing",
"fold",
NULL
};
#ifdef LIB1946
#define HEADER_REQUEST 0
#else
#define HEADER_REQUEST -1
#endif
static void showem(CURL *easy, unsigned int type)
{
int i;
struct curl_header *header;
for(i = 0; show[i]; i++) {
if(CURLHE_OK == curl_easy_header(easy, show[i], 0, type, HEADER_REQUEST,
&header)) {
if(header->amount > 1) {
/* more than one, iterate over them */
size_t index = 0;
size_t amount = header->amount;
do {
printf("- %s == %s (%u/%u)\n", header->name, header->value,
(int)index, (int)amount);
if(++index == amount)
break;
if(CURLHE_OK != curl_easy_header(easy, show[i], index, type,
HEADER_REQUEST, &header))
break;
} while(1);
}
else {
/* only one of this */
printf(" %s == %s\n", header->name, header->value);
}
}
}
}
static size_t write_cb(char *data, size_t n, size_t l, void *userp)
{
/* take care of the data here, ignored in this example */
(void)data;
(void)userp;
return n*l;
}
int test(char *URL)
{
CURL *easy;
curl_global_init(CURL_GLOBAL_DEFAULT);
easy = curl_easy_init();
if(easy) {
CURLcode res;
curl_easy_setopt(easy, CURLOPT_URL, URL);
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_FOLLOWLOCATION, 1L);
/* ignores any content */
curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_cb);
/* if there's a proxy set, use it */
if(libtest_arg2 && *libtest_arg2) {
curl_easy_setopt(easy, CURLOPT_PROXY, libtest_arg2);
curl_easy_setopt(easy, CURLOPT_HTTPPROXYTUNNEL, 1L);
}
res = curl_easy_perform(easy);
if(res) {
printf("badness: %d\n", (int)res);
}
showem(easy, CURLH_HEADER);
if(libtest_arg2 && *libtest_arg2) {
/* now show connect headers only */
showem(easy, CURLH_CONNECT);
}
showem(easy, CURLH_1XX);
showem(easy, CURLH_TRAILER);
curl_easy_cleanup(easy);
}
curl_global_cleanup();
return 0;
}