diff --git a/include/types/session.h b/include/types/session.h index 6e2344f87..64ba1866c 100644 --- a/include/types/session.h +++ b/include/types/session.h @@ -52,7 +52,7 @@ #define SN_REDISP 0x00000100 /* set if this session was redispatched from one server to another */ #define SN_CONN_TAR 0x00000200 /* set if this session is turning around before reconnecting */ #define SN_REDIRECTABLE 0x00000400 /* set if this session is redirectable (GET or HEAD) */ -/* unused: 0x00000800 */ +#define SN_TUNNEL 0x00000800 /* tunnel-mode session, nothing to catch after data */ /* session termination conditions, bits values 0x1000 to 0x7000 (0-7 shift 12) */ #define SN_ERR_NONE 0x00000000 diff --git a/src/proto_http.c b/src/proto_http.c index 10874c5fc..e4662a3f3 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2611,6 +2611,15 @@ int http_process_request(struct session *s, struct buffer *req, int an_bit) } } + + /* indicate in the session if it will be a tunnel-mode one or not. If + * we don't intend to analyse contents after the first request, it's a + * tunnel. + */ + if (s->txn.meth == HTTP_METH_CONNECT || + !((s->fe->options|s->be->options) & (PR_O_KEEPALIVE|PR_O_HTTP_CLOSE|PR_O_FORCE_CLO))) + s->flags |= SN_TUNNEL; + /* 11: add "Connection: close" if needed and not yet set. */ if (!(s->flags & SN_CONN_CLOSED) && ((s->fe->options | s->be->options) & (PR_O_HTTP_CLOSE|PR_O_FORCE_CLO))) {