Unverified Commit dbce1bd8 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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
parent 8759e335
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -1884,20 +1884,22 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
              Curl_h2_http_1_1_error(data->conn)) {
        CURLcode ret = Curl_retry_request(data->conn, &newurl);

        infof(data, "Forcing HTTP/1.1 for NTLM");
        if(!ret) {
          infof(data, "Downgrades to HTTP/1.1!\n");
          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 */
          /* 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,14 +1944,13 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
          }
          else
            follow = FOLLOW_RETRY;
          result = multi_done(data, CURLE_OK, FALSE);
          if(!result) {
          (void)multi_done(data, CURLE_OK, FALSE);
          /* multi_done() might return CURLE_GOT_NOTHING */
          result = Curl_follow(data, newurl, follow);
          if(!result) {
            multistate(data, CURLM_STATE_CONNECT);
            rc = CURLM_CALL_MULTI_PERFORM;
          }
          }
          free(newurl);
        }
        else {