Keep sending want lines if the server doesn't anwer a flush Some servers take a long time to answer and expect us to keep sending want lines; otherwise they close the connection. Avoid this by waiting for one second for the server to answer. If the timeout runs out, treat is as a NAK and keep sending want lines. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
diff --git a/src/transport_git.c b/src/transport_git.c
index 0e50a08..88ad7a9 100644
--- a/src/transport_git.c
+++ b/src/transport_git.c
@@ -23,6 +23,8 @@
* Boston, MA 02110-1301, USA.
*/
+#include <sys/select.h>
+
#include "git2/net.h"
#include "git2/common.h"
#include "git2/types.h"
@@ -388,6 +390,27 @@ static int git_negotiate_fetch(git_transport *transport, git_repository *repo, g
git_pkt *pkt;
git_pkt_send_flush(t->socket);
while (1) {
+ fd_set fds;
+ struct timeval tv;
+
+ FD_ZERO(&fds);
+ FD_SET(t->socket, &fds);
+ tv.tv_sec = 1; /* Wait for max. 1 second */
+ tv.tv_usec = 0;
+
+ /* The select(2) interface is silly */
+ error = select(t->socket + 1, &fds, NULL, NULL, &tv);
+ if (error < GIT_SUCCESS) {
+ error = git__throw(GIT_EOSERR, "Error in select");
+ } else if (error == 0) {
+ /*
+ * Some servers don't respond immediately, so if this
+ * happens, we keep sending information until it
+ * answers.
+ */
+ break;
+ }
+
error = gitno_recv(&buf);
if (error < GIT_SUCCESS) {
error = git__rethrow(error, "Error receiving data");