From 7adba5f49c5520f591c4e6519c5bea770a3e4b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 13 Aug 2011 20:18:29 +0200 Subject: [PATCH] Keep sending want lines if the server doesn't anwer a flush MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/transport_git.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/transport_git.c b/src/transport_git.c index 0e50a087a..88ad7a901 100644 --- a/src/transport_git.c +++ b/src/transport_git.c @@ -23,6 +23,8 @@ * Boston, MA 02110-1301, USA. */ +#include + #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");