Logging embedded Perl return value
Igor Sysoev
is at rambler-co.ru
Fri Apr 10 14:33:40 MSD 2009
On Thu, Apr 09, 2009 at 04:54:27AM -0400, davidc wrote:
> Thanks for the speedy nginx and speedy reply Igor.
>
> The $status value does indeed log the 200 response.
>
> Is it possible to configure nginx to return custom http status codes?
>
> e.g. use a 299 and 298 code that are interpreted as a 200 OK by a custom
> http client. The last two digits would signal information that would otherwise
> have to be contained in a new header or body.
The attached patch allows to use any status code in the "return" directive
and the perl module.
--
Igor Sysoev
http://sysoev.ru/en/
-------------- next part --------------
Index: src/http/ngx_http_special_response.c
===================================================================
--- src/http/ngx_http_special_response.c (revision 2009)
+++ src/http/ngx_http_special_response.c (working copy)
@@ -275,14 +275,16 @@
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_string(ngx_http_error_301_page),
ngx_string(ngx_http_error_302_page),
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_401_page),
@@ -302,7 +304,8 @@
ngx_string(ngx_http_error_415_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_496_page), /* 496, https no certificate */
@@ -318,6 +321,9 @@
ngx_null_string, /* 505 */
ngx_null_string, /* 506 */
ngx_string(ngx_http_error_507_page)
+
+#define NGX_HTTP_LAST_LEVEL_500 508
+
};
@@ -402,16 +408,22 @@
/* 204 */
err = 0;
- } else if (error < NGX_HTTP_BAD_REQUEST) {
+ } else if (error >= NGX_HTTP_MOVED_PERMANENTLY
+ && error < NGX_HTTP_LAST_LEVEL_300)
+ {
/* 3XX */
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 */
err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300;
- } else {
+ } else if (error >= NGX_HTTP_OWN_CODES
+ && error < NGX_HTTP_LAST_LEVEL_500)
+ {
/* 49X, 5XX */
err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200
+ NGX_HTTP_LEVEL_300
@@ -423,6 +435,10 @@
r->err_status = NGX_HTTP_BAD_REQUEST;
break;
}
+
+ } else {
+ /* unknown code, zero body */
+ err = 0;
}
return ngx_http_send_special_response(r, clcf, err);
Index: src/http/ngx_http_header_filter_module.c
===================================================================
--- src/http/ngx_http_header_filter_module.c (revision 2009)
+++ src/http/ngx_http_header_filter_module.c (working copy)
@@ -61,7 +61,8 @@
/* 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" */
@@ -74,7 +75,8 @@
/* ngx_null_string, */ /* "306 unused" */
/* 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("401 Unauthorized"),
@@ -106,7 +108,8 @@
/* ngx_null_string, */ /* "423 Locked" */
/* 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("501 Method Not Implemented"),
@@ -120,6 +123,9 @@
/* ngx_null_string, */ /* "508 unused" */
/* ngx_null_string, */ /* "509 unused" */
/* ngx_null_string, */ /* "510 Not Extended" */
+
+#define NGX_HTTP_LAST_LEVEL_500 508
+
};
@@ -153,7 +159,7 @@
{
u_char *p;
size_t len;
- ngx_str_t host;
+ ngx_str_t host, *status_line;
ngx_buf_t *b;
ngx_uint_t status, i, port;
ngx_chain_t out;
@@ -199,17 +205,21 @@
if (r->headers_out.status_line.len) {
len += r->headers_out.status_line.len;
+ status_line = &r->headers_out.status_line;
#if (NGX_SUPPRESS_WARN)
- status = NGX_INVALID_ARRAY_INDEX;
+ status = 0;
#endif
} else {
- if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) {
+ status = r->headers_out.status;
+
+ if (status >= NGX_HTTP_OK
+ && status < NGX_HTTP_LAST_LEVEL_200)
+ {
/* 2XX */
- status = r->headers_out.status - NGX_HTTP_OK;
- if (r->headers_out.status == NGX_HTTP_NO_CONTENT) {
+ if (status == NGX_HTTP_NO_CONTENT) {
r->header_only = 1;
r->headers_out.content_type.len = 0;
r->headers_out.content_type.data = NULL;
@@ -219,30 +229,50 @@
r->headers_out.content_length_n = -1;
}
- } else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST) {
+ status -= NGX_HTTP_OK;
+ status_line = &ngx_http_status_lines[status];
+ len += ngx_http_status_lines[status].len;
+
+ } else if (status >= NGX_HTTP_MOVED_PERMANENTLY
+ && status < NGX_HTTP_LAST_LEVEL_300)
+ {
/* 3XX */
- status = r->headers_out.status - NGX_HTTP_MOVED_PERMANENTLY
- + NGX_HTTP_LEVEL_200;
- if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {
+ if (status == NGX_HTTP_NOT_MODIFIED) {
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 */
- status = r->headers_out.status - NGX_HTTP_BAD_REQUEST
- + NGX_HTTP_LEVEL_200
- + NGX_HTTP_LEVEL_300;
+ status = status - NGX_HTTP_BAD_REQUEST
+ + NGX_HTTP_LEVEL_200
+ + NGX_HTTP_LEVEL_300;
+ 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 */
+ status = status - NGX_HTTP_INTERNAL_SERVER_ERROR
+ + NGX_HTTP_LEVEL_200
+ + NGX_HTTP_LEVEL_300
+ + NGX_HTTP_LEVEL_400;
+
+ status_line = &ngx_http_status_lines[status];
+ len += ngx_http_status_lines[status].len;
+
} else {
- /* 5XX */
- status = r->headers_out.status - NGX_HTTP_INTERNAL_SERVER_ERROR
- + NGX_HTTP_LEVEL_200
- + NGX_HTTP_LEVEL_300
- + NGX_HTTP_LEVEL_400;
+ len += NGX_INT_T_LEN;
+ status_line = NULL;
}
-
- len += ngx_http_status_lines[status].len;
}
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
@@ -400,13 +430,11 @@
b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);
/* status line */
- if (r->headers_out.status_line.len) {
- b->last = ngx_copy(b->last, r->headers_out.status_line.data,
- r->headers_out.status_line.len);
+ if (status_line) {
+ b->last = ngx_copy(b->last, status_line->data, status_line->len);
} else {
- b->last = ngx_copy(b->last, ngx_http_status_lines[status].data,
- ngx_http_status_lines[status].len);
+ b->last = ngx_sprintf(b->last, "%ui", status);
}
*b->last++ = CR; *b->last++ = LF;
More information about the nginx
mailing list