Mercurial > hg > nginx-ranges
comparison src/http/ngx_http_header_filter_module.c @ 487: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
486:ba2ea8c4d60f | 487: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) { |