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