• J
    http: attempt updating base URL only if no error · 8e27391a
    Jonathan Tan 提交于
    http.c supports HTTP redirects of the form
    
      http://foo/info/refs?service=git-upload-pack
      -> http://anything
      -> http://bar/info/refs?service=git-upload-pack
    
    (that is to say, as long as the Git part of the path and the query
    string is preserved in the final redirect destination, the intermediate
    steps can have any URL). However, if one of the intermediate steps
    results in an HTTP exception, a confusing "unable to update url base
    from redirection" message is printed instead of a Curl error message
    with the HTTP exception code.
    
    This was introduced by 2 commits. Commit c93c92f3 ("http: update base
    URLs when we see redirects", 2013-09-28) introduced a best-effort
    optimization that required checking if only the "base" part of the URL
    differed between the initial request and the final redirect destination,
    but it performed the check before any HTTP status checking was done. If
    something went wrong, the normal code path was still followed, so this
    did not cause any confusing error messages until commit 6628eb41 ("http:
    always update the base URL for redirects", 2016-12-06), which taught
    http to die if the non-"base" part of the URL differed.
    
    Therefore, teach http to check the HTTP status before attempting to
    check if only the "base" part of the URL differed. This commit teaches
    http_request_reauth to return early without updating options->base_url
    upon an error; the only invoker of this function that passes a non-NULL
    "options" is remote-curl.c (through "http_get_strbuf"), which only uses
    options->base_url for an informational message in the situations that
    this commit cares about (that is, when the return value is not HTTP_OK).
    
    The included test checks that the redirect scheme at the beginning of
    this commit message works, and that returning a 502 in the middle of the
    redirect scheme produces the correct result. Note that this is different
    from the test in commit 6628eb41 ("http: always update the base URL for
    redirects", 2016-12-06) in that this commit tests that a Git-shaped URL
    (http://.../info/refs?service=git-upload-pack) works, whereas commit
    6628eb41 tests that a non-Git-shaped URL
    (http://.../info/refs/foo?service=git-upload-pack) does not work (even
    though Git is processing that URL) and is an error that is fatal, not
    silently swallowed.
    Signed-off-by: NJonathan Tan <jonathantanmy@google.com>
    Acked-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    8e27391a
t5550-http-fetch-dumb.sh 13.1 KB