Hi,

I think handling of HTTP requests with bodys in relayd is currently
broken.  cd /usr/src/regress/usr.sbin/relayd && make
run-regress-args-http-filter-put.pl shows this.

Instead of checking for RELAY_DIR_RESPONSE, set toread = 0 if we
don't expect a body.

ok?

bluhm

Index: usr.sbin/relayd/relay_http.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relay_http.c,v
retrieving revision 1.15
diff -u -p -u -p -r1.15 relay_http.c
--- usr.sbin/relayd/relay_http.c        2 Jun 2013 18:02:45 -0000       1.15
+++ usr.sbin/relayd/relay_http.c        21 Jul 2013 08:42:55 -0000
@@ -324,6 +324,8 @@ relay_read_http(struct bufferevent *bev,
                case HTTP_METHOD_GET:
                case HTTP_METHOD_HEAD:
                case HTTP_METHOD_OPTIONS:
+                       cre->toread = 0;
+                       /* FALLTHROUGH */
                case HTTP_METHOD_POST:
                case HTTP_METHOD_PUT:
                case HTTP_METHOD_RESPONSE:
@@ -331,9 +333,8 @@ relay_read_http(struct bufferevent *bev,
                        if (cre->toread > 0)
                                bev->readcb = relay_read_httpcontent;
 
-                       /* Single-pass HTTP response */
-                       if (cre->dir == RELAY_DIR_RESPONSE &&
-                           cre->toread < 0) {
+                       /* Single-pass HTTP body */
+                       if (cre->toread < 0) {
                                cre->toread = TOREAD_UNLIMITED;
                                bev->readcb = relay_read;
                        }

Reply via email to