comparison src/http/ngx_http_header_filter_module.c @ 478:f2c6a7373274 NGINX_0_7_51

nginx 0.7.51 *) Feature: the "try_files" directive supports a response code in the fallback parameter. *) Feature: now any response code can be used in the "return" directive. *) Bugfix: the "error_page" directive made an external redirect without query string; the bug had appeared in 0.7.44. *) Bugfix: if servers listened on several defined explicitly addresses, then virtual servers might not work; the bug had appeared in 0.7.39.
author Igor Sysoev <http://sysoev.ru>
date Sun, 12 Apr 2009 00:00:00 +0400
parents ca8f7f6cab16
children 549994537f15
comparison
equal deleted inserted replaced
477:ba2ea8c4d60f 478:f2c6a7373274
59 ngx_null_string, /* "205 Reset Content" */ 59 ngx_null_string, /* "205 Reset Content" */
60 ngx_string("206 Partial Content"), 60 ngx_string("206 Partial Content"),
61 61
62 /* ngx_null_string, */ /* "207 Multi-Status" */ 62 /* ngx_null_string, */ /* "207 Multi-Status" */
63 63
64 #define NGX_HTTP_LEVEL_200 7 64 #define NGX_HTTP_LAST_LEVEL_200 207
65 #define NGX_HTTP_LEVEL_200 (NGX_HTTP_LAST_LEVEL_200 - 200)
65 66
66 /* ngx_null_string, */ /* "300 Multiple Choices" */ 67 /* ngx_null_string, */ /* "300 Multiple Choices" */
67 68
68 ngx_string("301 Moved Permanently"), 69 ngx_string("301 Moved Permanently"),
69 ngx_string("302 Moved Temporarily"), 70 ngx_string("302 Moved Temporarily"),
72 73
73 /* ngx_null_string, */ /* "305 Use Proxy" */ 74 /* ngx_null_string, */ /* "305 Use Proxy" */
74 /* ngx_null_string, */ /* "306 unused" */ 75 /* ngx_null_string, */ /* "306 unused" */
75 /* ngx_null_string, */ /* "307 Temporary Redirect" */ 76 /* ngx_null_string, */ /* "307 Temporary Redirect" */
76 77
77 #define NGX_HTTP_LEVEL_300 4 78 #define NGX_HTTP_LAST_LEVEL_300 305
79 #define NGX_HTTP_LEVEL_300 (NGX_HTTP_LAST_LEVEL_300 - 301)
78 80
79 ngx_string("400 Bad Request"), 81 ngx_string("400 Bad Request"),
80 ngx_string("401 Unauthorized"), 82 ngx_string("401 Unauthorized"),
81 ngx_string("402 Payment Required"), 83 ngx_string("402 Payment Required"),
82 ngx_string("403 Forbidden"), 84 ngx_string("403 Forbidden"),
104 /* ngx_null_string, */ /* "421 unused" */ 106 /* ngx_null_string, */ /* "421 unused" */
105 /* ngx_null_string, */ /* "422 Unprocessable Entity" */ 107 /* ngx_null_string, */ /* "422 Unprocessable Entity" */
106 /* ngx_null_string, */ /* "423 Locked" */ 108 /* ngx_null_string, */ /* "423 Locked" */
107 /* ngx_null_string, */ /* "424 Failed Dependency" */ 109 /* ngx_null_string, */ /* "424 Failed Dependency" */
108 110
109 #define NGX_HTTP_LEVEL_400 17 111 #define NGX_HTTP_LAST_LEVEL_400 417
112 #define NGX_HTTP_LEVEL_400 (NGX_HTTP_LAST_LEVEL_400 - 400)
110 113
111 ngx_string("500 Internal Server Error"), 114 ngx_string("500 Internal Server Error"),
112 ngx_string("501 Method Not Implemented"), 115 ngx_string("501 Method Not Implemented"),
113 ngx_string("502 Bad Gateway"), 116 ngx_string("502 Bad Gateway"),
114 ngx_string("503 Service Temporarily Unavailable"), 117 ngx_string("503 Service Temporarily Unavailable"),
118 ngx_null_string, /* "506 Variant Also Negotiates" */ 121 ngx_null_string, /* "506 Variant Also Negotiates" */
119 ngx_string("507 Insufficient Storage"), 122 ngx_string("507 Insufficient Storage"),
120 /* ngx_null_string, */ /* "508 unused" */ 123 /* ngx_null_string, */ /* "508 unused" */
121 /* ngx_null_string, */ /* "509 unused" */ 124 /* ngx_null_string, */ /* "509 unused" */
122 /* ngx_null_string, */ /* "510 Not Extended" */ 125 /* ngx_null_string, */ /* "510 Not Extended" */
126
127 #define NGX_HTTP_LAST_LEVEL_500 508
128
123 }; 129 };
124 130
125 131
126 ngx_http_header_out_t ngx_http_headers_out[] = { 132 ngx_http_header_out_t ngx_http_headers_out[] = {
127 { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) }, 133 { ngx_string("Server"), offsetof(ngx_http_headers_out_t, server) },
151 static ngx_int_t 157 static ngx_int_t
152 ngx_http_header_filter(ngx_http_request_t *r) 158 ngx_http_header_filter(ngx_http_request_t *r)
153 { 159 {
154 u_char *p; 160 u_char *p;
155 size_t len; 161 size_t len;
156 ngx_str_t host; 162 ngx_str_t host, *status_line;
157 ngx_buf_t *b; 163 ngx_buf_t *b;
158 ngx_uint_t status, i, port; 164 ngx_uint_t status, i, port;
159 ngx_chain_t out; 165 ngx_chain_t out;
160 ngx_list_part_t *part; 166 ngx_list_part_t *part;
161 ngx_table_elt_t *header; 167 ngx_table_elt_t *header;
197 203
198 /* status line */ 204 /* status line */
199 205
200 if (r->headers_out.status_line.len) { 206 if (r->headers_out.status_line.len) {
201 len += r->headers_out.status_line.len; 207 len += r->headers_out.status_line.len;
208 status_line = &r->headers_out.status_line;
202 #if (NGX_SUPPRESS_WARN) 209 #if (NGX_SUPPRESS_WARN)
203 status = NGX_INVALID_ARRAY_INDEX; 210 status = 0;
204 #endif 211 #endif
205 212
206 } else { 213 } else {
207 214
208 if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) { 215 status = r->headers_out.status;
216
217 if (status >= NGX_HTTP_OK
218 && status < NGX_HTTP_LAST_LEVEL_200)
219 {
209 /* 2XX */ 220 /* 2XX */
210 status = r->headers_out.status - NGX_HTTP_OK; 221
211 222 if (status == NGX_HTTP_NO_CONTENT) {
212 if (r->headers_out.status == NGX_HTTP_NO_CONTENT) {
213 r->header_only = 1; 223 r->header_only = 1;
214 r->headers_out.content_type.len = 0; 224 r->headers_out.content_type.len = 0;
215 r->headers_out.content_type.data = NULL; 225 r->headers_out.content_type.data = NULL;
216 r->headers_out.last_modified_time = -1; 226 r->headers_out.last_modified_time = -1;
217 r->headers_out.last_modified = NULL; 227 r->headers_out.last_modified = NULL;
218 r->headers_out.content_length = NULL; 228 r->headers_out.content_length = NULL;
219 r->headers_out.content_length_n = -1; 229 r->headers_out.content_length_n = -1;
220 } 230 }
221 231
222 } else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST) { 232 status -= NGX_HTTP_OK;
233 status_line = &ngx_http_status_lines[status];
234 len += ngx_http_status_lines[status].len;
235
236 } else if (status >= NGX_HTTP_MOVED_PERMANENTLY
237 && status < NGX_HTTP_LAST_LEVEL_300)
238 {
223 /* 3XX */ 239 /* 3XX */
224 status = r->headers_out.status - NGX_HTTP_MOVED_PERMANENTLY 240
225 + NGX_HTTP_LEVEL_200; 241 if (status == NGX_HTTP_NOT_MODIFIED) {
226
227 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) {
228 r->header_only = 1; 242 r->header_only = 1;
229 } 243 }
230 244
231 } else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR) { 245 status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
246 status_line = &ngx_http_status_lines[status];
247 len += ngx_http_status_lines[status].len;
248
249 } else if (status >= NGX_HTTP_BAD_REQUEST
250 && status < NGX_HTTP_LAST_LEVEL_400)
251 {
232 /* 4XX */ 252 /* 4XX */
233 status = r->headers_out.status - NGX_HTTP_BAD_REQUEST 253 status = status - NGX_HTTP_BAD_REQUEST
234 + NGX_HTTP_LEVEL_200 254 + NGX_HTTP_LEVEL_200
235 + NGX_HTTP_LEVEL_300; 255 + NGX_HTTP_LEVEL_300;
256
257 status_line = &ngx_http_status_lines[status];
258 len += ngx_http_status_lines[status].len;
259
260 } else if (status >= NGX_HTTP_INTERNAL_SERVER_ERROR
261 && status < NGX_HTTP_LAST_LEVEL_500)
262 {
263 /* 5XX */
264 status = status - NGX_HTTP_INTERNAL_SERVER_ERROR
265 + NGX_HTTP_LEVEL_200
266 + NGX_HTTP_LEVEL_300
267 + NGX_HTTP_LEVEL_400;
268
269 status_line = &ngx_http_status_lines[status];
270 len += ngx_http_status_lines[status].len;
236 271
237 } else { 272 } else {
238 /* 5XX */ 273 len += NGX_INT_T_LEN;
239 status = r->headers_out.status - NGX_HTTP_INTERNAL_SERVER_ERROR 274 status_line = NULL;
240 + NGX_HTTP_LEVEL_200 275 }
241 + NGX_HTTP_LEVEL_300
242 + NGX_HTTP_LEVEL_400;
243 }
244
245 len += ngx_http_status_lines[status].len;
246 } 276 }
247 277
248 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); 278 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
249 279
250 if (r->headers_out.server == NULL) { 280 if (r->headers_out.server == NULL) {
398 428
399 /* "HTTP/1.x " */ 429 /* "HTTP/1.x " */
400 b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1); 430 b->last = ngx_cpymem(b->last, "HTTP/1.1 ", sizeof("HTTP/1.x ") - 1);
401 431
402 /* status line */ 432 /* status line */
403 if (r->headers_out.status_line.len) { 433 if (status_line) {
404 b->last = ngx_copy(b->last, r->headers_out.status_line.data, 434 b->last = ngx_copy(b->last, status_line->data, status_line->len);
405 r->headers_out.status_line.len);
406 435
407 } else { 436 } else {
408 b->last = ngx_copy(b->last, ngx_http_status_lines[status].data, 437 b->last = ngx_sprintf(b->last, "%ui", status);
409 ngx_http_status_lines[status].len);
410 } 438 }
411 *b->last++ = CR; *b->last++ = LF; 439 *b->last++ = CR; *b->last++ = LF;
412 440
413 if (r->headers_out.server == NULL) { 441 if (r->headers_out.server == NULL) {
414 if (clcf->server_tokens) { 442 if (clcf->server_tokens) {