Mercurial > hg > nginx
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); }