mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 15:52:02 +00:00
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>
This commit is contained in:
parent
427ca3d3c5
commit
7adba5f49c
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user