diff src/http/ngx_http_special_response.c @ 26:53cb81681040

nginx-0.0.1-2002-12-15-09:25:09 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Dec 2002 06:25:09 +0000
parents 77c7629a2627
children f1ee46c036a4
line wrap: on
line diff
--- a/src/http/ngx_http_special_response.c
+++ b/src/http/ngx_http_special_response.c
@@ -1,21 +1,91 @@
 
+#include <nginx.h>
 
 #include <ngx_config.h>
-#if 0
 #include <ngx_core.h>
-#endif
+#include <ngx_string.h>
 #include <ngx_http.h>
 
+static char error_tail[] =
+"<hr><center>" NGINX_VER "</center>" CRLF
+"</body>" CRLF
+"</html>" CRLF
+;
+
+static char error_400_page[] =
+"<html>" CRLF
+"<head><title>400 Bad Request</title></head>" CRLF
+"<body bgcolor=\"white\">" CRLF
+"<center><h1>400 Bad Request</h1></center>" CRLF
+;
+
+static char error_404_page[] =
+"<html>" CRLF
+"<head><title>404 Not Found</title></head>" CRLF
+"<body bgcolor=\"white\">" CRLF
+"<center><h1>404 Not Found</h1></center>" CRLF
+;
+
+
+static ngx_str_t error_pages[] = {
+    { 0, NULL},  /* 301 */
+    { 0, NULL},  /* 302 */
+    { 0, NULL},  /* 303 */
+    { 0, NULL},  /* 304 */
+
+    { sizeof(error_400_page) - 1, error_400_page },
+    { 0, NULL},  /* 401 */
+    { 0, NULL},  /* 402 */
+    { 0, NULL},  /* 403 */
+    { sizeof(error_404_page) - 1, error_404_page },
+
+    { 0, NULL}   /* 500 */
+};
 
 int ngx_http_special_response(ngx_http_request_t *r, int error)
 {
-    switch (error) {
+    int  rc, err, len;
+    ngx_hunk_t  *message, *tail;
+
+    len = 0;
+
+    r->headers_out.status = error;
+
+    if (error < NGX_HTTP_BAD_REQUEST)
+        err = error - NGX_HTTP_MOVED_PERMANENTLY;
+
+    else if (error < NGX_HTTP_INTERNAL_SERVER_ERROR)
+        err = error - NGX_HTTP_BAD_REQUEST + 4;
+
+    else
+        err = NGX_HTTP_INTERNAL_SERVER_ERROR + 4 + 5;
+
+    if (error_pages[err].len == 0)
+        r->headers_out.content_length = -1;
+    else
+        r->headers_out.content_length = error_pages[err].len
+                                        + len + sizeof(error_tail);
 
-    default:
-        r->headers_out.status = error;
-        return ngx_http_header_filter(r);
+    ngx_http_send_header(r);
+
+    if (error_pages[err].len == 0)
+        return NGX_OK;
+
+    ngx_test_null(message, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
+                  NGX_HTTP_INTERNAL_SERVER_ERROR);
+
+    message->type = NGX_HUNK_MEMORY;
+    message->pos.mem = error_pages[err].data;
+    message->last.mem = error_pages[err].data + error_pages[err].len;
 
-    }
+    rc = ngx_http_output_filter(r, message);
+
+    ngx_test_null(tail, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
+                  NGX_HTTP_INTERNAL_SERVER_ERROR);
 
-    return ngx_http_error(r, error);
+    tail->type = NGX_HUNK_MEMORY|NGX_HUNK_LAST;
+    tail->pos.mem = error_tail;
+    tail->last.mem = error_tail + sizeof(error_tail);
+
+    rc = ngx_http_output_filter(r, tail);
 }