Commit 7adba5f4 by Carlos Martín Nieto Committed by Vicent Marti

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>
parent 427ca3d3
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
#include <sys/select.h>
#include "git2/net.h" #include "git2/net.h"
#include "git2/common.h" #include "git2/common.h"
#include "git2/types.h" #include "git2/types.h"
...@@ -388,6 +390,27 @@ static int git_negotiate_fetch(git_transport *transport, git_repository *repo, g ...@@ -388,6 +390,27 @@ static int git_negotiate_fetch(git_transport *transport, git_repository *repo, g
git_pkt *pkt; git_pkt *pkt;
git_pkt_send_flush(t->socket); git_pkt_send_flush(t->socket);
while (1) { 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); error = gitno_recv(&buf);
if (error < GIT_SUCCESS) { if (error < GIT_SUCCESS) {
error = git__rethrow(error, "Error receiving data"); error = git__rethrow(error, "Error receiving data");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment