Revision b81401c1de0e0fec39f8643ce7a794fda083f7a1 authored by Jeff King on 27 August 2012, 13:27:15 UTC, committed by Junio C Hamano on 27 August 2012, 17:49:09 UTC
All of the smart-http GET requests go through the http_get_* functions, which will prompt for credentials and retry if we see an HTTP 401. POST requests, however, do not go through any central point. Moreover, it is difficult to retry in the general case; we cannot assume the request body fits in memory or is even seekable, and we don't know how much of it was consumed during the attempt. Most of the time, this is not a big deal; for both fetching and pushing, we make a GET request before doing any POSTs, so typically we figure out the credentials during the first request, then reuse them during the POST. However, some servers may allow a client to get the list of refs from receive-pack without authentication, and then require authentication when the client actually tries to POST the pack. This is not ideal, as the client may do a non-trivial amount of work to generate the pack (e.g., delta-compressing objects). However, for a long time it has been the recommended example configuration in git-http-backend(1) for setting up a repository with anonymous fetch and authenticated push. This setup has always been broken without putting a username into the URL. Prior to commit 986bbc0, it did work with a username in the URL, because git would prompt for credentials before making any requests at all. However, post-986bbc0, it is totally broken. Since it has been advertised in the manpage for some time, we should make sure it works. Unfortunately, it is not as easy as simply calling post_rpc again when it fails, due to the input issue mentioned above. However, we can still make this specific case work by retrying in two specific instances: 1. If the request is large (bigger than LARGE_PACKET_MAX), we will first send a probe request with a single flush packet. Since this request is static, we can freely retry it. 2. If the request is small and we are not using gzip, then we have the whole thing in-core, and we can freely retry. That means we will not retry in some instances, including: 1. If we are using gzip. However, we only do so when calling git-upload-pack, so it does not apply to pushes. 2. If we have a large request, the probe succeeds, but then the real POST wants authentication. This is an extremely unlikely configuration and not worth worrying about. While it might be nice to cover those instances, doing so would be significantly more complex for very little real-world gain. In the long run, we will be much better off when curl learns to internally handle authentication as a callback, and we can cleanly handle all cases that way. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 8809703
File | Mode | Size |
---|---|---|
Documentation | ||
block-sha1 | ||
builtin | ||
compat | ||
contrib | ||
git-gui | ||
git_remote_helpers | ||
gitk-git | ||
gitweb | ||
mergetools | ||
perl | ||
po | ||
ppc | ||
t | ||
templates | ||
vcs-svn | ||
xdiff | ||
.gitattributes | -rw-r--r-- | 105 bytes |
.gitignore | -rw-r--r-- | 3.2 KB |
.mailmap | -rw-r--r-- | 3.0 KB |
COPYING | -rw-r--r-- | 18.3 KB |
GIT-VERSION-GEN | -rwxr-xr-x | 755 bytes |
INSTALL | -rw-r--r-- | 8.5 KB |
LGPL-2.1 | -rw-r--r-- | 26.2 KB |
Makefile | -rw-r--r-- | 78.0 KB |
README | -rw-r--r-- | 2.5 KB |
RelNotes | l--------- | 35 bytes |
abspath.c | -rw-r--r-- | 4.2 KB |
aclocal.m4 | -rw-r--r-- | 1.4 KB |
advice.c | -rw-r--r-- | 2.6 KB |
advice.h | -rw-r--r-- | 673 bytes |
alias.c | -rw-r--r-- | 1.7 KB |
alloc.c | -rw-r--r-- | 1.6 KB |
archive-tar.c | -rw-r--r-- | 9.1 KB |
archive-zip.c | -rw-r--r-- | 7.5 KB |
archive.c | -rw-r--r-- | 12.0 KB |
archive.h | -rw-r--r-- | 1.1 KB |
argv-array.c | -rw-r--r-- | 1.2 KB |
argv-array.h | -rw-r--r-- | 513 bytes |
attr.c | -rw-r--r-- | 18.8 KB |
attr.h | -rw-r--r-- | 1.6 KB |
base85.c | -rw-r--r-- | 2.8 KB |
bisect.c | -rw-r--r-- | 22.9 KB |
bisect.h | -rw-r--r-- | 769 bytes |
blob.c | -rw-r--r-- | 565 bytes |
blob.h | -rw-r--r-- | 664 bytes |
branch.c | -rw-r--r-- | 6.7 KB |
branch.h | -rw-r--r-- | 1.9 KB |
builtin.h | -rw-r--r-- | 9.0 KB |
bulk-checkin.c | -rw-r--r-- | 7.0 KB |
bulk-checkin.h | -rw-r--r-- | 343 bytes |
bundle.c | -rw-r--r-- | 10.9 KB |
bundle.h | -rw-r--r-- | 707 bytes |
cache-tree.c | -rw-r--r-- | 15.9 KB |
cache-tree.h | -rw-r--r-- | 1.4 KB |
cache.h | -rw-r--r-- | 45.5 KB |
check-builtins.sh | -rwxr-xr-x | 588 bytes |
check-racy.c | -rw-r--r-- | 538 bytes |
check_bindir | -rwxr-xr-x | 369 bytes |
color.c | -rw-r--r-- | 5.2 KB |
color.h | -rw-r--r-- | 3.1 KB |
combine-diff.c | -rw-r--r-- | 31.5 KB |
command-list.txt | -rw-r--r-- | 7.8 KB |
commit.c | -rw-r--r-- | 27.5 KB |
commit.h | -rw-r--r-- | 7.4 KB |
config.c | -rw-r--r-- | 37.9 KB |
config.mak.in | -rw-r--r-- | 1.9 KB |
configure.ac | -rw-r--r-- | 30.2 KB |
connect.c | -rw-r--r-- | 13.7 KB |
connected.c | -rw-r--r-- | 1.5 KB |
connected.h | -rw-r--r-- | 651 bytes |
convert.c | -rw-r--r-- | 29.8 KB |
convert.h | -rw-r--r-- | 2.2 KB |
copy.c | -rw-r--r-- | 1.6 KB |
credential-cache--daemon.c | -rw-r--r-- | 5.9 KB |
credential-cache.c | -rw-r--r-- | 2.9 KB |
credential-store.c | -rw-r--r-- | 3.9 KB |
credential.c | -rw-r--r-- | 7.5 KB |
credential.h | -rw-r--r-- | 764 bytes |
csum-file.c | -rw-r--r-- | 4.0 KB |
csum-file.h | -rw-r--r-- | 1.1 KB |
ctype.c | -rw-r--r-- | 2.5 KB |
daemon.c | -rw-r--r-- | 29.1 KB |
date.c | -rw-r--r-- | 23.9 KB |
decorate.c | -rw-r--r-- | 1.8 KB |
decorate.h | -rw-r--r-- | 400 bytes |
delta.h | -rw-r--r-- | 3.4 KB |
diff-delta.c | -rw-r--r-- | 15.5 KB |
diff-lib.c | -rw-r--r-- | 13.8 KB |
diff-no-index.c | -rw-r--r-- | 6.2 KB |
diff.c | -rw-r--r-- | 129.0 KB |
diff.h | -rw-r--r-- | 10.9 KB |
diffcore-break.c | -rw-r--r-- | 8.7 KB |
diffcore-delta.c | -rw-r--r-- | 5.4 KB |
diffcore-order.c | -rw-r--r-- | 2.2 KB |
diffcore-pickaxe.c | -rw-r--r-- | 6.1 KB |
diffcore-rename.c | -rw-r--r-- | 18.5 KB |
diffcore.h | -rw-r--r-- | 4.4 KB |
dir.c | -rw-r--r-- | 30.4 KB |
dir.h | -rw-r--r-- | 3.4 KB |
editor.c | -rw-r--r-- | 1.1 KB |
entry.c | -rw-r--r-- | 7.7 KB |
environment.c | -rw-r--r-- | 7.4 KB |
exec_cmd.c | -rw-r--r-- | 3.2 KB |
exec_cmd.h | -rw-r--r-- | 487 bytes |
fast-import.c | -rw-r--r-- | 87.3 KB |
fetch-pack.h | -rw-r--r-- | 495 bytes |
fixup-builtins | -rwxr-xr-x | 432 bytes |
fmt-merge-msg.h | -rw-r--r-- | 187 bytes |
fsck.c | -rw-r--r-- | 9.5 KB |
fsck.h | -rw-r--r-- | 1.0 KB |
generate-cmdlist.sh | -rwxr-xr-x | 429 bytes |
gettext.c | -rw-r--r-- | 3.8 KB |
gettext.h | -rw-r--r-- | 1.3 KB |
git-add--interactive.perl | -rwxr-xr-x | 35.8 KB |
git-am.sh | -rwxr-xr-x | 21.5 KB |
git-archimport.perl | -rwxr-xr-x | 36.0 KB |
git-bisect.sh | -rwxr-xr-x | 11.2 KB |
git-compat-util.h | -rw-r--r-- | 14.7 KB |
git-cvsexportcommit.perl | -rwxr-xr-x | 12.6 KB |
git-cvsimport.perl | -rwxr-xr-x | 29.5 KB |
git-cvsserver.perl | -rwxr-xr-x | 118.0 KB |
git-difftool--helper.sh | -rwxr-xr-x | 1.7 KB |
git-difftool.perl | -rwxr-xr-x | 2.6 KB |
git-filter-branch.sh | -rwxr-xr-x | 11.8 KB |
git-instaweb.sh | -rwxr-xr-x | 17.8 KB |
git-lost-found.sh | -rwxr-xr-x | 554 bytes |
git-merge-octopus.sh | -rwxr-xr-x | 2.2 KB |
git-merge-one-file.sh | -rwxr-xr-x | 3.8 KB |
git-merge-resolve.sh | -rwxr-xr-x | 944 bytes |
git-mergetool--lib.sh | -rw-r--r-- | 4.1 KB |
git-mergetool.sh | -rwxr-xr-x | 8.4 KB |
git-parse-remote.sh | -rw-r--r-- | 2.1 KB |
git-pull.sh | -rwxr-xr-x | 7.5 KB |
git-quiltimport.sh | -rwxr-xr-x | 3.3 KB |
git-rebase--am.sh | -rw-r--r-- | 615 bytes |
git-rebase--interactive.sh | -rw-r--r-- | 22.3 KB |
git-rebase--merge.sh | -rw-r--r-- | 3.0 KB |
git-rebase.sh | -rwxr-xr-x | 13.0 KB |
git-relink.perl | -rwxr-xr-x | 4.0 KB |
git-remote-testgit.py | -rw-r--r-- | 6.1 KB |
git-repack.sh | -rwxr-xr-x | 4.9 KB |
git-request-pull.sh | -rwxr-xr-x | 3.0 KB |
git-send-email.perl | -rwxr-xr-x | 39.4 KB |
git-sh-i18n.sh | -rw-r--r-- | 2.0 KB |
git-sh-setup.sh | -rw-r--r-- | 4.8 KB |
git-stash.sh | -rwxr-xr-x | 12.6 KB |
git-submodule.sh | -rwxr-xr-x | 21.6 KB |
git-svn.perl | -rwxr-xr-x | 188.5 KB |
git-web--browse.sh | -rwxr-xr-x | 4.1 KB |
git.c | -rw-r--r-- | 16.8 KB |
git.spec.in | -rw-r--r-- | 11.1 KB |
gpg-interface.c | -rw-r--r-- | 3.3 KB |
gpg-interface.h | -rw-r--r-- | 451 bytes |
graph.c | -rw-r--r-- | 34.5 KB |
graph.h | -rw-r--r-- | 3.6 KB |
grep.c | -rw-r--r-- | 31.0 KB |
grep.h | -rw-r--r-- | 4.1 KB |
hash.c | -rw-r--r-- | 2.5 KB |
hash.h | -rw-r--r-- | 1.1 KB |
help.c | -rw-r--r-- | 9.5 KB |
help.h | -rw-r--r-- | 906 bytes |
hex.c | -rw-r--r-- | 2.3 KB |
http-backend.c | -rw-r--r-- | 13.1 KB |
http-fetch.c | -rw-r--r-- | 2.3 KB |
http-push.c | -rw-r--r-- | 50.8 KB |
http-walker.c | -rw-r--r-- | 13.9 KB |
http.c | -rw-r--r-- | 32.4 KB |
http.h | -rw-r--r-- | 5.1 KB |
ident.c | -rw-r--r-- | 8.6 KB |
imap-send.c | -rw-r--r-- | 34.8 KB |
kwset.c | -rw-r--r-- | 20.5 KB |
kwset.h | -rw-r--r-- | 2.6 KB |
levenshtein.c | -rw-r--r-- | 2.5 KB |
levenshtein.h | -rw-r--r-- | 203 bytes |
list-objects.c | -rw-r--r-- | 5.5 KB |
list-objects.h | -rw-r--r-- | 429 bytes |
ll-merge.c | -rw-r--r-- | 10.0 KB |
ll-merge.h | -rw-r--r-- | 567 bytes |
lockfile.c | -rw-r--r-- | 6.2 KB |
log-tree.c | -rw-r--r-- | 21.4 KB |
log-tree.h | -rw-r--r-- | 867 bytes |
mailmap.c | -rw-r--r-- | 6.5 KB |
mailmap.h | -rw-r--r-- | 263 bytes |
match-trees.c | -rw-r--r-- | 8.7 KB |
merge-file.c | -rw-r--r-- | 2.6 KB |
merge-file.h | -rw-r--r-- | 175 bytes |
merge-recursive.c | -rw-r--r-- | 57.6 KB |
merge-recursive.h | -rw-r--r-- | 1.7 KB |
name-hash.c | -rw-r--r-- | 4.7 KB |
notes-cache.c | -rw-r--r-- | 2.2 KB |
notes-cache.h | -rw-r--r-- | 500 bytes |
notes-merge.c | -rw-r--r-- | 23.4 KB |
notes-merge.h | -rw-r--r-- | 3.5 KB |
notes.c | -rw-r--r-- | 35.8 KB |
notes.h | -rw-r--r-- | 11.9 KB |
object.c | -rw-r--r-- | 5.9 KB |
object.h | -rw-r--r-- | 2.5 KB |
pack-check.c | -rw-r--r-- | 5.0 KB |
pack-refs.c | -rw-r--r-- | 3.3 KB |
pack-refs.h | -rw-r--r-- | 465 bytes |
pack-revindex.c | -rw-r--r-- | 4.0 KB |
pack-revindex.h | -rw-r--r-- | 223 bytes |
pack-write.c | -rw-r--r-- | 10.4 KB |
pack.h | -rw-r--r-- | 3.2 KB |
pager.c | -rw-r--r-- | 3.1 KB |
parse-options-cb.c | -rw-r--r-- | 2.5 KB |
parse-options.c | -rw-r--r-- | 15.1 KB |
parse-options.h | -rw-r--r-- | 8.2 KB |
patch-delta.c | -rw-r--r-- | 2.2 KB |
patch-ids.c | -rw-r--r-- | 2.5 KB |
patch-ids.h | -rw-r--r-- | 490 bytes |
path.c | -rw-r--r-- | 15.0 KB |
pkt-line.c | -rw-r--r-- | 4.5 KB |
pkt-line.h | -rw-r--r-- | 589 bytes |
preload-index.c | -rw-r--r-- | 2.4 KB |
pretty.c | -rw-r--r-- | 34.4 KB |
progress.c | -rw-r--r-- | 6.5 KB |
progress.h | -rw-r--r-- | 504 bytes |
prompt.c | -rw-r--r-- | 1.4 KB |
prompt.h | -rw-r--r-- | 207 bytes |
quote.c | -rw-r--r-- | 11.3 KB |
quote.h | -rw-r--r-- | 2.9 KB |
reachable.c | -rw-r--r-- | 6.2 KB |
reachable.h | -rw-r--r-- | 163 bytes |
read-cache.c | -rw-r--r-- | 44.9 KB |
reflog-walk.c | -rw-r--r-- | 8.3 KB |
reflog-walk.h | -rw-r--r-- | 773 bytes |
refs.c | -rw-r--r-- | 52.2 KB |
refs.h | -rw-r--r-- | 5.7 KB |
remote-curl.c | -rw-r--r-- | 21.6 KB |
remote.c | -rw-r--r-- | 42.0 KB |
remote.h | -rw-r--r-- | 4.2 KB |
replace_object.c | -rw-r--r-- | 2.7 KB |
rerere.c | -rw-r--r-- | 17.9 KB |
rerere.h | -rw-r--r-- | 829 bytes |
resolve-undo.c | -rw-r--r-- | 3.9 KB |
resolve-undo.h | -rw-r--r-- | 546 bytes |
revision.c | -rw-r--r-- | 64.4 KB |
revision.h | -rw-r--r-- | 5.6 KB |
run-command.c | -rw-r--r-- | 16.1 KB |
run-command.h | -rw-r--r-- | 2.9 KB |
send-pack.h | -rw-r--r-- | 403 bytes |
sequencer.c | -rw-r--r-- | 25.5 KB |
sequencer.h | -rw-r--r-- | 856 bytes |
server-info.c | -rw-r--r-- | 5.1 KB |
setup.c | -rw-r--r-- | 20.2 KB |
sh-i18n--envsubst.c | -rw-r--r-- | 10.7 KB |
sha1-array.c | -rw-r--r-- | 1.2 KB |
sha1-array.h | -rw-r--r-- | 631 bytes |
sha1-lookup.c | -rw-r--r-- | 7.8 KB |
sha1-lookup.h | -rw-r--r-- | 403 bytes |
sha1_file.c | -rw-r--r-- | 70.3 KB |
sha1_name.c | -rw-r--r-- | 26.5 KB |
shallow.c | -rw-r--r-- | 2.3 KB |
shell.c | -rw-r--r-- | 5.1 KB |
shortlog.h | -rw-r--r-- | 463 bytes |
show-index.c | -rw-r--r-- | 2.2 KB |
sideband.c | -rw-r--r-- | 3.4 KB |
sideband.h | -rw-r--r-- | 326 bytes |
sigchain.c | -rw-r--r-- | 969 bytes |
sigchain.h | -rw-r--r-- | 215 bytes |
strbuf.c | -rw-r--r-- | 9.3 KB |
strbuf.h | -rw-r--r-- | 4.5 KB |
streaming.c | -rw-r--r-- | 10.4 KB |
streaming.h | -rw-r--r-- | 404 bytes |
string-list.c | -rw-r--r-- | 4.7 KB |
string-list.h | -rw-r--r-- | 2.1 KB |
submodule.c | -rw-r--r-- | 25.1 KB |
submodule.h | -rw-r--r-- | 1.4 KB |
symlinks.c | -rw-r--r-- | 9.2 KB |
tag.c | -rw-r--r-- | 3.9 KB |
tag.h | -rw-r--r-- | 576 bytes |
tar.h | -rw-r--r-- | 644 bytes |
test-chmtime.c | -rw-r--r-- | 2.6 KB |
test-credential.c | -rw-r--r-- | 791 bytes |
test-ctype.c | -rw-r--r-- | 918 bytes |
test-date.c | -rw-r--r-- | 1.4 KB |
test-delta.c | -rw-r--r-- | 1.8 KB |
test-dump-cache-tree.c | -rw-r--r-- | 1.5 KB |
test-genrandom.c | -rw-r--r-- | 722 bytes |
test-index-version.c | -rw-r--r-- | 264 bytes |
test-line-buffer.c | -rw-r--r-- | 2.1 KB |
test-match-trees.c | -rw-r--r-- | 588 bytes |
test-mktemp.c | -rw-r--r-- | 269 bytes |
test-parse-options.c | -rw-r--r-- | 3.4 KB |
test-path-utils.c | -rw-r--r-- | 1.3 KB |
test-run-command.c | -rw-r--r-- | 840 bytes |
test-scrap-cache-tree.c | -rw-r--r-- | 395 bytes |
test-sha1.c | -rw-r--r-- | 816 bytes |
test-sha1.sh | -rwxr-xr-x | 1.9 KB |
test-sigchain.c | -rw-r--r-- | 344 bytes |
test-subprocess.c | -rw-r--r-- | 392 bytes |
test-svn-fe.c | -rw-r--r-- | 1.3 KB |
thread-utils.c | -rw-r--r-- | 1.3 KB |
thread-utils.h | -rw-r--r-- | 209 bytes |
trace.c | -rw-r--r-- | 4.7 KB |
transport-helper.c | -rw-r--r-- | 29.2 KB |
transport.c | -rw-r--r-- | 31.2 KB |
transport.h | -rw-r--r-- | 5.8 KB |
tree-diff.c | -rw-r--r-- | 8.6 KB |
tree-walk.c | -rw-r--r-- | 15.5 KB |
tree-walk.h | -rw-r--r-- | 2.2 KB |
tree.c | -rw-r--r-- | 6.1 KB |
tree.h | -rw-r--r-- | 897 bytes |
unimplemented.sh | -rw-r--r-- | 100 bytes |
unix-socket.c | -rw-r--r-- | 2.4 KB |
unix-socket.h | -rw-r--r-- | 158 bytes |
unpack-trees.c | -rw-r--r-- | 47.2 KB |
unpack-trees.h | -rw-r--r-- | 2.2 KB |
upload-pack.c | -rw-r--r-- | 19.9 KB |
url.c | -rw-r--r-- | 2.8 KB |
url.h | -rw-r--r-- | 492 bytes |
usage.c | -rw-r--r-- | 2.9 KB |
userdiff.c | -rw-r--r-- | 9.3 KB |
userdiff.h | -rw-r--r-- | 646 bytes |
utf8.c | -rw-r--r-- | 13.0 KB |
utf8.h | -rw-r--r-- | 658 bytes |
walker.c | -rw-r--r-- | 7.2 KB |
walker.h | -rw-r--r-- | 1.1 KB |
wrap-for-bin.sh | -rw-r--r-- | 678 bytes |
wrapper.c | -rw-r--r-- | 8.1 KB |
write_or_die.c | -rw-r--r-- | 2.0 KB |
ws.c | -rw-r--r-- | 9.6 KB |
wt-status.c | -rw-r--r-- | 25.6 KB |
wt-status.h | -rw-r--r-- | 2.0 KB |
xdiff-interface.c | -rw-r--r-- | 8.2 KB |
xdiff-interface.h | -rw-r--r-- | 1.1 KB |
zlib.c | -rw-r--r-- | 5.8 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...