http: move headers collecting to writer

- add a client writer that does "push" response
  headers written to the client if the headers api
  is enabled
- remove special handling in sendf.c
- needs to be installed very early on connection
  setup to catch CONNECT response headers

Closes #12880
This commit is contained in:
Stefan Eissing 2024-02-06 13:55:07 +01:00 committed by Daniel Stenberg
parent 5b41fac587
commit 2abfa3833b
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 90 additions and 19 deletions

View file

@ -49,7 +49,6 @@
#include "select.h"
#include "strdup.h"
#include "http2.h"
#include "headers.h"
#include "progress.h"
#include "ws.h"
@ -256,21 +255,6 @@ static CURLcode chop_write(struct Curl_easy *data,
len -= chunklen;
}
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_HEADERS_API)
/* HTTP header, but not status-line */
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
(type & CLIENTWRITE_HEADER) && !(type & CLIENTWRITE_STATUS) ) {
unsigned char htype = (unsigned char)
(type & CLIENTWRITE_CONNECT ? CURLH_CONNECT :
(type & CLIENTWRITE_1XX ? CURLH_1XX :
(type & CLIENTWRITE_TRAILER ? CURLH_TRAILER :
CURLH_HEADER)));
CURLcode result = Curl_headers_push(data, optr, htype);
if(result)
return result;
}
#endif
if(writeheader) {
size_t wrote;
@ -674,6 +658,17 @@ CURLcode Curl_cwriter_add(struct Curl_easy *data,
return CURLE_OK;
}
struct Curl_cwriter *Curl_cwriter_get_by_name(struct Curl_easy *data,
const char *name)
{
struct Curl_cwriter *writer;
for(writer = data->req.writer_stack; writer; writer = writer->next) {
if(!strcmp(name, writer->cwt->name))
return writer;
}
return NULL;
}
void Curl_cwriter_remove_by_name(struct Curl_easy *data,
const char *name)
{