This patch should get rid of 5XX server errors when receiving an incomplete
client request:
diff -rupNwBb /Users/rachel/Downloads/haproxy-408_spec/src/proto_http.c
src/proto_http.c
--- /Users/rachel/Downloads/haproxy-408_spec/src/proto_http.c 2014-03-07
14:07:04.000000000 -0500
+++ src/proto_http.c 2014-03-07 17:22:46.000000000 -0500
@@ -5316,6 +5316,11 @@ int http_wait_for_response(struct sessio
/* client abort with an abortonclose */
else if ((rep->flags & CF_SHUTR) && ((s->req->flags &
(CF_SHUTR|CF_SHUTW)) == (CF_SHUTR|CF_SHUTW))) {
+ if(s->req->flags & CF_READ_TIMEOUT)
+ {
+ rep->analysers = 0;
+ return 0;
+ }
s->fe->fe_counters.cli_aborts++;
s->be->be_counters.cli_aborts++;
if (objt_server(s->target))
diff -rupNwBb /Users/rachel/Downloads/haproxy-408_spec/src/session.c
src/session.c
--- /Users/rachel/Downloads/haproxy-408_spec/src/session.c 2014-03-07
14:07:04.000000000 -0500
+++ src/session.c 2014-03-10 11:13:18.000000000 -0400
@@ -2401,9 +2401,21 @@ struct task *process_session(struct task
if ((s->rep->flags & (CF_AUTO_CLOSE|CF_SHUTR)) == 0 &&
(tick_isset(s->req->wex) || tick_isset(s->rep->rex))) {
+ if((s->txn.req.body_len + s->txn.req.eoh) < s->req->total) {
s->req->flags |= CF_READ_NOEXP;
s->req->rex = TICK_ETERNITY;
}
+ else
+ {
+ if(!(s->req->flags & CF_READ_TIMEOUT))
+ {
+ s->req->analysers |= AN_REQ_WAIT_HTTP;
+ if(s->txn.req.msg_state >= HTTP_MSG_BODY) {
+ s->txn.req.msg_state = HTTP_MSG_LAST_LF;
+ }
+ }
+ }
+ }
/* When any of the stream interfaces is attached to an applet,
* we have to call it here. Note that this one may wake the
--
Rachel Chavez
diff -rupNwBb /Users/rachel/Downloads/haproxy-408_spec/src/proto_http.c
src/proto_http.c
--- /Users/rachel/Downloads/haproxy-408_spec/src/proto_http.c 2014-03-07
14:07:04.000000000 -0500
+++ src/proto_http.c 2014-03-07 17:22:46.000000000 -0500
@@ -5316,6 +5316,11 @@ int http_wait_for_response(struct sessio
/* client abort with an abortonclose */
else if ((rep->flags & CF_SHUTR) && ((s->req->flags &
(CF_SHUTR|CF_SHUTW)) == (CF_SHUTR|CF_SHUTW))) {
+ if(s->req->flags & CF_READ_TIMEOUT)
+ {
+ rep->analysers = 0;
+ return 0;
+ }
s->fe->fe_counters.cli_aborts++;
s->be->be_counters.cli_aborts++;
if (objt_server(s->target))
diff -rupNwBb /Users/rachel/Downloads/haproxy-408_spec/src/session.c
src/session.c
--- /Users/rachel/Downloads/haproxy-408_spec/src/session.c 2014-03-07
14:07:04.000000000 -0500
+++ src/session.c 2014-03-10 11:13:18.000000000 -0400
@@ -2401,9 +2401,21 @@ struct task *process_session(struct task
if ((s->rep->flags & (CF_AUTO_CLOSE|CF_SHUTR)) == 0 &&
(tick_isset(s->req->wex) || tick_isset(s->rep->rex))) {
+ if((s->txn.req.body_len + s->txn.req.eoh) <
s->req->total) {
s->req->flags |= CF_READ_NOEXP;
s->req->rex = TICK_ETERNITY;
}
+ else
+ {
+ if(!(s->req->flags & CF_READ_TIMEOUT))
+ {
+ s->req->analysers |= AN_REQ_WAIT_HTTP;
+ if(s->txn.req.msg_state >=
HTTP_MSG_BODY) {
+ s->txn.req.msg_state =
HTTP_MSG_LAST_LF;
+ }
+ }
+ }
+ }
/* When any of the stream interfaces is attached to an applet,
* we have to call it here. Note that this one may wake the