Annotation of embedaddon/nginx/src/http/ngx_http_request.h, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (C) Igor Sysoev
4: * Copyright (C) Nginx, Inc.
5: */
6:
7:
8: #ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
9: #define _NGX_HTTP_REQUEST_H_INCLUDED_
10:
11:
12: #define NGX_HTTP_MAX_URI_CHANGES 10
13: #define NGX_HTTP_MAX_SUBREQUESTS 200
14:
15: /* must be 2^n */
16: #define NGX_HTTP_LC_HEADER_LEN 32
17:
18:
19: #define NGX_HTTP_DISCARD_BUFFER_SIZE 4096
20: #define NGX_HTTP_LINGERING_BUFFER_SIZE 4096
21:
22:
23: #define NGX_HTTP_VERSION_9 9
24: #define NGX_HTTP_VERSION_10 1000
25: #define NGX_HTTP_VERSION_11 1001
26:
27: #define NGX_HTTP_UNKNOWN 0x0001
28: #define NGX_HTTP_GET 0x0002
29: #define NGX_HTTP_HEAD 0x0004
30: #define NGX_HTTP_POST 0x0008
31: #define NGX_HTTP_PUT 0x0010
32: #define NGX_HTTP_DELETE 0x0020
33: #define NGX_HTTP_MKCOL 0x0040
34: #define NGX_HTTP_COPY 0x0080
35: #define NGX_HTTP_MOVE 0x0100
36: #define NGX_HTTP_OPTIONS 0x0200
37: #define NGX_HTTP_PROPFIND 0x0400
38: #define NGX_HTTP_PROPPATCH 0x0800
39: #define NGX_HTTP_LOCK 0x1000
40: #define NGX_HTTP_UNLOCK 0x2000
41: #define NGX_HTTP_PATCH 0x4000
42: #define NGX_HTTP_TRACE 0x8000
43:
44: #define NGX_HTTP_CONNECTION_CLOSE 1
45: #define NGX_HTTP_CONNECTION_KEEP_ALIVE 2
46:
47:
48: #define NGX_NONE 1
49:
50:
51: #define NGX_HTTP_PARSE_HEADER_DONE 1
52:
53: #define NGX_HTTP_CLIENT_ERROR 10
54: #define NGX_HTTP_PARSE_INVALID_METHOD 10
55: #define NGX_HTTP_PARSE_INVALID_REQUEST 11
56: #define NGX_HTTP_PARSE_INVALID_09_METHOD 12
57:
58: #define NGX_HTTP_PARSE_INVALID_HEADER 13
59:
60:
61: /* unused 1 */
62: #define NGX_HTTP_SUBREQUEST_IN_MEMORY 2
63: #define NGX_HTTP_SUBREQUEST_WAITED 4
64: #define NGX_HTTP_LOG_UNSAFE 8
65:
66:
67: #define NGX_HTTP_CONTINUE 100
68: #define NGX_HTTP_SWITCHING_PROTOCOLS 101
69: #define NGX_HTTP_PROCESSING 102
70:
71: #define NGX_HTTP_OK 200
72: #define NGX_HTTP_CREATED 201
73: #define NGX_HTTP_ACCEPTED 202
74: #define NGX_HTTP_NO_CONTENT 204
75: #define NGX_HTTP_PARTIAL_CONTENT 206
76:
77: #define NGX_HTTP_SPECIAL_RESPONSE 300
78: #define NGX_HTTP_MOVED_PERMANENTLY 301
79: #define NGX_HTTP_MOVED_TEMPORARILY 302
80: #define NGX_HTTP_SEE_OTHER 303
81: #define NGX_HTTP_NOT_MODIFIED 304
82: #define NGX_HTTP_TEMPORARY_REDIRECT 307
83:
84: #define NGX_HTTP_BAD_REQUEST 400
85: #define NGX_HTTP_UNAUTHORIZED 401
86: #define NGX_HTTP_FORBIDDEN 403
87: #define NGX_HTTP_NOT_FOUND 404
88: #define NGX_HTTP_NOT_ALLOWED 405
89: #define NGX_HTTP_REQUEST_TIME_OUT 408
90: #define NGX_HTTP_CONFLICT 409
91: #define NGX_HTTP_LENGTH_REQUIRED 411
92: #define NGX_HTTP_PRECONDITION_FAILED 412
93: #define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE 413
94: #define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
95: #define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE 415
96: #define NGX_HTTP_RANGE_NOT_SATISFIABLE 416
97:
98:
99: /* Our own HTTP codes */
100:
101: /* The special code to close connection without any response */
102: #define NGX_HTTP_CLOSE 444
103:
104: #define NGX_HTTP_NGINX_CODES 494
105:
106: #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE 494
107:
108: #define NGX_HTTPS_CERT_ERROR 495
109: #define NGX_HTTPS_NO_CERT 496
110:
111: /*
112: * We use the special code for the plain HTTP requests that are sent to
113: * HTTPS port to distinguish it from 4XX in an error page redirection
114: */
115: #define NGX_HTTP_TO_HTTPS 497
116:
117: /* 498 is the canceled code for the requests with invalid host name */
118:
119: /*
120: * HTTP does not define the code for the case when a client closed
121: * the connection while we are processing its request so we introduce
122: * own code to log such situation when a client has closed the connection
123: * before we even try to send the HTTP header to it
124: */
125: #define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
126:
127:
128: #define NGX_HTTP_INTERNAL_SERVER_ERROR 500
129: #define NGX_HTTP_NOT_IMPLEMENTED 501
130: #define NGX_HTTP_BAD_GATEWAY 502
131: #define NGX_HTTP_SERVICE_UNAVAILABLE 503
132: #define NGX_HTTP_GATEWAY_TIME_OUT 504
133: #define NGX_HTTP_INSUFFICIENT_STORAGE 507
134:
135:
136: #define NGX_HTTP_LOWLEVEL_BUFFERED 0xf0
137: #define NGX_HTTP_WRITE_BUFFERED 0x10
138: #define NGX_HTTP_GZIP_BUFFERED 0x20
139: #define NGX_HTTP_SSI_BUFFERED 0x01
140: #define NGX_HTTP_SUB_BUFFERED 0x02
141: #define NGX_HTTP_COPY_BUFFERED 0x04
142:
143:
144: typedef enum {
145: NGX_HTTP_INITING_REQUEST_STATE = 0,
146: NGX_HTTP_READING_REQUEST_STATE,
147: NGX_HTTP_PROCESS_REQUEST_STATE,
148:
149: NGX_HTTP_CONNECT_UPSTREAM_STATE,
150: NGX_HTTP_WRITING_UPSTREAM_STATE,
151: NGX_HTTP_READING_UPSTREAM_STATE,
152:
153: NGX_HTTP_WRITING_REQUEST_STATE,
154: NGX_HTTP_LINGERING_CLOSE_STATE,
155: NGX_HTTP_KEEPALIVE_STATE
156: } ngx_http_state_e;
157:
158:
159: typedef struct {
160: ngx_str_t name;
161: ngx_uint_t offset;
162: ngx_http_header_handler_pt handler;
163: } ngx_http_header_t;
164:
165:
166: typedef struct {
167: ngx_str_t name;
168: ngx_uint_t offset;
169: } ngx_http_header_out_t;
170:
171:
172: typedef struct {
173: ngx_list_t headers;
174:
175: ngx_table_elt_t *host;
176: ngx_table_elt_t *connection;
177: ngx_table_elt_t *if_modified_since;
178: ngx_table_elt_t *if_unmodified_since;
179: ngx_table_elt_t *if_match;
180: ngx_table_elt_t *if_none_match;
181: ngx_table_elt_t *user_agent;
182: ngx_table_elt_t *referer;
183: ngx_table_elt_t *content_length;
184: ngx_table_elt_t *content_type;
185:
186: ngx_table_elt_t *range;
187: ngx_table_elt_t *if_range;
188:
189: ngx_table_elt_t *transfer_encoding;
190: ngx_table_elt_t *expect;
191: ngx_table_elt_t *upgrade;
192:
193: #if (NGX_HTTP_GZIP)
194: ngx_table_elt_t *accept_encoding;
195: ngx_table_elt_t *via;
196: #endif
197:
198: ngx_table_elt_t *authorization;
199:
200: ngx_table_elt_t *keep_alive;
201:
202: #if (NGX_HTTP_X_FORWARDED_FOR)
203: ngx_array_t x_forwarded_for;
204: #endif
205:
206: #if (NGX_HTTP_REALIP)
207: ngx_table_elt_t *x_real_ip;
208: #endif
209:
210: #if (NGX_HTTP_HEADERS)
211: ngx_table_elt_t *accept;
212: ngx_table_elt_t *accept_language;
213: #endif
214:
215: #if (NGX_HTTP_DAV)
216: ngx_table_elt_t *depth;
217: ngx_table_elt_t *destination;
218: ngx_table_elt_t *overwrite;
219: ngx_table_elt_t *date;
220: #endif
221:
222: ngx_str_t user;
223: ngx_str_t passwd;
224:
225: ngx_array_t cookies;
226:
227: ngx_str_t server;
228: off_t content_length_n;
229: time_t keep_alive_n;
230:
231: unsigned connection_type:2;
232: unsigned chunked:1;
233: unsigned msie:1;
234: unsigned msie6:1;
235: unsigned opera:1;
236: unsigned gecko:1;
237: unsigned chrome:1;
238: unsigned safari:1;
239: unsigned konqueror:1;
240: } ngx_http_headers_in_t;
241:
242:
243: typedef struct {
244: ngx_list_t headers;
245:
246: ngx_uint_t status;
247: ngx_str_t status_line;
248:
249: ngx_table_elt_t *server;
250: ngx_table_elt_t *date;
251: ngx_table_elt_t *content_length;
252: ngx_table_elt_t *content_encoding;
253: ngx_table_elt_t *location;
254: ngx_table_elt_t *refresh;
255: ngx_table_elt_t *last_modified;
256: ngx_table_elt_t *content_range;
257: ngx_table_elt_t *accept_ranges;
258: ngx_table_elt_t *www_authenticate;
259: ngx_table_elt_t *expires;
260: ngx_table_elt_t *etag;
261:
262: ngx_str_t *override_charset;
263:
264: size_t content_type_len;
265: ngx_str_t content_type;
266: ngx_str_t charset;
267: u_char *content_type_lowcase;
268: ngx_uint_t content_type_hash;
269:
270: ngx_array_t cache_control;
271:
272: off_t content_length_n;
273: time_t date_time;
274: time_t last_modified_time;
275: } ngx_http_headers_out_t;
276:
277:
278: typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);
279:
280: typedef struct {
281: ngx_temp_file_t *temp_file;
282: ngx_chain_t *bufs;
283: ngx_buf_t *buf;
284: off_t rest;
285: ngx_chain_t *free;
286: ngx_chain_t *busy;
287: ngx_http_chunked_t *chunked;
288: ngx_http_client_body_handler_pt post_handler;
289: } ngx_http_request_body_t;
290:
291:
292: typedef struct ngx_http_addr_conf_s ngx_http_addr_conf_t;
293:
294: typedef struct {
295: ngx_http_addr_conf_t *addr_conf;
296: ngx_http_conf_ctx_t *conf_ctx;
297:
298: #if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)
299: ngx_str_t *ssl_servername;
300: #if (NGX_PCRE)
301: ngx_http_regex_t *ssl_servername_regex;
302: #endif
303: #endif
304:
305: ngx_buf_t **busy;
306: ngx_int_t nbusy;
307:
308: ngx_buf_t **free;
309: ngx_int_t nfree;
310:
311: #if (NGX_HTTP_SSL)
312: ngx_uint_t ssl; /* unsigned ssl:1; */
313: #endif
314: } ngx_http_connection_t;
315:
316:
317: typedef void (*ngx_http_cleanup_pt)(void *data);
318:
319: typedef struct ngx_http_cleanup_s ngx_http_cleanup_t;
320:
321: struct ngx_http_cleanup_s {
322: ngx_http_cleanup_pt handler;
323: void *data;
324: ngx_http_cleanup_t *next;
325: };
326:
327:
328: typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
329: void *data, ngx_int_t rc);
330:
331: typedef struct {
332: ngx_http_post_subrequest_pt handler;
333: void *data;
334: } ngx_http_post_subrequest_t;
335:
336:
337: typedef struct ngx_http_postponed_request_s ngx_http_postponed_request_t;
338:
339: struct ngx_http_postponed_request_s {
340: ngx_http_request_t *request;
341: ngx_chain_t *out;
342: ngx_http_postponed_request_t *next;
343: };
344:
345:
346: typedef struct ngx_http_posted_request_s ngx_http_posted_request_t;
347:
348: struct ngx_http_posted_request_s {
349: ngx_http_request_t *request;
350: ngx_http_posted_request_t *next;
351: };
352:
353:
354: typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
355: typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);
356:
357:
358: struct ngx_http_request_s {
359: uint32_t signature; /* "HTTP" */
360:
361: ngx_connection_t *connection;
362:
363: void **ctx;
364: void **main_conf;
365: void **srv_conf;
366: void **loc_conf;
367:
368: ngx_http_event_handler_pt read_event_handler;
369: ngx_http_event_handler_pt write_event_handler;
370:
371: #if (NGX_HTTP_CACHE)
372: ngx_http_cache_t *cache;
373: #endif
374:
375: ngx_http_upstream_t *upstream;
376: ngx_array_t *upstream_states;
377: /* of ngx_http_upstream_state_t */
378:
379: ngx_pool_t *pool;
380: ngx_buf_t *header_in;
381:
382: ngx_http_headers_in_t headers_in;
383: ngx_http_headers_out_t headers_out;
384:
385: ngx_http_request_body_t *request_body;
386:
387: time_t lingering_time;
388: time_t start_sec;
389: ngx_msec_t start_msec;
390:
391: ngx_uint_t method;
392: ngx_uint_t http_version;
393:
394: ngx_str_t request_line;
395: ngx_str_t uri;
396: ngx_str_t args;
397: ngx_str_t exten;
398: ngx_str_t unparsed_uri;
399:
400: ngx_str_t method_name;
401: ngx_str_t http_protocol;
402:
403: ngx_chain_t *out;
404: ngx_http_request_t *main;
405: ngx_http_request_t *parent;
406: ngx_http_postponed_request_t *postponed;
407: ngx_http_post_subrequest_t *post_subrequest;
408: ngx_http_posted_request_t *posted_requests;
409:
410: ngx_int_t phase_handler;
411: ngx_http_handler_pt content_handler;
412: ngx_uint_t access_code;
413:
414: ngx_http_variable_value_t *variables;
415:
416: #if (NGX_PCRE)
417: ngx_uint_t ncaptures;
418: int *captures;
419: u_char *captures_data;
420: #endif
421:
422: size_t limit_rate;
423:
424: /* used to learn the Apache compatible response length without a header */
425: size_t header_size;
426:
427: off_t request_length;
428:
429: ngx_uint_t err_status;
430:
431: ngx_http_connection_t *http_connection;
432: #if (NGX_HTTP_SPDY)
433: ngx_http_spdy_stream_t *spdy_stream;
434: #endif
435:
436: ngx_http_log_handler_pt log_handler;
437:
438: ngx_http_cleanup_t *cleanup;
439:
440: unsigned subrequests:8;
441: unsigned count:8;
442: unsigned blocked:8;
443:
444: unsigned aio:1;
445:
446: unsigned http_state:4;
447:
448: /* URI with "/." and on Win32 with "//" */
449: unsigned complex_uri:1;
450:
451: /* URI with "%" */
452: unsigned quoted_uri:1;
453:
454: /* URI with "+" */
455: unsigned plus_in_uri:1;
456:
457: /* URI with " " */
458: unsigned space_in_uri:1;
459:
460: unsigned invalid_header:1;
461:
462: unsigned add_uri_to_alias:1;
463: unsigned valid_location:1;
464: unsigned valid_unparsed_uri:1;
465: unsigned uri_changed:1;
466: unsigned uri_changes:4;
467:
468: unsigned request_body_in_single_buf:1;
469: unsigned request_body_in_file_only:1;
470: unsigned request_body_in_persistent_file:1;
471: unsigned request_body_in_clean_file:1;
472: unsigned request_body_file_group_access:1;
473: unsigned request_body_file_log_level:3;
474:
475: unsigned subrequest_in_memory:1;
476: unsigned waited:1;
477:
478: #if (NGX_HTTP_CACHE)
479: unsigned cached:1;
480: #endif
481:
482: #if (NGX_HTTP_GZIP)
483: unsigned gzip_tested:1;
484: unsigned gzip_ok:1;
485: unsigned gzip_vary:1;
486: #endif
487:
488: unsigned proxy:1;
489: unsigned bypass_cache:1;
490: unsigned no_cache:1;
491:
492: /*
493: * instead of using the request context data in
494: * ngx_http_limit_conn_module and ngx_http_limit_req_module
495: * we use the single bits in the request structure
496: */
497: unsigned limit_conn_set:1;
498: unsigned limit_req_set:1;
499:
500: #if 0
501: unsigned cacheable:1;
502: #endif
503:
504: unsigned pipeline:1;
505: unsigned chunked:1;
506: unsigned header_only:1;
507: unsigned keepalive:1;
508: unsigned lingering_close:1;
509: unsigned discard_body:1;
510: unsigned internal:1;
511: unsigned error_page:1;
512: unsigned ignore_content_encoding:1;
513: unsigned filter_finalize:1;
514: unsigned post_action:1;
515: unsigned request_complete:1;
516: unsigned request_output:1;
517: unsigned header_sent:1;
518: unsigned expect_tested:1;
519: unsigned root_tested:1;
520: unsigned done:1;
521: unsigned logged:1;
522:
523: unsigned buffered:4;
524:
525: unsigned main_filter_need_in_memory:1;
526: unsigned filter_need_in_memory:1;
527: unsigned filter_need_temporary:1;
528: unsigned allow_ranges:1;
529:
530: #if (NGX_STAT_STUB)
531: unsigned stat_reading:1;
532: unsigned stat_writing:1;
533: #endif
534:
535: /* used to parse HTTP headers */
536:
537: ngx_uint_t state;
538:
539: ngx_uint_t header_hash;
540: ngx_uint_t lowcase_index;
541: u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN];
542:
543: u_char *header_name_start;
544: u_char *header_name_end;
545: u_char *header_start;
546: u_char *header_end;
547:
548: /*
549: * a memory that can be reused after parsing a request line
550: * via ngx_http_ephemeral_t
551: */
552:
553: u_char *uri_start;
554: u_char *uri_end;
555: u_char *uri_ext;
556: u_char *args_start;
557: u_char *request_start;
558: u_char *request_end;
559: u_char *method_end;
560: u_char *schema_start;
561: u_char *schema_end;
562: u_char *host_start;
563: u_char *host_end;
564: u_char *port_start;
565: u_char *port_end;
566:
567: unsigned http_minor:16;
568: unsigned http_major:16;
569: };
570:
571:
572: typedef struct {
573: ngx_http_posted_request_t terminal_posted_request;
574: #if (NGX_HAVE_AIO_SENDFILE)
575: u_char aio_preload;
576: #endif
577: } ngx_http_ephemeral_t;
578:
579:
580: extern ngx_http_header_t ngx_http_headers_in[];
581: extern ngx_http_header_out_t ngx_http_headers_out[];
582:
583:
584: #define ngx_http_set_connection_log(c, l) \
585: \
586: c->log->file = l->file; \
587: if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { \
588: c->log->log_level = l->log_level; \
589: }
590:
591:
592: #endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>