allow any status

This commit is contained in:
Igor Sysoev 2009-04-11 11:05:15 +00:00
parent ecd822809d
commit 395f895900
2 changed files with 80 additions and 36 deletions

View File

@ -61,7 +61,8 @@ static ngx_str_t ngx_http_status_lines[] = {
/* ngx_null_string, */ /* "207 Multi-Status" */ /* ngx_null_string, */ /* "207 Multi-Status" */
#define NGX_HTTP_LEVEL_200 7 #define NGX_HTTP_LAST_LEVEL_200 207
#define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 200)
/* ngx_null_string, */ /* "300 Multiple Choices" */ /* ngx_null_string, */ /* "300 Multiple Choices" */
@ -74,7 +75,8 @@ static ngx_str_t ngx_http_status_lines[] = {
/* ngx_null_string, */ /* "306 unused" */ /* ngx_null_string, */ /* "306 unused" */
/* ngx_null_string, */ /* "307 Temporary Redirect" */ /* ngx_null_string, */ /* "307 Temporary Redirect" */
#define NGX_HTTP_LEVEL_300 4 #define NGX_HTTP_LAST_LEVEL_300 305
#define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301)
ngx_string("400 Bad Request"), ngx_string("400 Bad Request"),
ngx_string("401 Unauthorized"), ngx_string("401 Unauthorized"),
@ -106,7 +108,8 @@ static ngx_str_t ngx_http_status_lines[] = {
/* ngx_null_string, */ /* "423 Locked" */ /* ngx_null_string, */ /* "423 Locked" */
/* ngx_null_string, */ /* "424 Failed Dependency" */ /* ngx_null_string, */ /* "424 Failed Dependency" */
#define NGX_HTTP_LEVEL_400 17 #define NGX_HTTP_LAST_LEVEL_400 417
#define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400)
ngx_string("500 Internal Server Error"), ngx_string("500 Internal Server Error"),
ngx_string("501 Method Not Implemented"), ngx_string("501 Method Not Implemented"),
@ -120,6 +123,9 @@ static ngx_str_t ngx_http_status_lines[] = {
/* ngx_null_string, */ /* "508 unused" */ /* ngx_null_string, */ /* "508 unused" */
/* ngx_null_string, */ /* "509 unused" */ /* ngx_null_string, */ /* "509 unused" */
/* ngx_null_string, */ /* "510 Not Extended" */ /* ngx_null_string, */ /* "510 Not Extended" */
#define NGX_HTTP_LAST_LEVEL_500 508
}; };
@ -153,7 +159,7 @@ ngx_http_header_filter(ngx_http_request_t *r)
{ {
u_char *p; u_char *p;
size_t len; size_t len;
ngx_str_t host; ngx_str_t host, *status_line;
ngx_buf_t *b; ngx_buf_t *b;
ngx_uint_t status, i, port; ngx_uint_t status, i, port;
ngx_chain_t out; ngx_chain_t out;
@ -199,17 +205,21 @@ ngx_http_header_filter(ngx_http_request_t *r)
if (r->headers_out.status_line.len) { if (r->headers_out.status_line.len) {
len += r->headers_out.status_line.len; len += r->headers_out.status_line.len;
status_line = &r->headers_out.status_line;
#if (NGX_SUPPRESS_WARN) #if (NGX_SUPPRESS_WARN)
status = NGX_INVALID_ARRAY_INDEX; status = 0;
#endif #endif
} else { } else {
if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) { status = r->headers_out.status;
/* 2XX */
status = r->headers_out.status - NGX_HTTP_OK;
if (r->headers_out.status == NGX_HTTP_NO_CONTENT) { if (status >= NGX_HTTP_OK
&& status < NGX_HTTP_LAST_LEVEL_200)
{
/* 2XX */
if (status == NGX_HTTP_NO_CONTENT) {
r->header_only = 1; r->header_only = 1;
r->headers_out.content_type.len = 0; r->headers_out.content_type.len = 0;
r->headers_out.content_type.data = NULL; r->headers_out.content_type.data = NULL;
@ -219,30 +229,50 @@ ngx_http_header_filter(ngx_http_request_t *r)
r->headers_out.content_length_n = -1; r->headers_out.content_length_n = -1;
} }
} else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST) { status -= NGX_HTTP_OK;
/* 3XX */ status_line = &ngx_http_status_lines[status];
status = r->headers_out.status - NGX_HTTP_MOVED_PERMANENTLY len += ngx_http_status_lines[status].len;
+ NGX_HTTP_LEVEL_200;
if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { } else if (status >= NGX_HTTP_MOVED_PERMANENTLY
&& status < NGX_HTTP_LAST_LEVEL_300)
{
/* 3XX */
if (status == NGX_HTTP_NOT_MODIFIED) {
r->header_only = 1; r->header_only = 1;
} }
} else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR) { status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
status_line = &ngx_http_status_lines[status];
len += ngx_http_status_lines[status].len;
} else if (status >= NGX_HTTP_BAD_REQUEST
&& status < NGX_HTTP_LAST_LEVEL_400)
{
/* 4XX */ /* 4XX */
status = r->headers_out.status - NGX_HTTP_BAD_REQUEST status = status - NGX_HTTP_BAD_REQUEST
+ NGX_HTTP_LEVEL_200 + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300; + NGX_HTTP_LEVEL_300;
} else { status_line = &ngx_http_status_lines[status];
len += ngx_http_status_lines[status].len;
} else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR
&& status < NGX_HTTP_LAST_LEVEL_500)
{
/* 5XX */ /* 5XX */
status = r->headers_out.status - NGX_HTTP_INTERNAL_SERVER_ERROR status = status - NGX_HTTP_INTERNAL_SERVER_ERROR
+ NGX_HTTP_LEVEL_200 + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300 + NGX_HTTP_LEVEL_300
+ NGX_HTTP_LEVEL_400; + NGX_HTTP_LEVEL_400;
}
status_line = &ngx_http_status_lines[status];
len += ngx_http_status_lines[status].len; len += ngx_http_status_lines[status].len;
} else {
len += NGX_INT_T_LEN;
status_line = NULL;
}
} }
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
@ -400,13 +430,11 @@ ngx_http_header_filter(ngx_http_request_t *r)
b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1); b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);
/* status line */ /* status line */
if (r->headers_out.status_line.len) { if (status_line) {
b->last = ngx_copy(b->last, r->headers_out.status_line.data, b->last = ngx_copy(b->last, status_line->data, status_line->len);
r->headers_out.status_line.len);
} else { } else {
b->last = ngx_copy(b->last, ngx_http_status_lines[status].data, b->last = ngx_sprintf(b->last, "%ui", status);
ngx_http_status_lines[status].len);
} }
*b->last++ = CR; *b->last++ = LF; *b->last++ = CR; *b->last++ = LF;

View File

@ -275,14 +275,16 @@ static ngx_str_t ngx_http_error_pages[] = {
ngx_null_string, /* 201, 204 */ ngx_null_string, /* 201, 204 */
#define NGX_HTTP_LEVEL_200 1 #define NGX_HTTP_LAST_LEVEL_200 202
#define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 201)
/* ngx_null_string, */ /* 300 */ /* ngx_null_string, */ /* 300 */
ngx_string(ngx_http_error_301_page), ngx_string(ngx_http_error_301_page),
ngx_string(ngx_http_error_302_page), ngx_string(ngx_http_error_302_page),
ngx_null_string, /* 303 */ ngx_null_string, /* 303 */
#define NGX_HTTP_LEVEL_300 3 #define NGX_HTTP_LAST_LEVEL_300 304
#define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301)
ngx_string(ngx_http_error_400_page), ngx_string(ngx_http_error_400_page),
ngx_string(ngx_http_error_401_page), ngx_string(ngx_http_error_401_page),
@ -302,7 +304,8 @@ static ngx_str_t ngx_http_error_pages[] = {
ngx_string(ngx_http_error_415_page), ngx_string(ngx_http_error_415_page),
ngx_string(ngx_http_error_416_page), ngx_string(ngx_http_error_416_page),
#define NGX_HTTP_LEVEL_400 17 #define NGX_HTTP_LAST_LEVEL_400 417
#define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400)
ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
@ -318,6 +321,9 @@ static ngx_str_t ngx_http_error_pages[] = {
ngx_null_string, /* 505 */ ngx_null_string, /* 505 */
ngx_null_string, /* 506 */ ngx_null_string, /* 506 */
ngx_string(ngx_http_error_507_page) ngx_string(ngx_http_error_507_page)
#define NGX_HTTP_LAST_LEVEL_500 508
}; };
@ -402,16 +408,22 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
/* 204 */ /* 204 */
err = 0; err = 0;
} else if (error < NGX_HTTP_BAD_REQUEST) { } else if (error >= NGX_HTTP_MOVED_PERMANENTLY
&& error < NGX_HTTP_LAST_LEVEL_300)
{
/* 3XX */ /* 3XX */
err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200; err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
} else if (error < NGX_HTTP_OWN_CODES) { } else if (error >= NGX_HTTP_BAD_REQUEST
&& error < NGX_HTTP_LAST_LEVEL_400)
{
/* 4XX */ /* 4XX */
err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200 err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300; + NGX_HTTP_LEVEL_300;
} else { } else if (error >= NGX_HTTP_OWN_CODES
&& error < NGX_HTTP_LAST_LEVEL_500)
{
/* 49X, 5XX */ /* 49X, 5XX */
err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200 err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300 + NGX_HTTP_LEVEL_300
@ -423,6 +435,10 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
r->err_status = NGX_HTTP_BAD_REQUEST; r->err_status = NGX_HTTP_BAD_REQUEST;
break; break;
} }
} else {
/* unknown code, zero body */
err = 0;
} }
return ngx_http_send_special_response(r, clcf, err); return ngx_http_send_special_response(r, clcf, err);