From 5fb275e14651c819b4b2805e4d68680e23114a20 Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Thu, 9 Jan 2014 12:36:25 +0000
Subject: [PATCH] Added URL rewrites for HTTP errors, to allow for error pages.

---
 mongoose.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/mongoose.c b/mongoose.c
index f44e6da7b..bdafef3b4 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -540,9 +540,24 @@ static const char *status_code_to_str(int status_code) {
 static void send_http_error(struct connection *conn, int code,
                             const char *fmt, ...) {
   const char *message = status_code_to_str(code);
+  const char *rewrites = conn->server->config_options[URL_REWRITES];
   char headers[200], body[200];
+  struct vec a, b;
   va_list ap;
-  int body_len, headers_len;
+  int body_len, headers_len, match_code;
+
+  // Handle error code rewrites
+  while ((rewrites = next_option(rewrites, &a, &b)) != NULL) {
+    if ((match_code = atoi(a.ptr)) > 0 && match_code == code) {
+      conn->mg_conn.status_code = 302;
+      mg_printf(&conn->mg_conn, "HTTP/1.1 %d Moved\r\n"
+                "Location: %.*s?code=%d&orig_uri=%s\r\n\r\n",
+                conn->mg_conn.status_code, b.len, b.ptr, code,
+                conn->mg_conn.uri);
+      close_local_endpoint(conn);
+      return;
+    }
+  }
 
   conn->mg_conn.status_code = code;
   body_len = mg_snprintf(body, sizeof(body), "%d %s\n", code, message);
-- 
GitLab