headers: make curl_easy_header and nextheader return different buffers

By letting curl_easy_header() and curl_easy_nextheader() store the
header data in their own struct storage when they return a pointer to
it, it makes it possible for applications to use them both in a loop.
Like the curl tool does.

Reported-by: Boris Okunskiy
Fixes #10704
Closes #10707
This commit is contained in:
Daniel Stenberg 2023-03-08 00:33:33 +01:00
parent b1d735956f
commit 05616379ee
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 10 additions and 9 deletions

View file

@ -38,14 +38,13 @@
/* Generate the curl_header struct for the user. This function MUST assign all
struct fields in the output struct. */
static void copy_header_external(struct Curl_easy *data,
struct Curl_header_store *hs,
static void copy_header_external(struct Curl_header_store *hs,
size_t index,
size_t amount,
struct Curl_llist_element *e,
struct curl_header **hout)
struct curl_header *hout)
{
struct curl_header *h = *hout = &data->state.headerout;
struct curl_header *h = hout;
h->name = hs->name;
h->value = hs->value;
h->amount = amount;
@ -118,7 +117,9 @@ CURLHcode curl_easy_header(CURL *easy,
return CURLHE_MISSING;
}
/* this is the name we want */
copy_header_external(data, hs, nameindex, amount, e_pick, hout);
copy_header_external(hs, nameindex, amount, e_pick,
&data->state.headerout[0]);
*hout = &data->state.headerout[0];
return CURLHE_OK;
}
@ -132,7 +133,6 @@ struct curl_header *curl_easy_nextheader(CURL *easy,
struct Curl_llist_element *pick;
struct Curl_llist_element *e;
struct Curl_header_store *hs;
struct curl_header *hout;
size_t amount = 0;
size_t index = 0;
@ -179,8 +179,9 @@ struct curl_header *curl_easy_nextheader(CURL *easy,
index = amount - 1;
}
copy_header_external(data, hs, index, amount, pick, &hout);
return hout;
copy_header_external(hs, index, amount, pick,
&data->state.headerout[1]);
return &data->state.headerout[1];
}
static CURLcode namevalue(char *header, size_t hlen, unsigned int type,

View file

@ -1378,7 +1378,7 @@ struct UrlState {
struct dynbuf trailers_buf; /* a buffer containing the compiled trailing
headers */
struct Curl_llist httphdrs; /* received headers */
struct curl_header headerout; /* for external purposes */
struct curl_header headerout[2]; /* for external purposes */
struct Curl_header_store *prevhead; /* the latest added header */
trailers_state trailers_state; /* whether we are sending trailers
and what stage are we at */