about summary refs log tree commit homepage
path: root/mwrap_httpd.h
diff options
context:
space:
mode:
Diffstat (limited to 'mwrap_httpd.h')
-rw-r--r--mwrap_httpd.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/mwrap_httpd.h b/mwrap_httpd.h
index 1ef21e0..f5c3e1b 100644
--- a/mwrap_httpd.h
+++ b/mwrap_httpd.h
@@ -29,6 +29,7 @@
 #include "picohttpparser_c.h"
 #include <pthread.h>
 #include <stdbool.h>
+#define URL "https://80x24.org/mwrap-perl.git/about"
 
 enum mw_qev {
         MW_QEV_IGNORE = 0,
@@ -321,6 +322,15 @@ static enum mw_qev h1_do_reset(struct mw_h1 *h1)
         return h1_res_oneshot(h1, r200, sizeof(r200) - 1);
 }
 
+static enum mw_qev h1_do_trim(struct mw_h1 *h1)
+{
+        static const char r200[] = "HTTP/1.1 200 OK\r\n"
+                "Content-Type: text/plain\r\n"
+                "Content-Length: 9\r\n\r\n" "trimming\n";
+        malloc_trim(0);
+        return h1_res_oneshot(h1, r200, sizeof(r200) - 1);
+}
+
 #define PATH_SKIP(h1r, pfx) path_skip(h1r, pfx, sizeof(pfx) - 1)
 static const char *path_skip(struct mw_h1req *h1r, const char *pfx, size_t len)
 {
@@ -633,6 +643,23 @@ static enum mw_qev each_gt(struct mw_h1 *h1, struct mw_h1req *h1r,
         return h1_200(h1, &html);
 }
 
+/* /$PID/ root endpoint */
+static enum mw_qev pid_root(struct mw_h1 *h1, struct mw_h1req *h1r)
+{
+        struct mw_fbuf html;
+        FILE *fp = wbuf_init(&html);
+        if (!fp) return h1_close(h1);
+#define default_min "2000"
+
+        FPUTS("<html><head><title>mwrap demo"
+                "</title></head><body><p><a\n"
+                "href=\"each/" default_min "\">allocations &gt;"
+                default_min " bytes</a><p><a\nhref=\""
+                URL "\">" URL "</a></body></html>", fp);
+        return h1_200(h1, &html);
+#undef default_min
+}
+
 static enum mw_qev h1_dispatch(struct mw_h1 *h1, struct mw_h1req *h1r)
 {
         if (h1r->method_len == 3 && !memcmp(h1r->method, "GET", 3)) {
@@ -646,10 +673,14 @@ static enum mw_qev h1_dispatch(struct mw_h1 *h1, struct mw_h1req *h1r)
                                 return each_gt(h1, h1r, min);
                 } else if ((PATH_SKIP(h1r, "/at/"))) {
                         return each_at(h1, h1r);
+                } else if (h1r->path_len == 1 && h1r->path[0] == '/') {
+                        return pid_root(h1, h1r);
                 }
         } else if (h1r->method_len == 4 && !memcmp(h1r->method, "POST", 4)) {
                 if (h1r->path_len == 6 && !memcmp(h1r->path, "/reset", 6))
                         return h1_do_reset(h1);
+                if (h1r->path_len == 5 && !memcmp(h1r->path, "/trim", 5))
+                        return h1_do_trim(h1);
         }
         return h1_404(h1);
 }