summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2021-08-14 18:04:22 +0200
committerDaniel Stenberg <daniel@haxx.se>2021-08-20 13:37:43 +0200
commitf46b83fc94148efd363a457b4631b99e7c13baec (patch)
tree5590f8b793b53945cf0940e13afe271107af563e /lib
parent5b1c2dd1db6465f4664becc9a8b686e4151fae68 (diff)
downloadcurl-f46b83fc94148efd363a457b4631b99e7c13baec.tar.gz
c-hyper: initial support for "dumping" 1xx HTTP responses
With the use hyper_request_on_informational() Enable test 155 and 158 Closes #7597
Diffstat (limited to 'lib')
-rw-r--r--lib/c-hyper.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/c-hyper.c b/lib/c-hyper.c
index 57ac9af4b..5cb04bb3e 100644
--- a/lib/c-hyper.c
+++ b/lib/c-hyper.c
@@ -723,6 +723,48 @@ static CURLcode cookies(struct Curl_easy *data,
return result;
}
+/* called on 1xx responses */
+static void http1xx_cb(void *arg, struct hyper_response *resp)
+{
+ struct Curl_easy *data = (struct Curl_easy *)arg;
+ hyper_headers *headers = NULL;
+ CURLcode result = CURLE_OK;
+ uint16_t http_status;
+ int http_version;
+ const uint8_t *reasonp;
+ size_t reason_len;
+
+ infof(data, "Got HTTP 1xx informational");
+
+ http_status = hyper_response_status(resp);
+ http_version = hyper_response_version(resp);
+ reasonp = hyper_response_reason_phrase(resp);
+ reason_len = hyper_response_reason_phrase_len(resp);
+
+ result = status_line(data, data->conn,
+ http_status, http_version, reasonp, reason_len);
+ if(!result) {
+ headers = hyper_response_headers(resp);
+ if(!headers) {
+ failf(data, "hyperstream: couldn't get 1xx response headers");
+ result = CURLE_RECV_ERROR;
+ }
+ }
+ data->state.hresult = result;
+
+ if(!result) {
+ /* the headers are already received */
+ hyper_headers_foreach(headers, hyper_each_header, data);
+ /* this callback also sets data->state.hresult on error */
+
+ if(empty_header(data))
+ result = CURLE_OUT_OF_MEMORY;
+ }
+
+ if(data->state.hresult)
+ infof(data, "ERROR in 1xx, bail out!");
+}
+
/*
* Curl_http() gets called from the generic multi_do() function when a HTTP
* request is to be performed. This creates and sends a properly constructed
@@ -746,6 +788,7 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
Curl_HttpReq httpreq;
bool h2 = FALSE;
const char *te = NULL; /* transfer-encoding */
+ hyper_code rc;
/* Always consider the DO phase done after this function call, even if there
may be parts of the request that is not yet sent, since we can deal with
@@ -872,6 +915,10 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
goto error;
}
+ rc = hyper_request_on_informational(req, http1xx_cb, data);
+ if(rc)
+ return CURLE_OUT_OF_MEMORY;
+
result = Curl_http_body(data, conn, httpreq, &te);
if(result)
return result;