about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-12-21 11:34:03 +0000
committerEric Wong <mwrap-perl@80x24.org>2022-12-21 23:23:54 +0000
commita1dfdd2d858c08745e8457d18a76789a147e34a8 (patch)
treedb1d12fdc74e0bc37df71eda5863f11342413f8e
parented87db7b7529e607ca5fed6530143a6f38579515 (diff)
downloadmwrap-a1dfdd2d858c08745e8457d18a76789a147e34a8.tar.gz
Persistent connections and undrained input don't mix; so the
simplest thing is to drop the persistent connection when we
short-circuit out on /$PID/ prefix mismatches.

In retrospect, it's probably not worth supporting persistent
connections at all for a AF_UNIX-only server...
-rw-r--r--httpd.h1
-rw-r--r--t/httpd.t4
2 files changed, 5 insertions, 0 deletions
diff --git a/httpd.h b/httpd.h
index eddea97..a59c9dd 100644
--- a/httpd.h
+++ b/httpd.h
@@ -310,6 +310,7 @@ static enum mw_qev h1_404(struct mw_h1 *h1)
         static const char r404[] = "HTTP/1.1 404 Not Found\r\n"
                 "Content-Type: text/html\r\n"
                 "Content-Length: 10\r\n\r\n" "Not Found\n";
+        if (h1->has_input) h1->persist = 0;
         return h1_res_oneshot(h1, r404, sizeof(r404) - 1);
 }
 
diff --git a/t/httpd.t b/t/httpd.t
index 3fe9c1f..53cf420 100644
--- a/t/httpd.t
+++ b/t/httpd.t
@@ -161,6 +161,10 @@ SKIP: {
                 '-HX-Mwrap-BT-Depth:10', '-XPOST', "http://0/$pid/ctl");
         is($rc, 0, 'curl /ctl (X-Mwrap-BT-Depth)');
         like(slurp($cout), qr/\bMWRAP=bt:10\b/, 'changed bt depth');
+
+        $rc = system(qw(curl -vsSf --unix-socket), $sock, '-o', $cout,
+                '-HX-Mwrap-BT-Depth:10', '-d', 'blah', "http://0/ctl");
+        is($rc >> 8, 22, '404 w/o PID prefix');
 };