relayd does this evil thing of replacing the output buffer of bufferevnt
with another one. This makes it impossible to reopen connections. Instead
just write out the output buffer when connecting to the backend and move
on.

THis is needed to make HTTP keep-alive work better.
-- 
:wq Claudio

Index: relay.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.228
diff -u -p -r1.228 relay.c
--- relay.c     27 Nov 2017 03:40:04 -0000      1.228
+++ relay.c     27 Nov 2017 17:03:34 -0000
@@ -712,10 +712,11 @@ relay_connected(int fd, short sig, void 
                    "failed to allocate output buffer event", 0);
                return;
        }
-       evbuffer_free(bev->output);
-       bev->output = con->se_out.output;
-       if (bev->output == NULL)
-               fatal("%s: invalid output buffer", __func__);
+       /* write pending output buffer now */
+       if (bufferevent_write_buffer(bev, con->se_out.output)) {
+               relay_abort_http(con, 500, strerror(errno), 0);
+               return;
+       }
        con->se_out.bev = bev;
 
        /* Initialize the TLS wrapper */
@@ -1698,7 +1699,7 @@ relay_close(struct rsession *con, const 
        free(con->se_priv);
        if (con->se_in.bev != NULL)
                bufferevent_free(con->se_in.bev);
-       else if (con->se_in.output != NULL)
+       if (con->se_in.output != NULL)
                evbuffer_free(con->se_in.output);
        if (con->se_in.tls != NULL)
                tls_close(con->se_in.tls);
@@ -1720,7 +1721,7 @@ relay_close(struct rsession *con, const 
 
        if (con->se_out.bev != NULL)
                bufferevent_free(con->se_out.bev);
-       else if (con->se_out.output != NULL)
+       if (con->se_out.output != NULL)
                evbuffer_free(con->se_out.output);
        if (con->se_out.tls != NULL)
                tls_close(con->se_out.tls);

Reply via email to