[BUG] client timeout incorrectly rearmed while waiting for server
Client timeout could be refreshed in stream_sock_*, but this is
undesired when the timeout is already set to eternity. The effect
is that a session could still be aborted if client timeout was
smaller than server timeout. A second effect is that sessions
expired on the server side would expire with "cD" flags.
The fix consists in not updating it if it was not previously set.
A cleaner method might consist in updating the buffer timeout. This
is probably what will be done later when the state machines only
deal with the buffers.
diff --git a/src/proto_http.c b/src/proto_http.c
index 9ddec24..59d0479 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2695,7 +2695,7 @@
int conn_err;
DPRINTF(stderr,"process_srv: c=%s s=%s set(r,w)=%d,%d exp(r,w)=%u,%u\n",
- cli_stnames[c], srv_stnames[s],
+ cli_stnames[t->cli_state], srv_stnames[t->srv_state],
EV_FD_ISSET(t->srv_fd, DIR_RD), EV_FD_ISSET(t->srv_fd, DIR_WR),
rep->rex, req->wex);
diff --git a/src/stream_sock.c b/src/stream_sock.c
index 84bc2db..10688e9 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -217,7 +217,7 @@
* have at least read something.
*/
- if (b->flags & BF_PARTIAL_READ)
+ if (b->rex && b->flags & BF_PARTIAL_READ)
b->rex = tick_add_ifset(now_ms, b->rto);
out_wakeup:
@@ -373,14 +373,14 @@
* written something.
*/
- if (b->flags & BF_PARTIAL_WRITE) {
+ if (b->wex && b->flags & BF_PARTIAL_WRITE) {
b->wex = tick_add_ifset(now_ms, b->wto);
if (b->wex) {
/* FIXME: to prevent the client from expiring read timeouts during writes,
* we refresh it. A solution would be to merge read+write timeouts into a
* unique one, although that needs some study particularly on full-duplex
* TCP connections. */
- if (!(b->flags & BF_SHUTR_STATUS))
+ if (b->rex && !(b->flags & BF_SHUTR_STATUS))
b->rex = b->wex;
}
}