remote-curl: rewrite base url from info/refs redirects
authorJeff King <peff@peff.net>
Sat, 28 Sep 2013 08:35:35 +0000 (04:35 -0400)
committerJonathan Nieder <jrnieder@gmail.com>
Tue, 15 Oct 2013 00:01:34 +0000 (17:01 -0700)
commit050ef3655c8ea1dc7a2b3b843ca7c45dd94d9c88
treec5f0f3da2da24b72fe828c634897991636cafe97
parentb227bbc43a568b282b5f8cb35e563d00d60b272d
remote-curl: rewrite base url from info/refs redirects

For efficiency and security reasons, an earlier commit in
this series taught http_get_* to re-write the base url based
on redirections we saw while making a specific request.

This commit wires that option into the info/refs request,
meaning that a redirect from

    http://example.com/foo.git/info/refs

to

    https://example.com/bar.git/info/refs

will behave as if "https://example.com/bar.git" had been
provided to git in the first place.

The tests bear some explanation. We introduce two new
hierearchies into the httpd test config:

  1. Requests to /smart-redir-limited will work only for the
     initial info/refs request, but not any subsequent
     requests. As a result, we can confirm whether the
     client is re-rooting its requests after the initial
     contact, since otherwise it will fail (it will ask for
     "repo.git/git-upload-pack", which is not redirected).

  2. Requests to smart-redir-auth will redirect, and require
     auth after the redirection. Since we are using the
     redirected base for further requests, we also update
     the credential struct, in order not to mislead the user
     (or credential helpers) about which credential is
     needed. We can therefore check the GIT_ASKPASS prompts
     to make sure we are prompting for the new location.
     Because we have neither multiple servers nor https
     support in our test setup, we can only redirect between
     paths, meaning we need to turn on
     credential.useHttpPath to see the difference.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
remote-curl.c
t/lib-httpd.sh
t/lib-httpd/apache.conf
t/t5551-http-fetch.sh