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

Reply via email to