comparison 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
comparison
equal deleted inserted replaced
25:a8b156554dfe 26:53cb81681040
1
2 #include <nginx.h>
3
4 #include <ngx_config.h>
5 #include <ngx_core.h>
6 #include <ngx_string.h>
7 #include <ngx_http.h>
8
9 static char error_tail[] =
10 "<hr><center>" NGINX_VER "</center>" CRLF
11 "</body>" CRLF
12 "</html>" CRLF
13 ;
14
15 static char error_400_page[] =
16 "<html>" CRLF
17 "<head><title>400 Bad Request</title></head>" CRLF
18 "<body bgcolor=\"white\">" CRLF
19 "<center><h1>400 Bad Request</h1></center>" CRLF
20 ;
21
22 static char error_404_page[] =
23 "<html>" CRLF
24 "<head><title>404 Not Found</title></head>" CRLF
25 "<body bgcolor=\"white\">" CRLF
26 "<center><h1>404 Not Found</h1></center>" CRLF
27 ;
1 28
2 29
3 #include <ngx_config.h> 30 static ngx_str_t error_pages[] = {
4 #if 0 31 { 0, NULL}, /* 301 */
5 #include <ngx_core.h> 32 { 0, NULL}, /* 302 */
6 #endif 33 { 0, NULL}, /* 303 */
7 #include <ngx_http.h> 34 { 0, NULL}, /* 304 */
8 35
36 { sizeof(error_400_page) - 1, error_400_page },
37 { 0, NULL}, /* 401 */
38 { 0, NULL}, /* 402 */
39 { 0, NULL}, /* 403 */
40 { sizeof(error_404_page) - 1, error_404_page },
41
42 { 0, NULL} /* 500 */
43 };
9 44
10 int ngx_http_special_response(ngx_http_request_t *r, int error) 45 int ngx_http_special_response(ngx_http_request_t *r, int error)
11 { 46 {
12 switch (error) { 47 int rc, err, len;
48 ngx_hunk_t *message, *tail;
13 49
14 default: 50 len = 0;
15 r->headers_out.status = error;
16 return ngx_http_header_filter(r);
17 51
18 } 52 r->headers_out.status = error;
19 53
20 return ngx_http_error(r, error); 54 if (error < NGX_HTTP_BAD_REQUEST)
55 err = error - NGX_HTTP_MOVED_PERMANENTLY;
56
57 else if (error < NGX_HTTP_INTERNAL_SERVER_ERROR)
58 err = error - NGX_HTTP_BAD_REQUEST + 4;
59
60 else
61 err = NGX_HTTP_INTERNAL_SERVER_ERROR + 4 + 5;
62
63 if (error_pages[err].len == 0)
64 r->headers_out.content_length = -1;
65 else
66 r->headers_out.content_length = error_pages[err].len
67 + len + sizeof(error_tail);
68
69 ngx_http_send_header(r);
70
71 if (error_pages[err].len == 0)
72 return NGX_OK;
73
74 ngx_test_null(message, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
75 NGX_HTTP_INTERNAL_SERVER_ERROR);
76
77 message->type = NGX_HUNK_MEMORY;
78 message->pos.mem = error_pages[err].data;
79 message->last.mem = error_pages[err].data + error_pages[err].len;
80
81 rc = ngx_http_output_filter(r, message);
82
83 ngx_test_null(tail, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
84 NGX_HTTP_INTERNAL_SERVER_ERROR);
85
86 tail->type = NGX_HUNK_MEMORY|NGX_HUNK_LAST;
87 tail->pos.mem = error_tail;
88 tail->last.mem = error_tail + sizeof(error_tail);
89
90 rc = ngx_http_output_filter(r, tail);
21 } 91 }