blob: 9073be928d0b2e8ddee1b659776891fb5faf4b29 [file] [log] [blame]
Igor Sysoevd90282d2004-09-28 08:34:51 +00001
2/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Igor Sysoevd90282d2004-09-28 08:34:51 +00004 */
5
6
Igor Sysoeva9830112003-05-19 16:39:14 +00007#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
8#define _NGX_HTTP_REQUEST_H_INCLUDED_
9
10
Igor Sysoev6f134cc2006-05-23 14:54:58 +000011#define NGX_HTTP_MAX_URI_CHANGES 10
Igor Sysoevef809b82006-06-28 16:00:26 +000012#define NGX_HTTP_MAX_SUBREQUESTS 50
Igor Sysoev899b44e2005-05-12 14:58:06 +000013
Igor Sysoev3338cfd2006-05-11 14:43:47 +000014/* must be 2^n */
15#define NGX_HTTP_LC_HEADER_LEN 32
16
Igor Sysoev899b44e2005-05-12 14:58:06 +000017
Igor Sysoevf7abd722004-09-23 06:32:00 +000018#define NGX_HTTP_DISCARD_BUFFER_SIZE 4096
19#define NGX_HTTP_LINGERING_BUFFER_SIZE 4096
20
21
Igor Sysoev10a543a2004-03-16 07:10:12 +000022#define NGX_HTTP_VERSION_9 9
23#define NGX_HTTP_VERSION_10 1000
24#define NGX_HTTP_VERSION_11 1001
Igor Sysoeva9830112003-05-19 16:39:14 +000025
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +000026#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
Igor Sysoev7bdb7202006-04-19 15:30:56 +000032#define NGX_HTTP_MKCOL 0x0040
Igor Sysoev8365f732006-11-14 12:43:48 +000033#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
Igor Sysoev3e933d22007-03-30 18:59:26 +000040#define NGX_HTTP_TRACE 0x4000
Igor Sysoeva9830112003-05-19 16:39:14 +000041
Igor Sysoev10a543a2004-03-16 07:10:12 +000042#define NGX_HTTP_CONNECTION_CLOSE 1
43#define NGX_HTTP_CONNECTION_KEEP_ALIVE 2
Igor Sysoeva9830112003-05-19 16:39:14 +000044
45
Igor Sysoev10a543a2004-03-16 07:10:12 +000046#define NGX_NONE 1
Igor Sysoev3ae32482003-10-08 15:32:54 +000047
48
Igor Sysoev10a543a2004-03-16 07:10:12 +000049#define NGX_HTTP_PARSE_HEADER_DONE 1
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000050
Igor Sysoev10a543a2004-03-16 07:10:12 +000051#define NGX_HTTP_CLIENT_ERROR 10
52#define NGX_HTTP_PARSE_INVALID_METHOD 10
53#define NGX_HTTP_PARSE_INVALID_REQUEST 11
Igor Sysoevc04deca2005-03-28 14:43:02 +000054#define NGX_HTTP_PARSE_INVALID_09_METHOD 12
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000055
Igor Sysoevc04deca2005-03-28 14:43:02 +000056#define NGX_HTTP_PARSE_INVALID_HEADER 13
Igor Sysoeva9830112003-05-19 16:39:14 +000057
Igor Sysoev960100e2006-10-13 15:20:10 +000058
Igor Sysoev09c684b2005-11-09 17:25:55 +000059#define NGX_HTTP_ZERO_IN_URI 1
Igor Sysoev960100e2006-10-13 15:20:10 +000060#define NGX_HTTP_SUBREQUEST_IN_MEMORY 2
Igor Sysoev09c684b2005-11-09 17:25:55 +000061
Igor Sysoeva9830112003-05-19 16:39:14 +000062
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000063#define NGX_HTTP_OK 200
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +000064#define NGX_HTTP_CREATED 201
Igor Sysoev3362b8d2005-05-14 18:42:03 +000065#define NGX_HTTP_NO_CONTENT 204
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000066#define NGX_HTTP_PARTIAL_CONTENT 206
Igor Sysoeva9830112003-05-19 16:39:14 +000067
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000068#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
Igor Sysoeva9830112003-05-19 16:39:14 +000072
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000073#define NGX_HTTP_BAD_REQUEST 400
Igor Sysoev4d656dc2005-03-22 16:02:46 +000074#define NGX_HTTP_UNAUTHORIZED 401
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000075#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
Igor Sysoev7bdb7202006-04-19 15:30:56 +000079#define NGX_HTTP_CONFLICT 409
Igor Sysoevc31a9bb2005-11-26 10:11:11 +000080#define NGX_HTTP_LENGTH_REQUIRED 411
Igor Sysoevda7281a2007-01-18 20:51:51 +000081#define NGX_HTTP_PRECONDITION_FAILED 412
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000082#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE 413
83#define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
Igor Sysoev7bdb7202006-04-19 15:30:56 +000084#define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE 415
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000085#define NGX_HTTP_RANGE_NOT_SATISFIABLE 416
Igor Sysoeva9830112003-05-19 16:39:14 +000086
Igor Sysoev3043bfc2004-05-14 16:51:47 +000087
88/* Our own HTTP codes */
89
Igor Sysoevcdc46302005-12-07 14:51:31 +000090/* The special code to close connection without any response */
91#define NGX_HTTP_CLOSE 444
92
Igor Sysoev44d87222006-05-06 16:28:56 +000093#define NGX_HTTP_OWN_CODES 495
94
95#define NGX_HTTPS_CERT_ERROR 495
96#define NGX_HTTPS_NO_CERT 496
Igor Sysoeve739eb72004-07-09 07:12:14 +000097
98/*
99 * We use the special code for the plain HTTP requests that are sent to
Igor Sysoev0e5dc5c2005-11-15 13:30:52 +0000100 * HTTPS port to distinguish it from 4XX in an error page redirection
Igor Sysoeve739eb72004-07-09 07:12:14 +0000101 */
102#define NGX_HTTP_TO_HTTPS 497
Igor Sysoev3043bfc2004-05-14 16:51:47 +0000103
Igor Sysoevc2807ec2006-02-16 15:26:46 +0000104/* 498 is the canceled code for the requests with invalid host name */
Igor Sysoev3043bfc2004-05-14 16:51:47 +0000105
Igor Sysoev222a2ad2003-11-18 16:49:00 +0000106/*
Igor Sysoeva2aca9a2004-01-18 21:09:21 +0000107 * 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
Igor Sysoev222a2ad2003-11-18 16:49:00 +0000111 */
Igor Sysoev1b138ed2003-11-18 21:34:08 +0000112#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
Igor Sysoev222a2ad2003-11-18 16:49:00 +0000113
Igor Sysoev3043bfc2004-05-14 16:51:47 +0000114
Igor Sysoev2b0c76c2003-10-27 21:01:00 +0000115#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
Igor Sysoev7bdb7202006-04-19 15:30:56 +0000120#define NGX_HTTP_INSUFFICIENT_STORAGE 507
Igor Sysoeva9830112003-05-19 16:39:14 +0000121
122
Igor Sysoev020ffea2006-10-30 20:25:22 +0000123#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
Igor Sysoevd9bb8e32007-04-19 17:54:23 +0000127#define NGX_HTTP_SUB_BUFFERED 0x02
128#define NGX_HTTP_COPY_BUFFERED 0x04
Igor Sysoevdf3254a2006-01-11 15:26:57 +0000129
130
Igor Sysoev3b30a902003-12-25 20:26:58 +0000131typedef enum {
132 NGX_HTTP_INITING_REQUEST_STATE = 0,
133 NGX_HTTP_READING_REQUEST_STATE,
134 NGX_HTTP_PROCESS_REQUEST_STATE,
Igor Sysoeva9830112003-05-19 16:39:14 +0000135
Igor Sysoev3b30a902003-12-25 20:26:58 +0000136 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;
Igor Sysoeva9830112003-05-19 16:39:14 +0000144
145
146typedef struct {
Igor Sysoevc1571722005-03-19 12:38:37 +0000147 ngx_str_t name;
148 ngx_uint_t offset;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000149 ngx_http_header_handler_pt handler;
Igor Sysoeva9830112003-05-19 16:39:14 +0000150} ngx_http_header_t;
151
152
153typedef struct {
Igor Sysoev899b44e2005-05-12 14:58:06 +0000154 ngx_str_t name;
155 ngx_uint_t offset;
Igor Sysoev9ac946b2005-10-24 15:09:41 +0000156} ngx_http_header_out_t;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000157
158
159typedef struct {
Igor Sysoevc1571722005-03-19 12:38:37 +0000160 ngx_list_t headers;
Igor Sysoevb5faed22003-10-29 08:30:44 +0000161
Igor Sysoevc1571722005-03-19 12:38:37 +0000162 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;
Igor Sysoev67f88e92004-03-12 16:57:08 +0000169
Igor Sysoevc1571722005-03-19 12:38:37 +0000170 ngx_table_elt_t *range;
Igor Sysoev6c2f0522007-11-09 15:41:35 +0000171 ngx_table_elt_t *if_range;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000172
Igor Sysoevc31a9bb2005-11-26 10:11:11 +0000173 ngx_table_elt_t *transfer_encoding;
174
Igor Sysoev67f88e92004-03-12 16:57:08 +0000175#if (NGX_HTTP_GZIP)
Igor Sysoevc1571722005-03-19 12:38:37 +0000176 ngx_table_elt_t *accept_encoding;
177 ngx_table_elt_t *via;
Igor Sysoev67f88e92004-03-12 16:57:08 +0000178#endif
179
Igor Sysoevc1571722005-03-19 12:38:37 +0000180 ngx_table_elt_t *authorization;
Igor Sysoevcf80a702003-11-03 22:20:44 +0000181
Igor Sysoevc1571722005-03-19 12:38:37 +0000182 ngx_table_elt_t *keep_alive;
Igor Sysoeva9830112003-05-19 16:39:14 +0000183
Igor Sysoev09c684b2005-11-09 17:25:55 +0000184#if (NGX_HTTP_PROXY || NGX_HTTP_REALIP)
Igor Sysoevc1571722005-03-19 12:38:37 +0000185 ngx_table_elt_t *x_forwarded_for;
Igor Sysoev67f88e92004-03-12 16:57:08 +0000186#endif
187
Igor Sysoev09c684b2005-11-09 17:25:55 +0000188#if (NGX_HTTP_REALIP)
189 ngx_table_elt_t *x_real_ip;
190#endif
191
Igor Sysoev1ebfead2005-02-16 13:40:36 +0000192#if (NGX_HTTP_HEADERS)
Igor Sysoevc1571722005-03-19 12:38:37 +0000193 ngx_table_elt_t *accept;
194 ngx_table_elt_t *accept_language;
Igor Sysoev1ebfead2005-02-16 13:40:36 +0000195#endif
196
Igor Sysoev7bdb7202006-04-19 15:30:56 +0000197#if (NGX_HTTP_DAV)
198 ngx_table_elt_t *depth;
199 ngx_table_elt_t *destination;
Igor Sysoev56331ba2007-01-18 21:11:23 +0000200 ngx_table_elt_t *overwrite;
Igor Sysoevda173ab2006-08-30 10:39:17 +0000201 ngx_table_elt_t *date;
Igor Sysoev7bdb7202006-04-19 15:30:56 +0000202#endif
203
Igor Sysoev4d656dc2005-03-22 16:02:46 +0000204 ngx_str_t user;
205 ngx_str_t passwd;
206
Igor Sysoevc1571722005-03-19 12:38:37 +0000207 ngx_array_t cookies;
Igor Sysoev967fd632004-08-27 15:40:59 +0000208
Igor Sysoevc1571722005-03-19 12:38:37 +0000209 size_t host_name_len;
Igor Sysoev1765f472006-07-07 16:33:19 +0000210 off_t content_length_n;
Igor Sysoevc1571722005-03-19 12:38:37 +0000211 time_t keep_alive_n;
Igor Sysoev2f657222004-06-16 15:32:11 +0000212
Igor Sysoevc1571722005-03-19 12:38:37 +0000213 unsigned connection_type:2;
214 unsigned msie:1;
215 unsigned msie4:1;
216 unsigned opera:1;
217 unsigned gecko:1;
218 unsigned konqueror:1;
Igor Sysoeva9830112003-05-19 16:39:14 +0000219} ngx_http_headers_in_t;
220
221
222typedef struct {
Igor Sysoevc1571722005-03-19 12:38:37 +0000223 ngx_list_t headers;
Igor Sysoevb5faed22003-10-29 08:30:44 +0000224
Igor Sysoevc1571722005-03-19 12:38:37 +0000225 ngx_uint_t status;
226 ngx_str_t status_line;
Igor Sysoeva9830112003-05-19 16:39:14 +0000227
Igor Sysoevc1571722005-03-19 12:38:37 +0000228 ngx_table_elt_t *server;
229 ngx_table_elt_t *date;
Igor Sysoevc1571722005-03-19 12:38:37 +0000230 ngx_table_elt_t *content_length;
231 ngx_table_elt_t *content_encoding;
232 ngx_table_elt_t *location;
Igor Sysoev32717eb2007-11-27 11:56:18 +0000233 ngx_table_elt_t *refresh;
Igor Sysoevc1571722005-03-19 12:38:37 +0000234 ngx_table_elt_t *last_modified;
235 ngx_table_elt_t *content_range;
236 ngx_table_elt_t *accept_ranges;
Igor Sysoev4d656dc2005-03-22 16:02:46 +0000237 ngx_table_elt_t *www_authenticate;
Igor Sysoevc1571722005-03-19 12:38:37 +0000238 ngx_table_elt_t *expires;
Igor Sysoevc1571722005-03-19 12:38:37 +0000239 ngx_table_elt_t *etag;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000240
Igor Sysoevef809b82006-06-28 16:00:26 +0000241 ngx_str_t *override_charset;
242
243 size_t content_type_len;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000244 ngx_str_t content_type;
Igor Sysoevc1571722005-03-19 12:38:37 +0000245 ngx_str_t charset;
Igor Sysoeva9830112003-05-19 16:39:14 +0000246
Igor Sysoev899b44e2005-05-12 14:58:06 +0000247 ngx_array_t cache_control;
248
Igor Sysoevc1571722005-03-19 12:38:37 +0000249 off_t content_length_n;
250 time_t date_time;
251 time_t last_modified_time;
Igor Sysoeva9830112003-05-19 16:39:14 +0000252} ngx_http_headers_out_t;
253
254
Igor Sysoev02025fd2005-01-18 13:03:58 +0000255typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);
256
Igor Sysoev11dbe972004-03-29 17:43:58 +0000257typedef struct {
Igor Sysoev02025fd2005-01-18 13:03:58 +0000258 ngx_temp_file_t *temp_file;
259 ngx_chain_t *bufs;
260 ngx_buf_t *buf;
Igor Sysoev1765f472006-07-07 16:33:19 +0000261 off_t rest;
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +0000262 ngx_chain_t *to_write;
Igor Sysoev02025fd2005-01-18 13:03:58 +0000263 ngx_http_client_body_handler_pt post_handler;
Igor Sysoev11dbe972004-03-29 17:43:58 +0000264} ngx_http_request_body_t;
265
266
Igor Sysoevdd888c42004-09-21 05:38:28 +0000267typedef struct {
Igor Sysoevc1571722005-03-19 12:38:37 +0000268 ngx_http_request_t *request;
Igor Sysoev4624ae72004-09-21 15:47:05 +0000269
Igor Sysoevc1571722005-03-19 12:38:37 +0000270 ngx_buf_t **busy;
271 ngx_int_t nbusy;
Igor Sysoev4624ae72004-09-21 15:47:05 +0000272
Igor Sysoevc1571722005-03-19 12:38:37 +0000273 ngx_buf_t **free;
274 ngx_int_t nfree;
Igor Sysoev4624ae72004-09-21 15:47:05 +0000275
Igor Sysoevc1571722005-03-19 12:38:37 +0000276 ngx_uint_t pipeline; /* unsigned pipeline:1; */
Igor Sysoevdd888c42004-09-21 05:38:28 +0000277} ngx_http_connection_t;
278
279
Igor Sysoev43c3bf42007-08-12 19:48:12 +0000280typedef struct ngx_http_server_name_s ngx_http_server_name_t;
281
282
283typedef struct {
284 ngx_hash_combined_t names;
285
286 ngx_uint_t nregex;
287 ngx_http_server_name_t *regex;
288} ngx_http_virtual_names_t;
Igor Sysoev305a9d82005-12-26 17:07:48 +0000289
290
Igor Sysoev9ac946b2005-10-24 15:09:41 +0000291typedef void (*ngx_http_cleanup_pt)(void *data);
292
293typedef struct ngx_http_cleanup_s ngx_http_cleanup_t;
294
295struct ngx_http_cleanup_s {
Igor Sysoev305a9d82005-12-26 17:07:48 +0000296 ngx_http_cleanup_pt handler;
297 void *data;
298 ngx_http_cleanup_t *next;
Igor Sysoev9ac946b2005-10-24 15:09:41 +0000299};
300
301
Igor Sysoev960100e2006-10-13 15:20:10 +0000302typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
303 void *data, ngx_int_t rc);
304
305typedef struct {
306 ngx_http_post_subrequest_pt handler;
307 void *data;
308} ngx_http_post_subrequest_t;
309
310
Igor Sysoev899b44e2005-05-12 14:58:06 +0000311typedef struct ngx_http_postponed_request_s ngx_http_postponed_request_t;
312
313struct ngx_http_postponed_request_s {
Igor Sysoevb85fd592005-08-23 15:36:54 +0000314 ngx_http_request_t *request;
315 ngx_chain_t *out;
316 ngx_http_postponed_request_t *next;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000317};
318
319
Igor Sysoev2f657222004-06-16 15:32:11 +0000320typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
Igor Sysoev899b44e2005-05-12 14:58:06 +0000321typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);
322
Igor Sysoevb3e73d82003-10-10 15:10:50 +0000323
Igor Sysoeva9830112003-05-19 16:39:14 +0000324struct ngx_http_request_s {
Igor Sysoevc1571722005-03-19 12:38:37 +0000325 uint32_t signature; /* "HTTP" */
Igor Sysoevc83f6832004-06-24 07:53:37 +0000326
Igor Sysoevc1571722005-03-19 12:38:37 +0000327 ngx_connection_t *connection;
Igor Sysoeva9830112003-05-19 16:39:14 +0000328
Igor Sysoevc1571722005-03-19 12:38:37 +0000329 void **ctx;
330 void **main_conf;
331 void **srv_conf;
332 void **loc_conf;
Igor Sysoeva9830112003-05-19 16:39:14 +0000333
Igor Sysoev899b44e2005-05-12 14:58:06 +0000334 ngx_http_event_handler_pt read_event_handler;
335 ngx_http_event_handler_pt write_event_handler;
336
Igor Sysoevc1571722005-03-19 12:38:37 +0000337 ngx_http_cache_t *cache;
Igor Sysoev0e499db2003-11-27 07:45:22 +0000338
Igor Sysoevc1571722005-03-19 12:38:37 +0000339 ngx_http_upstream_t *upstream;
Igor Sysoeve0f86622007-04-18 20:23:19 +0000340 ngx_array_t *upstream_states;
341 /* of ngx_http_upstream_state_t */
Igor Sysoev02025fd2005-01-18 13:03:58 +0000342
Igor Sysoevc1571722005-03-19 12:38:37 +0000343 ngx_pool_t *pool;
344 ngx_buf_t *header_in;
Igor Sysoeva9830112003-05-19 16:39:14 +0000345
Igor Sysoevc1571722005-03-19 12:38:37 +0000346 ngx_http_headers_in_t headers_in;
347 ngx_http_headers_out_t headers_out;
Igor Sysoeva9830112003-05-19 16:39:14 +0000348
Igor Sysoevc1571722005-03-19 12:38:37 +0000349 ngx_http_request_body_t *request_body;
Igor Sysoev11dbe972004-03-29 17:43:58 +0000350
Igor Sysoevc1571722005-03-19 12:38:37 +0000351 time_t lingering_time;
Igor Sysoevb4ccb9f2007-04-21 07:50:19 +0000352 time_t start_sec;
353 ngx_msec_t start_msec;
Igor Sysoeva9830112003-05-19 16:39:14 +0000354
Igor Sysoevc1571722005-03-19 12:38:37 +0000355 ngx_uint_t method;
356 ngx_uint_t http_version;
Igor Sysoev0e5dc5c2005-11-15 13:30:52 +0000357
Igor Sysoevc1571722005-03-19 12:38:37 +0000358 ngx_str_t request_line;
359 ngx_str_t uri;
360 ngx_str_t args;
361 ngx_str_t exten;
362 ngx_str_t unparsed_uri;
Igor Sysoeva9830112003-05-19 16:39:14 +0000363
Igor Sysoevc1571722005-03-19 12:38:37 +0000364 ngx_str_t method_name;
365 ngx_str_t http_protocol;
Igor Sysoev0e5dc5c2005-11-15 13:30:52 +0000366
Igor Sysoev899b44e2005-05-12 14:58:06 +0000367 ngx_chain_t *out;
Igor Sysoevc1571722005-03-19 12:38:37 +0000368 ngx_http_request_t *main;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000369 ngx_http_request_t *parent;
370 ngx_http_postponed_request_t *postponed;
Igor Sysoev960100e2006-10-13 15:20:10 +0000371 ngx_http_post_subrequest_t *post_subrequest;
Igor Sysoeva9830112003-05-19 16:39:14 +0000372
Igor Sysoevc1571722005-03-19 12:38:37 +0000373 uint32_t in_addr;
374 ngx_uint_t port;
375 ngx_str_t *port_text; /* ":80" */
Igor Sysoev305a9d82005-12-26 17:07:48 +0000376 ngx_http_virtual_names_t *virtual_names;
Igor Sysoeva3677242004-04-14 05:57:36 +0000377
Igor Sysoevc1571722005-03-19 12:38:37 +0000378 ngx_int_t phase_handler;
379 ngx_http_handler_pt content_handler;
Igor Sysoev31eb8c02005-09-23 11:02:22 +0000380 ngx_uint_t access_code;
Igor Sysoeva9830112003-05-19 16:39:14 +0000381
Igor Sysoev09c684b2005-11-09 17:25:55 +0000382 ngx_http_variable_value_t *variables;
Igor Sysoeva9830112003-05-19 16:39:14 +0000383
Igor Sysoev5192b362005-07-08 14:34:20 +0000384 size_t limit_rate;
385
Igor Sysoev11dbe972004-03-29 17:43:58 +0000386 /* used to learn the Apache compatible response length without a header */
Igor Sysoevc1571722005-03-19 12:38:37 +0000387 size_t header_size;
Igor Sysoevdc867cd2003-12-14 20:10:27 +0000388
Igor Sysoev1765f472006-07-07 16:33:19 +0000389 off_t request_length;
Igor Sysoev6a12fc92004-12-06 14:45:08 +0000390
Igor Sysoevc1571722005-03-19 12:38:37 +0000391 ngx_uint_t err_status;
Igor Sysoeva9830112003-05-19 16:39:14 +0000392
Igor Sysoevc1571722005-03-19 12:38:37 +0000393 ngx_http_connection_t *http_connection;
Igor Sysoevdd888c42004-09-21 05:38:28 +0000394
Igor Sysoev899b44e2005-05-12 14:58:06 +0000395 ngx_http_log_handler_pt log_handler;
396
Igor Sysoev9ac946b2005-10-24 15:09:41 +0000397 ngx_http_cleanup_t *cleanup;
398
Igor Sysoevc1571722005-03-19 12:38:37 +0000399 unsigned http_state:4;
Igor Sysoev3b30a902003-12-25 20:26:58 +0000400
Igor Sysoev924bd792004-10-11 15:07:03 +0000401 /* URI with "/." and on Win32 with "//" */
Igor Sysoevc1571722005-03-19 12:38:37 +0000402 unsigned complex_uri:1;
Igor Sysoev805d9db2005-02-03 19:33:37 +0000403
Igor Sysoev924bd792004-10-11 15:07:03 +0000404 /* URI with "%" */
Igor Sysoevc1571722005-03-19 12:38:37 +0000405 unsigned quoted_uri:1;
Igor Sysoev805d9db2005-02-03 19:33:37 +0000406
407 /* URI with "+" */
Igor Sysoevc1571722005-03-19 12:38:37 +0000408 unsigned plus_in_uri:1;
Igor Sysoev805d9db2005-02-03 19:33:37 +0000409
Igor Sysoev1ebfead2005-02-16 13:40:36 +0000410 /* URI with "\0" or "%00" */
Igor Sysoevc1571722005-03-19 12:38:37 +0000411 unsigned zero_in_uri:1;
Igor Sysoev1ebfead2005-02-16 13:40:36 +0000412
Igor Sysoev3362b8d2005-05-14 18:42:03 +0000413 unsigned invalid_header:1;
414
Igor Sysoev899b44e2005-05-12 14:58:06 +0000415 unsigned valid_location:1;
Igor Sysoevc04deca2005-03-28 14:43:02 +0000416 unsigned valid_unparsed_uri:1;
Igor Sysoevc1571722005-03-19 12:38:37 +0000417 unsigned uri_changed:1;
418 unsigned uri_changes:4;
Igor Sysoev805d9db2005-02-03 19:33:37 +0000419
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +0000420 unsigned request_body_in_single_buf:1;
421 unsigned request_body_in_file_only:1;
422 unsigned request_body_in_persistent_file:1;
Igor Sysoevcd5b99a2007-01-25 08:45:04 +0000423 unsigned request_body_in_clean_file:1;
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +0000424 unsigned request_body_file_group_access:1;
Igor Sysoev7bdb7202006-04-19 15:30:56 +0000425 unsigned request_body_file_log_level:3;
Igor Sysoev8a2b2fb2006-04-14 09:53:38 +0000426
Igor Sysoevdf3254a2006-01-11 15:26:57 +0000427 unsigned fast_subrequest:1;
Igor Sysoev960100e2006-10-13 15:20:10 +0000428 unsigned subrequest_in_memory:1;
Igor Sysoevdf3254a2006-01-11 15:26:57 +0000429
Igor Sysoevc16b0052007-12-27 14:21:59 +0000430 unsigned gzip:2;
431
Igor Sysoevc1571722005-03-19 12:38:37 +0000432 unsigned proxy:1;
433 unsigned bypass_cache:1;
434 unsigned no_cache:1;
Igor Sysoev65977492003-11-02 22:56:18 +0000435
Igor Sysoev09c684b2005-11-09 17:25:55 +0000436#if (NGX_HTTP_REALIP)
437
438 /*
439 * instead of using the request context data in ngx_http_realip_module
440 * we use the single bit in the request structure
441 */
442 unsigned realip_set:1;
443
444#endif
445
Igor Sysoev6eee8012007-01-07 17:47:17 +0000446 /*
447 * instead of using the request context data in ngx_http_limit_zone_module
448 * we use the single bit in the request structure
449 */
450 unsigned limit_zone_set:1;
451
Igor Sysoev7578ec92003-06-02 15:24:30 +0000452#if 0
Igor Sysoev2d3f3f62007-10-14 18:56:15 +0000453 unsigned cacheable:1;
Igor Sysoeva9830112003-05-19 16:39:14 +0000454#endif
455
Igor Sysoev899b44e2005-05-12 14:58:06 +0000456 unsigned pipeline:1;
Igor Sysoevc1571722005-03-19 12:38:37 +0000457 unsigned plain_http:1;
458 unsigned chunked:1;
459 unsigned header_only:1;
Igor Sysoev8fd830a2006-10-02 10:22:51 +0000460 unsigned zero_body:1;
Igor Sysoevc1571722005-03-19 12:38:37 +0000461 unsigned keepalive:1;
462 unsigned lingering_close:1;
Igor Sysoeve5035392005-08-30 10:55:07 +0000463 unsigned discard_body:1;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000464 unsigned internal:1;
Igor Sysoev3f8dc592006-08-28 16:57:48 +0000465 unsigned error_page:1;
Igor Sysoev6d16e1e2006-04-05 13:40:54 +0000466 unsigned post_action:1;
467 unsigned request_complete:1;
Igor Sysoev8f125582006-07-28 15:16:17 +0000468 unsigned request_output:1;
469 unsigned header_sent:1;
Igor Sysoev899b44e2005-05-12 14:58:06 +0000470 unsigned done:1;
Igor Sysoevb145b062005-06-15 18:33:41 +0000471 unsigned utf8:1;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000472
Igor Sysoev020ffea2006-10-30 20:25:22 +0000473 unsigned buffered:4;
474
Igor Sysoevd52477f2005-05-16 13:53:20 +0000475 unsigned main_filter_need_in_memory:1;
Igor Sysoevc1571722005-03-19 12:38:37 +0000476 unsigned filter_need_in_memory:1;
Igor Sysoevc1571722005-03-19 12:38:37 +0000477 unsigned filter_need_temporary:1;
Igor Sysoevc31a9bb2005-11-26 10:11:11 +0000478 unsigned allow_ranges:1;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000479
Igor Sysoev85cccfb2004-09-15 16:00:43 +0000480#if (NGX_STAT_STUB)
Igor Sysoevc1571722005-03-19 12:38:37 +0000481 unsigned stat_reading:1;
482 unsigned stat_writing:1;
Igor Sysoev85cccfb2004-09-15 16:00:43 +0000483#endif
484
Igor Sysoevef809b82006-06-28 16:00:26 +0000485 unsigned subrequests:8;
486
Igor Sysoev7578ec92003-06-02 15:24:30 +0000487 /* used to parse HTTP headers */
Igor Sysoevc3df7982006-10-12 13:08:26 +0000488
Igor Sysoevc1571722005-03-19 12:38:37 +0000489 ngx_uint_t state;
490 u_char *uri_start;
491 u_char *uri_end;
492 u_char *uri_ext;
493 u_char *args_start;
494 u_char *request_start;
495 u_char *request_end;
496 u_char *method_end;
497 u_char *schema_start;
498 u_char *schema_end;
499 u_char *host_start;
500 u_char *host_end;
501 u_char *port_start;
502 u_char *port_end;
503 u_char *header_name_start;
504 u_char *header_name_end;
505 u_char *header_start;
506 u_char *header_end;
Igor Sysoev3338cfd2006-05-11 14:43:47 +0000507
Igor Sysoevc3df7982006-10-12 13:08:26 +0000508 unsigned http_minor:16;
509 unsigned http_major:16;
510
Igor Sysoev02f742b2005-04-08 15:18:55 +0000511 ngx_uint_t header_hash;
Igor Sysoev3338cfd2006-05-11 14:43:47 +0000512 ngx_uint_t lowcase_index;
513 u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN];
Igor Sysoeva9830112003-05-19 16:39:14 +0000514};
515
516
Igor Sysoev9ac946b2005-10-24 15:09:41 +0000517extern ngx_http_header_t ngx_http_headers_in[];
518extern ngx_http_header_out_t ngx_http_headers_out[];
Igor Sysoevb5faed22003-10-29 08:30:44 +0000519
520
Igor Sysoeva9830112003-05-19 16:39:14 +0000521#endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */