rugged 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +3 -3
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_commit.c +1 -1
- data/ext/rugged/rugged_config.c +1 -1
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_remote.c +32 -2
- data/ext/rugged/rugged_repo.c +13 -3
- data/lib/rugged/commit.rb +17 -4
- data/lib/rugged/repository.rb +7 -8
- data/lib/rugged/submodule_collection.rb +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +41 -74
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
- data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
- data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
- data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
- data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
- data/vendor/libgit2/deps/pcre/LICENCE +93 -0
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
- data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
- data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/zlib/deflate.c +1 -0
- data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
- data/vendor/libgit2/include/git2/apply.h +2 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +95 -42
- data/vendor/libgit2/include/git2/blob.h +31 -3
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +33 -6
- data/vendor/libgit2/include/git2/config.h +1 -1
- data/vendor/libgit2/include/git2/deprecated.h +248 -8
- data/vendor/libgit2/include/git2/diff.h +35 -20
- data/vendor/libgit2/include/git2/errors.h +8 -7
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +4 -5
- data/vendor/libgit2/include/git2/indexer.h +2 -1
- data/vendor/libgit2/include/git2/odb.h +44 -20
- data/vendor/libgit2/include/git2/pack.h +1 -1
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +9 -5
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/repository.h +95 -52
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/strarray.h +6 -10
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/transport.h +1 -1
- data/vendor/libgit2/include/git2/tree.h +2 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +77 -44
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +21 -8
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/assert_safe.h +58 -0
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +92 -42
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +44 -40
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +28 -15
- data/vendor/libgit2/src/blame_git.c +6 -3
- data/vendor/libgit2/src/blob.c +46 -24
- data/vendor/libgit2/src/branch.c +87 -37
- data/vendor/libgit2/src/buffer.c +339 -27
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +3 -24
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +97 -98
- data/vendor/libgit2/src/cherrypick.c +8 -2
- data/vendor/libgit2/src/clone.c +104 -29
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +26 -2
- data/vendor/libgit2/src/config.c +40 -22
- data/vendor/libgit2/src/config_cache.c +9 -4
- data/vendor/libgit2/src/config_entries.c +35 -27
- data/vendor/libgit2/src/config_file.c +25 -8
- data/vendor/libgit2/src/config_parse.c +5 -7
- data/vendor/libgit2/src/config_snapshot.c +2 -1
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +11 -4
- data/vendor/libgit2/src/diff.c +23 -19
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +5 -7
- data/vendor/libgit2/src/diff_generate.c +56 -28
- data/vendor/libgit2/src/diff_parse.c +2 -3
- data/vendor/libgit2/src/diff_print.c +81 -65
- data/vendor/libgit2/src/diff_stats.c +19 -16
- data/vendor/libgit2/src/diff_tform.c +13 -13
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +26 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +7 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +209 -113
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +8 -8
- data/vendor/libgit2/src/futils.h +4 -4
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/idxmap.c +0 -22
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +126 -84
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +60 -36
- data/vendor/libgit2/src/integer.h +79 -2
- data/vendor/libgit2/src/iterator.c +40 -28
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +108 -46
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +15 -9
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +879 -0
- data/vendor/libgit2/src/midx.h +110 -0
- data/vendor/libgit2/src/mwindow.c +214 -95
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +133 -4
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +24 -15
- data/vendor/libgit2/src/odb.c +298 -57
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +31 -21
- data/vendor/libgit2/src/odb_mempack.c +3 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +7 -4
- data/vendor/libgit2/src/pack-objects.c +83 -69
- data/vendor/libgit2/src/pack.c +383 -150
- data/vendor/libgit2/src/pack.h +44 -9
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +3 -5
- data/vendor/libgit2/src/patch_parse.c +6 -3
- data/vendor/libgit2/src/path.c +102 -57
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +12 -11
- data/vendor/libgit2/src/pool.c +34 -22
- data/vendor/libgit2/src/pool.h +9 -1
- data/vendor/libgit2/src/posix.c +43 -12
- data/vendor/libgit2/src/posix.h +9 -0
- data/vendor/libgit2/src/proxy.c +2 -0
- data/vendor/libgit2/src/push.c +2 -0
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +95 -49
- data/vendor/libgit2/src/refdb.c +165 -13
- data/vendor/libgit2/src/refdb.h +69 -0
- data/vendor/libgit2/src/refdb_fs.c +144 -152
- data/vendor/libgit2/src/reflog.c +21 -20
- data/vendor/libgit2/src/refs.c +151 -231
- data/vendor/libgit2/src/refs.h +2 -20
- data/vendor/libgit2/src/refspec.c +80 -44
- data/vendor/libgit2/src/regexp.c +2 -2
- data/vendor/libgit2/src/remote.c +312 -121
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +351 -189
- data/vendor/libgit2/src/repository.h +23 -29
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +8 -2
- data/vendor/libgit2/src/revparse.c +19 -13
- data/vendor/libgit2/src/revwalk.c +35 -20
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.c +2 -3
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +7 -3
- data/vendor/libgit2/src/status.c +9 -4
- data/vendor/libgit2/src/strarray.c +64 -0
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +113 -207
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +10 -9
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +134 -66
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +8 -26
- data/vendor/libgit2/src/sysdir.h +0 -11
- data/vendor/libgit2/src/tag.c +49 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +21 -9
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +17 -7
- data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +84 -42
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +5 -5
- data/vendor/libgit2/src/transports/smart.c +14 -9
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +156 -88
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/posix.h +16 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +74 -183
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/git2.rc +18 -3
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +23 -25
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +77 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +37 -15
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +56 -38
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -361
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -246
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -54,6 +54,7 @@ int git_credential_userpass(
|
|
|
54
54
|
|
|
55
55
|
/* Deprecated credential functions */
|
|
56
56
|
|
|
57
|
+
#ifndef GIT_DEPRECATE_HARD
|
|
57
58
|
int git_cred_userpass(
|
|
58
59
|
git_credential **out,
|
|
59
60
|
const char *url,
|
|
@@ -64,3 +65,4 @@ int git_cred_userpass(
|
|
|
64
65
|
return git_credential_userpass(out, url, user_from_url,
|
|
65
66
|
allowed_types, payload);
|
|
66
67
|
}
|
|
68
|
+
#endif
|
|
@@ -327,7 +327,7 @@ static int _git_close(git_smart_subtransport *subtransport)
|
|
|
327
327
|
{
|
|
328
328
|
git_subtransport *t = (git_subtransport *) subtransport;
|
|
329
329
|
|
|
330
|
-
|
|
330
|
+
GIT_ASSERT(!t->current_stream);
|
|
331
331
|
|
|
332
332
|
GIT_UNUSED(t);
|
|
333
333
|
|
|
@@ -338,8 +338,6 @@ static void _git_free(git_smart_subtransport *subtransport)
|
|
|
338
338
|
{
|
|
339
339
|
git_subtransport *t = (git_subtransport *) subtransport;
|
|
340
340
|
|
|
341
|
-
assert(!t->current_stream);
|
|
342
|
-
|
|
343
341
|
git__free(t);
|
|
344
342
|
}
|
|
345
343
|
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
#include "buffer.h"
|
|
15
15
|
#include "net.h"
|
|
16
16
|
#include "netops.h"
|
|
17
|
-
#include "global.h"
|
|
18
17
|
#include "remote.h"
|
|
19
18
|
#include "git2/sys/credential.h"
|
|
20
19
|
#include "smart.h"
|
|
@@ -105,6 +104,11 @@ static int apply_url_credentials(
|
|
|
105
104
|
const char *username,
|
|
106
105
|
const char *password)
|
|
107
106
|
{
|
|
107
|
+
GIT_ASSERT_ARG(username);
|
|
108
|
+
|
|
109
|
+
if (!password)
|
|
110
|
+
password = "";
|
|
111
|
+
|
|
108
112
|
if (allowed_types & GIT_CREDENTIAL_USERPASS_PLAINTEXT)
|
|
109
113
|
return git_credential_userpass_plaintext_new(cred, username, password);
|
|
110
114
|
|
|
@@ -139,8 +143,7 @@ static int handle_auth(
|
|
|
139
143
|
/* Start with URL-specified credentials, if there were any. */
|
|
140
144
|
if ((allowed_credtypes & GIT_CREDENTIAL_USERPASS_PLAINTEXT) &&
|
|
141
145
|
!server->url_cred_presented &&
|
|
142
|
-
server->url.username
|
|
143
|
-
server->url.password) {
|
|
146
|
+
server->url.username) {
|
|
144
147
|
error = apply_url_credentials(&server->cred, allowed_credtypes, server->url.username, server->url.password);
|
|
145
148
|
server->url_cred_presented = 1;
|
|
146
149
|
|
|
@@ -159,7 +162,7 @@ static int handle_auth(
|
|
|
159
162
|
|
|
160
163
|
if (error > 0) {
|
|
161
164
|
git_error_set(GIT_ERROR_HTTP, "%s authentication required but no callback set", server_type);
|
|
162
|
-
error =
|
|
165
|
+
error = GIT_EAUTH;
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
if (!error)
|
|
@@ -176,7 +179,7 @@ GIT_INLINE(int) handle_remote_auth(
|
|
|
176
179
|
|
|
177
180
|
if (response->server_auth_credtypes == 0) {
|
|
178
181
|
git_error_set(GIT_ERROR_HTTP, "server requires authentication that we do not support");
|
|
179
|
-
return
|
|
182
|
+
return GIT_EAUTH;
|
|
180
183
|
}
|
|
181
184
|
|
|
182
185
|
/* Otherwise, prompt for credentials. */
|
|
@@ -198,7 +201,7 @@ GIT_INLINE(int) handle_proxy_auth(
|
|
|
198
201
|
|
|
199
202
|
if (response->proxy_auth_credtypes == 0) {
|
|
200
203
|
git_error_set(GIT_ERROR_HTTP, "proxy requires authentication that we do not support");
|
|
201
|
-
return
|
|
204
|
+
return GIT_EAUTH;
|
|
202
205
|
}
|
|
203
206
|
|
|
204
207
|
/* Otherwise, prompt for credentials. */
|
|
@@ -256,7 +259,7 @@ static int handle_response(
|
|
|
256
259
|
} else if (response->status == GIT_HTTP_STATUS_UNAUTHORIZED ||
|
|
257
260
|
response->status == GIT_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED) {
|
|
258
261
|
git_error_set(GIT_ERROR_HTTP, "unexpected authentication failure");
|
|
259
|
-
return
|
|
262
|
+
return GIT_EAUTH;
|
|
260
263
|
}
|
|
261
264
|
|
|
262
265
|
if (response->status != GIT_HTTP_STATUS_OK) {
|
|
@@ -287,7 +290,6 @@ static int lookup_proxy(
|
|
|
287
290
|
{
|
|
288
291
|
const char *proxy;
|
|
289
292
|
git_remote *remote;
|
|
290
|
-
bool use_ssl;
|
|
291
293
|
char *config = NULL;
|
|
292
294
|
int error = 0;
|
|
293
295
|
|
|
@@ -301,9 +303,8 @@ static int lookup_proxy(
|
|
|
301
303
|
|
|
302
304
|
case GIT_PROXY_AUTO:
|
|
303
305
|
remote = transport->owner->owner;
|
|
304
|
-
use_ssl = !strcmp(transport->server.url.scheme, "https");
|
|
305
306
|
|
|
306
|
-
error =
|
|
307
|
+
error = git_remote__http_proxy(&config, remote, &transport->server.url);
|
|
307
308
|
|
|
308
309
|
if (error || !config)
|
|
309
310
|
goto done;
|
|
@@ -413,11 +414,11 @@ static int http_stream_read(
|
|
|
413
414
|
|
|
414
415
|
if (stream->state == HTTP_STATE_SENDING_REQUEST) {
|
|
415
416
|
git_error_set(GIT_ERROR_HTTP, "too many redirects or authentication replays");
|
|
416
|
-
error =
|
|
417
|
+
error = GIT_ERROR; /* not GIT_EAUTH, because the exact cause is unclear */
|
|
417
418
|
goto done;
|
|
418
419
|
}
|
|
419
420
|
|
|
420
|
-
|
|
421
|
+
GIT_ASSERT(stream->state == HTTP_STATE_RECEIVING_RESPONSE);
|
|
421
422
|
|
|
422
423
|
error = git_http_client_read_body(transport->http_client, buffer, buffer_size);
|
|
423
424
|
|
|
@@ -551,11 +552,11 @@ static int http_stream_write(
|
|
|
551
552
|
if (stream->state == HTTP_STATE_NONE) {
|
|
552
553
|
git_error_set(GIT_ERROR_HTTP,
|
|
553
554
|
"too many redirects or authentication replays");
|
|
554
|
-
error =
|
|
555
|
+
error = GIT_ERROR; /* not GIT_EAUTH because the exact cause is unclear */
|
|
555
556
|
goto done;
|
|
556
557
|
}
|
|
557
558
|
|
|
558
|
-
|
|
559
|
+
GIT_ASSERT(stream->state == HTTP_STATE_SENDING_REQUEST);
|
|
559
560
|
|
|
560
561
|
error = git_http_client_send_body(transport->http_client, buffer, len);
|
|
561
562
|
|
|
@@ -589,7 +590,7 @@ static int http_stream_read_response(
|
|
|
589
590
|
(error = handle_response(&complete, stream, &response, false)) < 0)
|
|
590
591
|
goto done;
|
|
591
592
|
|
|
592
|
-
|
|
593
|
+
GIT_ASSERT(complete);
|
|
593
594
|
stream->state = HTTP_STATE_RECEIVING_RESPONSE;
|
|
594
595
|
}
|
|
595
596
|
|
|
@@ -638,7 +639,8 @@ static int http_action(
|
|
|
638
639
|
const http_service *service;
|
|
639
640
|
int error;
|
|
640
641
|
|
|
641
|
-
|
|
642
|
+
GIT_ASSERT_ARG(out);
|
|
643
|
+
GIT_ASSERT_ARG(t);
|
|
642
644
|
|
|
643
645
|
*out = NULL;
|
|
644
646
|
|
|
@@ -721,7 +723,7 @@ int git_smart_subtransport_http(git_smart_subtransport **out, git_transport *own
|
|
|
721
723
|
|
|
722
724
|
GIT_UNUSED(param);
|
|
723
725
|
|
|
724
|
-
|
|
726
|
+
GIT_ASSERT_ARG(out);
|
|
725
727
|
|
|
726
728
|
transport = git__calloc(sizeof(http_subtransport), 1);
|
|
727
729
|
GIT_ERROR_CHECK_ALLOC(transport);
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
#include "http_parser.h"
|
|
11
11
|
#include "vector.h"
|
|
12
12
|
#include "trace.h"
|
|
13
|
-
#include "global.h"
|
|
14
13
|
#include "httpclient.h"
|
|
15
14
|
#include "http.h"
|
|
16
15
|
#include "auth.h"
|
|
@@ -146,7 +145,8 @@ bool git_http_response_is_redirect(git_http_response *response)
|
|
|
146
145
|
|
|
147
146
|
void git_http_response_dispose(git_http_response *response)
|
|
148
147
|
{
|
|
149
|
-
|
|
148
|
+
if (!response)
|
|
149
|
+
return;
|
|
150
150
|
|
|
151
151
|
git__free(response->content_type);
|
|
152
152
|
git__free(response->location);
|
|
@@ -400,7 +400,7 @@ static int on_body(http_parser *parser, const char *buf, size_t len)
|
|
|
400
400
|
return 0;
|
|
401
401
|
}
|
|
402
402
|
|
|
403
|
-
|
|
403
|
+
GIT_ASSERT(ctx->output_size >= ctx->output_written);
|
|
404
404
|
|
|
405
405
|
max_len = min(ctx->output_size - ctx->output_written, len);
|
|
406
406
|
max_len = min(max_len, INT_MAX);
|
|
@@ -445,7 +445,7 @@ GIT_INLINE(int) client_write_request(git_http_client *client)
|
|
|
445
445
|
0);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
const char *name_for_method(git_http_method method)
|
|
448
|
+
static const char *name_for_method(git_http_method method)
|
|
449
449
|
{
|
|
450
450
|
switch (method) {
|
|
451
451
|
case GIT_HTTP_METHOD_GET:
|
|
@@ -597,7 +597,7 @@ static int apply_credentials(
|
|
|
597
597
|
free_auth_context(server);
|
|
598
598
|
} else if (!token.size) {
|
|
599
599
|
git_error_set(GIT_ERROR_HTTP, "failed to respond to authentication challenge");
|
|
600
|
-
error =
|
|
600
|
+
error = GIT_EAUTH;
|
|
601
601
|
goto done;
|
|
602
602
|
}
|
|
603
603
|
|
|
@@ -631,6 +631,26 @@ GIT_INLINE(int) apply_proxy_credentials(
|
|
|
631
631
|
request->proxy_credentials);
|
|
632
632
|
}
|
|
633
633
|
|
|
634
|
+
static int puts_host_and_port(git_buf *buf, git_net_url *url, bool force_port)
|
|
635
|
+
{
|
|
636
|
+
bool ipv6 = git_net_url_is_ipv6(url);
|
|
637
|
+
|
|
638
|
+
if (ipv6)
|
|
639
|
+
git_buf_putc(buf, '[');
|
|
640
|
+
|
|
641
|
+
git_buf_puts(buf, url->host);
|
|
642
|
+
|
|
643
|
+
if (ipv6)
|
|
644
|
+
git_buf_putc(buf, ']');
|
|
645
|
+
|
|
646
|
+
if (force_port || !git_net_url_is_default_port(url)) {
|
|
647
|
+
git_buf_putc(buf, ':');
|
|
648
|
+
git_buf_puts(buf, url->port);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return git_buf_oom(buf) ? -1 : 0;
|
|
652
|
+
}
|
|
653
|
+
|
|
634
654
|
static int generate_connect_request(
|
|
635
655
|
git_http_client *client,
|
|
636
656
|
git_http_request *request)
|
|
@@ -641,14 +661,17 @@ static int generate_connect_request(
|
|
|
641
661
|
git_buf_clear(&client->request_msg);
|
|
642
662
|
buf = &client->request_msg;
|
|
643
663
|
|
|
644
|
-
|
|
645
|
-
|
|
664
|
+
git_buf_puts(buf, "CONNECT ");
|
|
665
|
+
puts_host_and_port(buf, &client->server.url, true);
|
|
666
|
+
git_buf_puts(buf, " HTTP/1.1\r\n");
|
|
646
667
|
|
|
647
668
|
git_buf_puts(buf, "User-Agent: ");
|
|
648
669
|
git_http__user_agent(buf);
|
|
649
670
|
git_buf_puts(buf, "\r\n");
|
|
650
671
|
|
|
651
|
-
|
|
672
|
+
git_buf_puts(buf, "Host: ");
|
|
673
|
+
puts_host_and_port(buf, &client->server.url, true);
|
|
674
|
+
git_buf_puts(buf, "\r\n");
|
|
652
675
|
|
|
653
676
|
if ((error = apply_proxy_credentials(buf, client, request) < 0))
|
|
654
677
|
return -1;
|
|
@@ -658,6 +681,11 @@ static int generate_connect_request(
|
|
|
658
681
|
return git_buf_oom(buf) ? -1 : 0;
|
|
659
682
|
}
|
|
660
683
|
|
|
684
|
+
static bool use_connect_proxy(git_http_client *client)
|
|
685
|
+
{
|
|
686
|
+
return client->proxy.url.host && !strcmp(client->server.url.scheme, "https");
|
|
687
|
+
}
|
|
688
|
+
|
|
661
689
|
static int generate_request(
|
|
662
690
|
git_http_client *client,
|
|
663
691
|
git_http_request *request)
|
|
@@ -666,7 +694,8 @@ static int generate_request(
|
|
|
666
694
|
size_t i;
|
|
667
695
|
int error;
|
|
668
696
|
|
|
669
|
-
|
|
697
|
+
GIT_ASSERT_ARG(client);
|
|
698
|
+
GIT_ASSERT_ARG(request);
|
|
670
699
|
|
|
671
700
|
git_buf_clear(&client->request_msg);
|
|
672
701
|
buf = &client->request_msg;
|
|
@@ -686,11 +715,8 @@ static int generate_request(
|
|
|
686
715
|
git_http__user_agent(buf);
|
|
687
716
|
git_buf_puts(buf, "\r\n");
|
|
688
717
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
if (!git_net_url_is_default_port(request->url))
|
|
692
|
-
git_buf_printf(buf, ":%s", request->url->port);
|
|
693
|
-
|
|
718
|
+
git_buf_puts(buf, "Host: ");
|
|
719
|
+
puts_host_and_port(buf, request->url, false);
|
|
694
720
|
git_buf_puts(buf, "\r\n");
|
|
695
721
|
|
|
696
722
|
if (request->accept)
|
|
@@ -713,7 +739,8 @@ static int generate_request(
|
|
|
713
739
|
git_buf_printf(buf, "Expect: 100-continue\r\n");
|
|
714
740
|
|
|
715
741
|
if ((error = apply_server_credentials(buf, client, request)) < 0 ||
|
|
716
|
-
(
|
|
742
|
+
(!use_connect_proxy(client) &&
|
|
743
|
+
(error = apply_proxy_credentials(buf, client, request)) < 0))
|
|
717
744
|
return error;
|
|
718
745
|
|
|
719
746
|
if (request->custom_headers) {
|
|
@@ -843,7 +870,10 @@ static int setup_hosts(
|
|
|
843
870
|
{
|
|
844
871
|
int ret, diff = 0;
|
|
845
872
|
|
|
846
|
-
|
|
873
|
+
GIT_ASSERT_ARG(client);
|
|
874
|
+
GIT_ASSERT_ARG(request);
|
|
875
|
+
|
|
876
|
+
GIT_ASSERT(request->url);
|
|
847
877
|
|
|
848
878
|
if ((ret = server_setup_from_url(&client->server, request->url)) < 0)
|
|
849
879
|
return ret;
|
|
@@ -898,7 +928,7 @@ static int proxy_connect(
|
|
|
898
928
|
int error;
|
|
899
929
|
|
|
900
930
|
if (!client->proxy_connected || !client->keepalive) {
|
|
901
|
-
git_trace(GIT_TRACE_DEBUG, "Connecting to proxy %s
|
|
931
|
+
git_trace(GIT_TRACE_DEBUG, "Connecting to proxy %s port %s",
|
|
902
932
|
client->proxy.url.host, client->proxy.url.port);
|
|
903
933
|
|
|
904
934
|
if ((error = server_create_stream(&client->proxy)) < 0 ||
|
|
@@ -923,7 +953,7 @@ static int proxy_connect(
|
|
|
923
953
|
(error = git_http_client_skip_body(client)) < 0)
|
|
924
954
|
goto done;
|
|
925
955
|
|
|
926
|
-
|
|
956
|
+
GIT_ASSERT(client->state == DONE);
|
|
927
957
|
|
|
928
958
|
if (response.status == GIT_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED) {
|
|
929
959
|
save_early_response(client, &response);
|
|
@@ -1003,8 +1033,7 @@ static int http_client_connect(
|
|
|
1003
1033
|
reset_parser(client);
|
|
1004
1034
|
|
|
1005
1035
|
/* Reconnect to the proxy if necessary. */
|
|
1006
|
-
use_proxy = client
|
|
1007
|
-
!strcmp(client->server.url.scheme, "https");
|
|
1036
|
+
use_proxy = use_connect_proxy(client);
|
|
1008
1037
|
|
|
1009
1038
|
if (use_proxy) {
|
|
1010
1039
|
if (!client->proxy_connected || !client->keepalive ||
|
|
@@ -1019,7 +1048,7 @@ static int http_client_connect(
|
|
|
1019
1048
|
goto on_error;
|
|
1020
1049
|
}
|
|
1021
1050
|
|
|
1022
|
-
git_trace(GIT_TRACE_DEBUG, "Connecting to remote %s
|
|
1051
|
+
git_trace(GIT_TRACE_DEBUG, "Connecting to remote %s port %s",
|
|
1023
1052
|
client->server.url.host, client->server.url.port);
|
|
1024
1053
|
|
|
1025
1054
|
if ((error = server_connect(client)) < 0)
|
|
@@ -1038,6 +1067,7 @@ on_error:
|
|
|
1038
1067
|
|
|
1039
1068
|
GIT_INLINE(int) client_read(git_http_client *client)
|
|
1040
1069
|
{
|
|
1070
|
+
http_parser_context *parser_context = client->parser.data;
|
|
1041
1071
|
git_stream *stream;
|
|
1042
1072
|
char *buf = client->read_buf.ptr + client->read_buf.size;
|
|
1043
1073
|
size_t max_len;
|
|
@@ -1054,6 +1084,9 @@ GIT_INLINE(int) client_read(git_http_client *client)
|
|
|
1054
1084
|
max_len = client->read_buf.asize - client->read_buf.size;
|
|
1055
1085
|
max_len = min(max_len, INT_MAX);
|
|
1056
1086
|
|
|
1087
|
+
if (parser_context->output_size)
|
|
1088
|
+
max_len = min(max_len, parser_context->output_size);
|
|
1089
|
+
|
|
1057
1090
|
if (max_len == 0) {
|
|
1058
1091
|
git_error_set(GIT_ERROR_HTTP, "no room in output buffer");
|
|
1059
1092
|
return -1;
|
|
@@ -1116,11 +1149,6 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1116
1149
|
return -1;
|
|
1117
1150
|
}
|
|
1118
1151
|
|
|
1119
|
-
if (parser->upgrade) {
|
|
1120
|
-
git_error_set(GIT_ERROR_HTTP, "server requested upgrade");
|
|
1121
|
-
return -1;
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
1152
|
if (ctx->parse_status == PARSE_STATUS_ERROR) {
|
|
1125
1153
|
client->connected = 0;
|
|
1126
1154
|
return ctx->error ? ctx->error : -1;
|
|
@@ -1139,7 +1167,7 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1139
1167
|
* final byte when paused in a callback. Consume that byte.
|
|
1140
1168
|
* https://github.com/nodejs/http-parser/issues/97
|
|
1141
1169
|
*/
|
|
1142
|
-
|
|
1170
|
+
GIT_ASSERT(client->read_buf.size > parsed_len);
|
|
1143
1171
|
|
|
1144
1172
|
http_parser_pause(parser, 0);
|
|
1145
1173
|
|
|
@@ -1191,7 +1219,7 @@ static void complete_response_body(git_http_client *client)
|
|
|
1191
1219
|
/* If we're not keeping alive, don't bother. */
|
|
1192
1220
|
if (!client->keepalive) {
|
|
1193
1221
|
client->connected = 0;
|
|
1194
|
-
|
|
1222
|
+
goto done;
|
|
1195
1223
|
}
|
|
1196
1224
|
|
|
1197
1225
|
parser_context.client = client;
|
|
@@ -1205,6 +1233,9 @@ static void complete_response_body(git_http_client *client)
|
|
|
1205
1233
|
git_error_clear();
|
|
1206
1234
|
client->connected = 0;
|
|
1207
1235
|
}
|
|
1236
|
+
|
|
1237
|
+
done:
|
|
1238
|
+
git_buf_clear(&client->read_buf);
|
|
1208
1239
|
}
|
|
1209
1240
|
|
|
1210
1241
|
int git_http_client_send_request(
|
|
@@ -1214,7 +1245,8 @@ int git_http_client_send_request(
|
|
|
1214
1245
|
git_http_response response = {0};
|
|
1215
1246
|
int error = -1;
|
|
1216
1247
|
|
|
1217
|
-
|
|
1248
|
+
GIT_ASSERT_ARG(client);
|
|
1249
|
+
GIT_ASSERT_ARG(request);
|
|
1218
1250
|
|
|
1219
1251
|
/* If the client did not finish reading, clean up the stream. */
|
|
1220
1252
|
if (client->state == READING_BODY)
|
|
@@ -1285,7 +1317,7 @@ int git_http_client_send_body(
|
|
|
1285
1317
|
git_buf hdr = GIT_BUF_INIT;
|
|
1286
1318
|
int error;
|
|
1287
1319
|
|
|
1288
|
-
|
|
1320
|
+
GIT_ASSERT_ARG(client);
|
|
1289
1321
|
|
|
1290
1322
|
/* If we're waiting for proxy auth, don't sending more requests. */
|
|
1291
1323
|
if (client->state == HAS_EARLY_RESPONSE)
|
|
@@ -1302,7 +1334,7 @@ int git_http_client_send_body(
|
|
|
1302
1334
|
server = &client->server;
|
|
1303
1335
|
|
|
1304
1336
|
if (client->request_body_len) {
|
|
1305
|
-
|
|
1337
|
+
GIT_ASSERT(buffer_len <= client->request_body_remain);
|
|
1306
1338
|
|
|
1307
1339
|
if ((error = stream_write(server, buffer, buffer_len)) < 0)
|
|
1308
1340
|
goto done;
|
|
@@ -1325,7 +1357,8 @@ static int complete_request(git_http_client *client)
|
|
|
1325
1357
|
{
|
|
1326
1358
|
int error = 0;
|
|
1327
1359
|
|
|
1328
|
-
|
|
1360
|
+
GIT_ASSERT_ARG(client);
|
|
1361
|
+
GIT_ASSERT(client->state == SENDING_BODY);
|
|
1329
1362
|
|
|
1330
1363
|
if (client->request_body_len && client->request_body_remain) {
|
|
1331
1364
|
git_error_set(GIT_ERROR_HTTP, "truncated write");
|
|
@@ -1345,7 +1378,8 @@ int git_http_client_read_response(
|
|
|
1345
1378
|
http_parser_context parser_context = {0};
|
|
1346
1379
|
int error;
|
|
1347
1380
|
|
|
1348
|
-
|
|
1381
|
+
GIT_ASSERT_ARG(response);
|
|
1382
|
+
GIT_ASSERT_ARG(client);
|
|
1349
1383
|
|
|
1350
1384
|
if (client->state == SENDING_BODY) {
|
|
1351
1385
|
if ((error = complete_request(client)) < 0)
|
|
@@ -1367,8 +1401,11 @@ int git_http_client_read_response(
|
|
|
1367
1401
|
|
|
1368
1402
|
git_http_response_dispose(response);
|
|
1369
1403
|
|
|
1370
|
-
|
|
1371
|
-
|
|
1404
|
+
if (client->current_server == PROXY) {
|
|
1405
|
+
git_vector_free_deep(&client->proxy.auth_challenges);
|
|
1406
|
+
} else if(client->current_server == SERVER) {
|
|
1407
|
+
git_vector_free_deep(&client->server.auth_challenges);
|
|
1408
|
+
}
|
|
1372
1409
|
|
|
1373
1410
|
client->state = READING_RESPONSE;
|
|
1374
1411
|
client->keepalive = 0;
|
|
@@ -1382,7 +1419,7 @@ int git_http_client_read_response(
|
|
|
1382
1419
|
goto done;
|
|
1383
1420
|
}
|
|
1384
1421
|
|
|
1385
|
-
|
|
1422
|
+
GIT_ASSERT(client->state == READING_BODY || client->state == DONE);
|
|
1386
1423
|
|
|
1387
1424
|
done:
|
|
1388
1425
|
git_buf_dispose(&parser_context.parse_header_name);
|
|
@@ -1419,18 +1456,23 @@ int git_http_client_read_body(
|
|
|
1419
1456
|
client->parser.data = &parser_context;
|
|
1420
1457
|
|
|
1421
1458
|
/*
|
|
1422
|
-
* Clients expect to get a non-zero amount of data from us
|
|
1423
|
-
*
|
|
1424
|
-
*
|
|
1459
|
+
* Clients expect to get a non-zero amount of data from us,
|
|
1460
|
+
* so we either block until we have data to return, until we
|
|
1461
|
+
* hit EOF or there's an error. Do this in a loop, since we
|
|
1462
|
+
* may end up reading only some stream metadata (like chunk
|
|
1463
|
+
* information).
|
|
1425
1464
|
*/
|
|
1426
1465
|
while (!parser_context.output_written) {
|
|
1427
1466
|
error = client_read_and_parse(client);
|
|
1428
1467
|
|
|
1429
1468
|
if (error <= 0)
|
|
1430
1469
|
goto done;
|
|
1470
|
+
|
|
1471
|
+
if (client->state == DONE)
|
|
1472
|
+
break;
|
|
1431
1473
|
}
|
|
1432
1474
|
|
|
1433
|
-
|
|
1475
|
+
GIT_ASSERT(parser_context.output_written <= INT_MAX);
|
|
1434
1476
|
error = (int)parser_context.output_written;
|
|
1435
1477
|
|
|
1436
1478
|
done:
|
|
@@ -1466,7 +1508,7 @@ int git_http_client_skip_body(git_http_client *client)
|
|
|
1466
1508
|
"unexpected data handled in callback");
|
|
1467
1509
|
error = -1;
|
|
1468
1510
|
}
|
|
1469
|
-
} while (
|
|
1511
|
+
} while (error >= 0 && client->state != DONE);
|
|
1470
1512
|
|
|
1471
1513
|
if (error < 0)
|
|
1472
1514
|
client->connected = 0;
|
|
@@ -1484,7 +1526,7 @@ int git_http_client_new(
|
|
|
1484
1526
|
{
|
|
1485
1527
|
git_http_client *client;
|
|
1486
1528
|
|
|
1487
|
-
|
|
1529
|
+
GIT_ASSERT_ARG(out);
|
|
1488
1530
|
|
|
1489
1531
|
client = git__calloc(1, sizeof(git_http_client));
|
|
1490
1532
|
GIT_ERROR_CHECK_ALLOC(client);
|