mirror of
https://github.com/curl/curl.git
synced 2026-04-14 23:51:42 +03:00
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:
parent
b1d735956f
commit
05616379ee
2 changed files with 10 additions and 9 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue