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;
}