diff --git a/src/local.c b/src/local.c index a81880ab..60345513 100644 --- a/src/local.c +++ b/src/local.c @@ -692,20 +692,22 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) server->buf->idx = 0; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } else { ERROR("remote_recv_cb_send"); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); - return; } } else if (s < (int)(server->buf->len)) { server->buf->len -= s; server->buf->idx = s; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } + + // Disable TCP_NODELAY after the first response are sent + int opt = 0; + setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); + setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); } static void remote_send_cb(EV_P_ ev_io *w, int revents) diff --git a/src/redir.c b/src/redir.c index f174b54b..2b106c60 100644 --- a/src/redir.c +++ b/src/redir.c @@ -351,20 +351,22 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) server->buf->idx = 0; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } else { ERROR("send"); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); - return; } } else if (s < server->buf->len) { server->buf->len -= s; server->buf->idx = s; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } + + // Disable TCP_NODELAY after the first response are sent + int opt = 0; + setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); + setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); } static void remote_send_cb(EV_P_ ev_io *w, int revents) diff --git a/src/server.c b/src/server.c index 5427b1ea..c0c066e2 100644 --- a/src/server.c +++ b/src/server.c @@ -1033,14 +1033,17 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); } - return; } else if (s < server->buf->len) { server->buf->len -= s; server->buf->idx = s; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } + + // Disable TCP_NODELAY after the first response are sent + int opt = 0; + setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); + setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); } static void remote_send_cb(EV_P_ ev_io *w, int revents) diff --git a/src/tunnel.c b/src/tunnel.c index 4a613d94..6e9107d2 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -339,20 +339,22 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents) server->buf->idx = 0; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } else { ERROR("send"); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); - return; } } else if (s < server->buf->len) { server->buf->len -= s; server->buf->idx = s; ev_io_stop(EV_A_ & remote_recv_ctx->io); ev_io_start(EV_A_ & server->send_ctx->io); - return; } + + // Disable TCP_NODELAY after the first response are sent + int opt = 0; + setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); + setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt)); } static void remote_send_cb(EV_P_ ev_io *w, int revents)