Mercurial > hg > nginx-ranges
annotate src/http/ngx_http_request.h @ 391:1d9bef53cd8e
Range filter: late_ranges functionality.
Add one more filtering point after postpone filter. This allows to serve
range capable replies with subrequests. It's not as efficient as range
filtering for static data (i.e. doesn't save us from reading data from
disk if some filter needs them in memory), but it may save some network
bandwidth for us and for our users.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 21 Jul 2008 05:33:01 +0400 |
parents | 6de24473fa70 |
children | 77df96611112 |
rev | line source |
---|---|
0 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #ifndef _NGX_HTTP_REQUEST_H_INCLUDED_ | |
8 #define _NGX_HTTP_REQUEST_H_INCLUDED_ | |
9 | |
10 | |
200 | 11 #define NGX_HTTP_MAX_URI_CHANGES 10 |
206 | 12 #define NGX_HTTP_MAX_SUBREQUESTS 50 |
58 | 13 |
198 | 14 /* must be 2^n */ |
15 #define NGX_HTTP_LC_HEADER_LEN 32 | |
16 | |
58 | 17 |
0 | 18 #define NGX_HTTP_DISCARD_BUFFER_SIZE 4096 |
19 #define NGX_HTTP_LINGERING_BUFFER_SIZE 4096 | |
20 | |
21 | |
22 #define NGX_HTTP_VERSION_9 9 | |
23 #define NGX_HTTP_VERSION_10 1000 | |
24 #define NGX_HTTP_VERSION_11 1001 | |
25 | |
182 | 26 #define NGX_HTTP_UNKNOWN 0x0001 |
27 #define NGX_HTTP_GET 0x0002 | |
28 #define NGX_HTTP_HEAD 0x0004 | |
29 #define NGX_HTTP_POST 0x0008 | |
30 #define NGX_HTTP_PUT 0x0010 | |
31 #define NGX_HTTP_DELETE 0x0020 | |
186 | 32 #define NGX_HTTP_MKCOL 0x0040 |
256 | 33 #define NGX_HTTP_COPY 0x0080 |
34 #define NGX_HTTP_MOVE 0x0100 | |
35 #define NGX_HTTP_OPTIONS 0x0200 | |
36 #define NGX_HTTP_PROPFIND 0x0400 | |
37 #define NGX_HTTP_PROPPATCH 0x0800 | |
38 #define NGX_HTTP_LOCK 0x1000 | |
39 #define NGX_HTTP_UNLOCK 0x2000 | |
294 | 40 #define NGX_HTTP_TRACE 0x4000 |
0 | 41 |
42 #define NGX_HTTP_CONNECTION_CLOSE 1 | |
43 #define NGX_HTTP_CONNECTION_KEEP_ALIVE 2 | |
44 | |
45 | |
46 #define NGX_NONE 1 | |
47 | |
48 | |
49 #define NGX_HTTP_PARSE_HEADER_DONE 1 | |
50 | |
51 #define NGX_HTTP_CLIENT_ERROR 10 | |
52 #define NGX_HTTP_PARSE_INVALID_METHOD 10 | |
53 #define NGX_HTTP_PARSE_INVALID_REQUEST 11 | |
54 | 54 #define NGX_HTTP_PARSE_INVALID_09_METHOD 12 |
0 | 55 |
54 | 56 #define NGX_HTTP_PARSE_INVALID_HEADER 13 |
0 | 57 |
248 | 58 |
122 | 59 #define NGX_HTTP_ZERO_IN_URI 1 |
248 | 60 #define NGX_HTTP_SUBREQUEST_IN_MEMORY 2 |
122 | 61 |
0 | 62 |
63 #define NGX_HTTP_OK 200 | |
182 | 64 #define NGX_HTTP_CREATED 201 |
60 | 65 #define NGX_HTTP_NO_CONTENT 204 |
0 | 66 #define NGX_HTTP_PARTIAL_CONTENT 206 |
67 | |
68 #define NGX_HTTP_SPECIAL_RESPONSE 300 | |
69 #define NGX_HTTP_MOVED_PERMANENTLY 301 | |
70 #define NGX_HTTP_MOVED_TEMPORARILY 302 | |
71 #define NGX_HTTP_NOT_MODIFIED 304 | |
72 | |
73 #define NGX_HTTP_BAD_REQUEST 400 | |
52 | 74 #define NGX_HTTP_UNAUTHORIZED 401 |
0 | 75 #define NGX_HTTP_FORBIDDEN 403 |
76 #define NGX_HTTP_NOT_FOUND 404 | |
77 #define NGX_HTTP_NOT_ALLOWED 405 | |
78 #define NGX_HTTP_REQUEST_TIME_OUT 408 | |
186 | 79 #define NGX_HTTP_CONFLICT 409 |
130 | 80 #define NGX_HTTP_LENGTH_REQUIRED 411 |
276 | 81 #define NGX_HTTP_PRECONDITION_FAILED 412 |
0 | 82 #define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE 413 |
83 #define NGX_HTTP_REQUEST_URI_TOO_LARGE 414 | |
186 | 84 #define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE 415 |
0 | 85 #define NGX_HTTP_RANGE_NOT_SATISFIABLE 416 |
86 | |
87 | |
88 /* Our own HTTP codes */ | |
89 | |
136 | 90 /* The special code to close connection without any response */ |
91 #define NGX_HTTP_CLOSE 444 | |
92 | |
196 | 93 #define NGX_HTTP_OWN_CODES 495 |
94 | |
95 #define NGX_HTTPS_CERT_ERROR 495 | |
96 #define NGX_HTTPS_NO_CERT 496 | |
0 | 97 |
98 /* | |
99 * We use the special code for the plain HTTP requests that are sent to | |
126 | 100 * HTTPS port to distinguish it from 4XX in an error page redirection |
0 | 101 */ |
102 #define NGX_HTTP_TO_HTTPS 497 | |
103 | |
162 | 104 /* 498 is the canceled code for the requests with invalid host name */ |
0 | 105 |
106 /* | |
107 * HTTP does not define the code for the case when a client closed | |
108 * the connection while we are processing its request so we introduce | |
109 * own code to log such situation when a client has closed the connection | |
110 * before we even try to send the HTTP header to it | |
111 */ | |
112 #define NGX_HTTP_CLIENT_CLOSED_REQUEST 499 | |
113 | |
114 | |
115 #define NGX_HTTP_INTERNAL_SERVER_ERROR 500 | |
116 #define NGX_HTTP_NOT_IMPLEMENTED 501 | |
117 #define NGX_HTTP_BAD_GATEWAY 502 | |
118 #define NGX_HTTP_SERVICE_UNAVAILABLE 503 | |
119 #define NGX_HTTP_GATEWAY_TIME_OUT 504 | |
186 | 120 #define NGX_HTTP_INSUFFICIENT_STORAGE 507 |
0 | 121 |
122 | |
254 | 123 #define NGX_HTTP_LOWLEVEL_BUFFERED 0xf0 |
124 #define NGX_HTTP_WRITE_BUFFERED 0x10 | |
125 #define NGX_HTTP_GZIP_BUFFERED 0x20 | |
126 #define NGX_HTTP_SSI_BUFFERED 0x01 | |
296 | 127 #define NGX_HTTP_SUB_BUFFERED 0x02 |
128 #define NGX_HTTP_COPY_BUFFERED 0x04 | |
146 | 129 |
130 | |
0 | 131 typedef enum { |
132 NGX_HTTP_INITING_REQUEST_STATE = 0, | |
133 NGX_HTTP_READING_REQUEST_STATE, | |
134 NGX_HTTP_PROCESS_REQUEST_STATE, | |
135 | |
136 NGX_HTTP_CONNECT_UPSTREAM_STATE, | |
137 NGX_HTTP_WRITING_UPSTREAM_STATE, | |
138 NGX_HTTP_READING_UPSTREAM_STATE, | |
139 | |
140 NGX_HTTP_WRITING_REQUEST_STATE, | |
141 NGX_HTTP_LINGERING_CLOSE_STATE, | |
142 NGX_HTTP_KEEPALIVE_STATE | |
143 } ngx_http_state_e; | |
144 | |
145 | |
146 typedef struct { | |
50 | 147 ngx_str_t name; |
148 ngx_uint_t offset; | |
58 | 149 ngx_http_header_handler_pt handler; |
0 | 150 } ngx_http_header_t; |
151 | |
152 | |
153 typedef struct { | |
58 | 154 ngx_str_t name; |
155 ngx_uint_t offset; | |
118 | 156 } ngx_http_header_out_t; |
58 | 157 |
158 | |
159 typedef struct { | |
50 | 160 ngx_list_t headers; |
0 | 161 |
50 | 162 ngx_table_elt_t *host; |
163 ngx_table_elt_t *connection; | |
164 ngx_table_elt_t *if_modified_since; | |
165 ngx_table_elt_t *user_agent; | |
166 ngx_table_elt_t *referer; | |
167 ngx_table_elt_t *content_length; | |
168 ngx_table_elt_t *content_type; | |
0 | 169 |
50 | 170 ngx_table_elt_t *range; |
346 | 171 ngx_table_elt_t *if_range; |
0 | 172 |
130 | 173 ngx_table_elt_t *transfer_encoding; |
384 | 174 ngx_table_elt_t *expect; |
130 | 175 |
0 | 176 #if (NGX_HTTP_GZIP) |
50 | 177 ngx_table_elt_t *accept_encoding; |
178 ngx_table_elt_t *via; | |
0 | 179 #endif |
180 | |
50 | 181 ngx_table_elt_t *authorization; |
0 | 182 |
50 | 183 ngx_table_elt_t *keep_alive; |
0 | 184 |
122 | 185 #if (NGX_HTTP_PROXY || NGX_HTTP_REALIP) |
50 | 186 ngx_table_elt_t *x_forwarded_for; |
0 | 187 #endif |
188 | |
122 | 189 #if (NGX_HTTP_REALIP) |
190 ngx_table_elt_t *x_real_ip; | |
191 #endif | |
192 | |
38 | 193 #if (NGX_HTTP_HEADERS) |
50 | 194 ngx_table_elt_t *accept; |
195 ngx_table_elt_t *accept_language; | |
38 | 196 #endif |
197 | |
186 | 198 #if (NGX_HTTP_DAV) |
199 ngx_table_elt_t *depth; | |
200 ngx_table_elt_t *destination; | |
276 | 201 ngx_table_elt_t *overwrite; |
230 | 202 ngx_table_elt_t *date; |
186 | 203 #endif |
204 | |
52 | 205 ngx_str_t user; |
206 ngx_str_t passwd; | |
207 | |
50 | 208 ngx_array_t cookies; |
209 | |
376 | 210 ngx_str_t server; |
212 | 211 off_t content_length_n; |
50 | 212 time_t keep_alive_n; |
0 | 213 |
50 | 214 unsigned connection_type:2; |
215 unsigned msie:1; | |
216 unsigned msie4:1; | |
217 unsigned opera:1; | |
218 unsigned gecko:1; | |
219 unsigned konqueror:1; | |
0 | 220 } ngx_http_headers_in_t; |
221 | |
222 | |
223 typedef struct { | |
50 | 224 ngx_list_t headers; |
0 | 225 |
50 | 226 ngx_uint_t status; |
227 ngx_str_t status_line; | |
0 | 228 |
50 | 229 ngx_table_elt_t *server; |
230 ngx_table_elt_t *date; | |
231 ngx_table_elt_t *content_length; | |
232 ngx_table_elt_t *content_encoding; | |
233 ngx_table_elt_t *location; | |
348 | 234 ngx_table_elt_t *refresh; |
50 | 235 ngx_table_elt_t *last_modified; |
236 ngx_table_elt_t *content_range; | |
237 ngx_table_elt_t *accept_ranges; | |
52 | 238 ngx_table_elt_t *www_authenticate; |
50 | 239 ngx_table_elt_t *expires; |
240 ngx_table_elt_t *etag; | |
0 | 241 |
206 | 242 ngx_str_t *override_charset; |
243 | |
244 size_t content_type_len; | |
58 | 245 ngx_str_t content_type; |
50 | 246 ngx_str_t charset; |
206 | 247 |
58 | 248 ngx_array_t cache_control; |
249 | |
50 | 250 off_t content_length_n; |
251 time_t date_time; | |
252 time_t last_modified_time; | |
0 | 253 } ngx_http_headers_out_t; |
254 | |
255 | |
28 | 256 typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r); |
257 | |
0 | 258 typedef struct { |
28 | 259 ngx_temp_file_t *temp_file; |
260 ngx_chain_t *bufs; | |
261 ngx_buf_t *buf; | |
212 | 262 off_t rest; |
182 | 263 ngx_chain_t *to_write; |
28 | 264 ngx_http_client_body_handler_pt post_handler; |
0 | 265 } ngx_http_request_body_t; |
266 | |
267 | |
268 typedef struct { | |
50 | 269 ngx_http_request_t *request; |
0 | 270 |
50 | 271 ngx_buf_t **busy; |
272 ngx_int_t nbusy; | |
0 | 273 |
50 | 274 ngx_buf_t **free; |
275 ngx_int_t nfree; | |
0 | 276 |
50 | 277 ngx_uint_t pipeline; /* unsigned pipeline:1; */ |
0 | 278 } ngx_http_connection_t; |
279 | |
280 | |
326 | 281 typedef struct ngx_http_server_name_s ngx_http_server_name_t; |
282 | |
283 | |
284 typedef struct { | |
285 ngx_hash_combined_t names; | |
286 | |
287 ngx_uint_t nregex; | |
288 ngx_http_server_name_t *regex; | |
289 } ngx_http_virtual_names_t; | |
142 | 290 |
291 | |
118 | 292 typedef void (*ngx_http_cleanup_pt)(void *data); |
293 | |
294 typedef struct ngx_http_cleanup_s ngx_http_cleanup_t; | |
295 | |
296 struct ngx_http_cleanup_s { | |
142 | 297 ngx_http_cleanup_pt handler; |
298 void *data; | |
299 ngx_http_cleanup_t *next; | |
118 | 300 }; |
301 | |
302 | |
248 | 303 typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r, |
304 void *data, ngx_int_t rc); | |
305 | |
306 typedef struct { | |
307 ngx_http_post_subrequest_pt handler; | |
308 void *data; | |
309 } ngx_http_post_subrequest_t; | |
310 | |
311 | |
58 | 312 typedef struct ngx_http_postponed_request_s ngx_http_postponed_request_t; |
313 | |
314 struct ngx_http_postponed_request_s { | |
84 | 315 ngx_http_request_t *request; |
316 ngx_chain_t *out; | |
317 ngx_http_postponed_request_t *next; | |
58 | 318 }; |
319 | |
320 | |
0 | 321 typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r); |
58 | 322 typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r); |
323 | |
0 | 324 |
325 struct ngx_http_request_s { | |
50 | 326 uint32_t signature; /* "HTTP" */ |
0 | 327 |
50 | 328 ngx_connection_t *connection; |
0 | 329 |
50 | 330 void **ctx; |
331 void **main_conf; | |
332 void **srv_conf; | |
333 void **loc_conf; | |
0 | 334 |
58 | 335 ngx_http_event_handler_pt read_event_handler; |
336 ngx_http_event_handler_pt write_event_handler; | |
337 | |
50 | 338 ngx_http_cache_t *cache; |
0 | 339 |
50 | 340 ngx_http_upstream_t *upstream; |
296 | 341 ngx_array_t *upstream_states; |
342 /* of ngx_http_upstream_state_t */ | |
28 | 343 |
50 | 344 ngx_pool_t *pool; |
345 ngx_buf_t *header_in; | |
0 | 346 |
50 | 347 ngx_http_headers_in_t headers_in; |
348 ngx_http_headers_out_t headers_out; | |
0 | 349 |
50 | 350 ngx_http_request_body_t *request_body; |
0 | 351 |
50 | 352 time_t lingering_time; |
298 | 353 time_t start_sec; |
354 ngx_msec_t start_msec; | |
0 | 355 |
50 | 356 ngx_uint_t method; |
357 ngx_uint_t http_version; | |
126 | 358 |
50 | 359 ngx_str_t request_line; |
360 ngx_str_t uri; | |
361 ngx_str_t args; | |
362 ngx_str_t exten; | |
363 ngx_str_t unparsed_uri; | |
0 | 364 |
50 | 365 ngx_str_t method_name; |
366 ngx_str_t http_protocol; | |
126 | 367 |
58 | 368 ngx_chain_t *out; |
50 | 369 ngx_http_request_t *main; |
58 | 370 ngx_http_request_t *parent; |
371 ngx_http_postponed_request_t *postponed; | |
248 | 372 ngx_http_post_subrequest_t *post_subrequest; |
0 | 373 |
50 | 374 uint32_t in_addr; |
375 ngx_uint_t port; | |
376 ngx_str_t *port_text; /* ":80" */ | |
142 | 377 ngx_http_virtual_names_t *virtual_names; |
0 | 378 |
50 | 379 ngx_int_t phase_handler; |
380 ngx_http_handler_pt content_handler; | |
92 | 381 ngx_uint_t access_code; |
34 | 382 |
122 | 383 ngx_http_variable_value_t *variables; |
50 | 384 |
76 | 385 size_t limit_rate; |
386 | |
0 | 387 /* used to learn the Apache compatible response length without a header */ |
50 | 388 size_t header_size; |
0 | 389 |
212 | 390 off_t request_length; |
24 | 391 |
50 | 392 ngx_uint_t err_status; |
0 | 393 |
50 | 394 ngx_http_connection_t *http_connection; |
0 | 395 |
58 | 396 ngx_http_log_handler_pt log_handler; |
397 | |
118 | 398 ngx_http_cleanup_t *cleanup; |
399 | |
50 | 400 unsigned http_state:4; |
0 | 401 |
2 | 402 /* URI with "/." and on Win32 with "//" */ |
50 | 403 unsigned complex_uri:1; |
34 | 404 |
2 | 405 /* URI with "%" */ |
50 | 406 unsigned quoted_uri:1; |
34 | 407 |
408 /* URI with "+" */ | |
50 | 409 unsigned plus_in_uri:1; |
34 | 410 |
38 | 411 /* URI with "\0" or "%00" */ |
50 | 412 unsigned zero_in_uri:1; |
38 | 413 |
60 | 414 unsigned invalid_header:1; |
415 | |
58 | 416 unsigned valid_location:1; |
54 | 417 unsigned valid_unparsed_uri:1; |
50 | 418 unsigned uri_changed:1; |
419 unsigned uri_changes:4; | |
34 | 420 |
182 | 421 unsigned request_body_in_single_buf:1; |
422 unsigned request_body_in_file_only:1; | |
423 unsigned request_body_in_persistent_file:1; | |
278 | 424 unsigned request_body_in_clean_file:1; |
182 | 425 unsigned request_body_file_group_access:1; |
186 | 426 unsigned request_body_file_log_level:3; |
182 | 427 |
146 | 428 unsigned fast_subrequest:1; |
248 | 429 unsigned subrequest_in_memory:1; |
146 | 430 |
358 | 431 unsigned gzip:2; |
432 | |
50 | 433 unsigned proxy:1; |
434 unsigned bypass_cache:1; | |
435 unsigned no_cache:1; | |
0 | 436 |
122 | 437 #if (NGX_HTTP_REALIP) |
438 | |
439 /* | |
440 * instead of using the request context data in ngx_http_realip_module | |
441 * we use the single bit in the request structure | |
442 */ | |
443 unsigned realip_set:1; | |
444 | |
445 #endif | |
446 | |
272 | 447 /* |
448 * instead of using the request context data in ngx_http_limit_zone_module | |
449 * we use the single bit in the request structure | |
450 */ | |
451 unsigned limit_zone_set:1; | |
452 | |
0 | 453 #if 0 |
340 | 454 unsigned cacheable:1; |
0 | 455 #endif |
58 | 456 |
50 | 457 unsigned pipeline:1; |
458 unsigned plain_http:1; | |
459 unsigned chunked:1; | |
460 unsigned header_only:1; | |
238 | 461 unsigned zero_body:1; |
50 | 462 unsigned keepalive:1; |
463 unsigned lingering_close:1; | |
86 | 464 unsigned discard_body:1; |
58 | 465 unsigned internal:1; |
228 | 466 unsigned error_page:1; |
178 | 467 unsigned post_action:1; |
468 unsigned request_complete:1; | |
216 | 469 unsigned request_output:1; |
470 unsigned header_sent:1; | |
384 | 471 unsigned expect_tested:1; |
388 | 472 unsigned root_tested:1; |
58 | 473 unsigned done:1; |
72 | 474 unsigned utf8:1; |
0 | 475 |
254 | 476 unsigned buffered:4; |
477 | |
62 | 478 unsigned main_filter_need_in_memory:1; |
50 | 479 unsigned filter_need_in_memory:1; |
480 unsigned filter_need_temporary:1; | |
130 | 481 unsigned allow_ranges:1; |
391
1d9bef53cd8e
Range filter: late_ranges functionality.
Maxim Dounin <mdounin@mdounin.ru>
parents:
388
diff
changeset
|
482 unsigned late_ranges:1; |
0 | 483 |
484 #if (NGX_STAT_STUB) | |
50 | 485 unsigned stat_reading:1; |
486 unsigned stat_writing:1; | |
0 | 487 #endif |
488 | |
206 | 489 unsigned subrequests:8; |
490 | |
0 | 491 /* used to parse HTTP headers */ |
248 | 492 |
50 | 493 ngx_uint_t state; |
494 u_char *uri_start; | |
495 u_char *uri_end; | |
496 u_char *uri_ext; | |
497 u_char *args_start; | |
498 u_char *request_start; | |
499 u_char *request_end; | |
500 u_char *method_end; | |
501 u_char *schema_start; | |
502 u_char *schema_end; | |
503 u_char *host_start; | |
504 u_char *host_end; | |
505 u_char *port_start; | |
506 u_char *port_end; | |
507 u_char *header_name_start; | |
508 u_char *header_name_end; | |
509 u_char *header_start; | |
510 u_char *header_end; | |
198 | 511 |
248 | 512 unsigned http_minor:16; |
513 unsigned http_major:16; | |
514 | |
56 | 515 ngx_uint_t header_hash; |
198 | 516 ngx_uint_t lowcase_index; |
517 u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN]; | |
0 | 518 }; |
519 | |
520 | |
118 | 521 extern ngx_http_header_t ngx_http_headers_in[]; |
522 extern ngx_http_header_out_t ngx_http_headers_out[]; | |
0 | 523 |
524 | |
525 #endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */ |