aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-03-27 23:28:13 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-03-27 23:28:14 +0100
commitdbce1bd86f58468a59df8c2d678a6f9c506d1804 (patch)
treecfa34b3c816dc863261216566283f0aaad1bc9ce
parent8759e335abdf863acef9c67dd9213225251db6fc (diff)
multi: improved HTTP_1_1_REQUIRED handling
Make sure to downgrade to 1.1 even when we get this HTTP/2 stream error on first flight. Reported-by: niner on github Fixes #3696 Closes #3707
-rw-r--r--lib/multi.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/lib/multi.c b/lib/multi.c
index cc16924a3..22d79b5d2 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1881,23 +1881,25 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
}
else if((CURLE_HTTP2_STREAM == result) &&
- Curl_h2_http_1_1_error(data->conn)) {
+ Curl_h2_http_1_1_error(data->conn)) {
CURLcode ret = Curl_retry_request(data->conn, &newurl);
- infof(data, "Forcing HTTP/1.1 for NTLM");
- data->set.httpversion = CURL_HTTP_VERSION_1_1;
-
- if(!ret)
- retry = (newurl)?TRUE:FALSE;
- else
- result = ret;
-
- if(retry) {
- /* if we are to retry, set the result to OK and consider the
- request as done */
+ if(!ret) {
+ infof(data, "Downgrades to HTTP/1.1!\n");
+ data->set.httpversion = CURL_HTTP_VERSION_1_1;
+ /* clear the error message bit too as we ignore the one we got */
+ data->state.errorbuf = FALSE;
+ if(!newurl)
+ /* typically for HTTP_1_1_REQUIRED error on first flight */
+ newurl = strdup(data->change.url);
+ /* if we are to retry, set the result to OK and consider the request
+ as done */
+ retry = TRUE;
result = CURLE_OK;
done = TRUE;
}
+ else
+ result = ret;
}
if(result) {
@@ -1942,13 +1944,12 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
}
else
follow = FOLLOW_RETRY;
- result = multi_done(data, CURLE_OK, FALSE);
+ (void)multi_done(data, CURLE_OK, FALSE);
+ /* multi_done() might return CURLE_GOT_NOTHING */
+ result = Curl_follow(data, newurl, follow);
if(!result) {
- result = Curl_follow(data, newurl, follow);
- if(!result) {
- multistate(data, CURLM_STATE_CONNECT);
- rc = CURLM_CALL_MULTI_PERFORM;
- }
+ multistate(data, CURLM_STATE_CONNECT);
+ rc = CURLM_CALL_MULTI_PERFORM;
}
free(newurl);
}