1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_HTTP_REQUEST_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#define NGX_HTTP_MAX_URI_CHANGES           10
13e18a033bSKonstantin Ananyev#define NGX_HTTP_MAX_SUBREQUESTS           50
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev/* must be 2^n */
16e18a033bSKonstantin Ananyev#define NGX_HTTP_LC_HEADER_LEN             32
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyev#define NGX_HTTP_DISCARD_BUFFER_SIZE       4096
20e18a033bSKonstantin Ananyev#define NGX_HTTP_LINGERING_BUFFER_SIZE     4096
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyev
23e18a033bSKonstantin Ananyev#define NGX_HTTP_VERSION_9                 9
24e18a033bSKonstantin Ananyev#define NGX_HTTP_VERSION_10                1000
25e18a033bSKonstantin Ananyev#define NGX_HTTP_VERSION_11                1001
26e18a033bSKonstantin Ananyev#define NGX_HTTP_VERSION_20                2000
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev#define NGX_HTTP_UNKNOWN                   0x0001
29e18a033bSKonstantin Ananyev#define NGX_HTTP_GET                       0x0002
30e18a033bSKonstantin Ananyev#define NGX_HTTP_HEAD                      0x0004
31e18a033bSKonstantin Ananyev#define NGX_HTTP_POST                      0x0008
32e18a033bSKonstantin Ananyev#define NGX_HTTP_PUT                       0x0010
33e18a033bSKonstantin Ananyev#define NGX_HTTP_DELETE                    0x0020
34e18a033bSKonstantin Ananyev#define NGX_HTTP_MKCOL                     0x0040
35e18a033bSKonstantin Ananyev#define NGX_HTTP_COPY                      0x0080
36e18a033bSKonstantin Ananyev#define NGX_HTTP_MOVE                      0x0100
37e18a033bSKonstantin Ananyev#define NGX_HTTP_OPTIONS                   0x0200
38e18a033bSKonstantin Ananyev#define NGX_HTTP_PROPFIND                  0x0400
39e18a033bSKonstantin Ananyev#define NGX_HTTP_PROPPATCH                 0x0800
40e18a033bSKonstantin Ananyev#define NGX_HTTP_LOCK                      0x1000
41e18a033bSKonstantin Ananyev#define NGX_HTTP_UNLOCK                    0x2000
42e18a033bSKonstantin Ananyev#define NGX_HTTP_PATCH                     0x4000
43e18a033bSKonstantin Ananyev#define NGX_HTTP_TRACE                     0x8000
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev#define NGX_HTTP_CONNECTION_CLOSE          1
46e18a033bSKonstantin Ananyev#define NGX_HTTP_CONNECTION_KEEP_ALIVE     2
47e18a033bSKonstantin Ananyev
48e18a033bSKonstantin Ananyev
49e18a033bSKonstantin Ananyev#define NGX_NONE                           1
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev#define NGX_HTTP_PARSE_HEADER_DONE         1
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyev#define NGX_HTTP_CLIENT_ERROR              10
55e18a033bSKonstantin Ananyev#define NGX_HTTP_PARSE_INVALID_METHOD      10
56e18a033bSKonstantin Ananyev#define NGX_HTTP_PARSE_INVALID_REQUEST     11
57e18a033bSKonstantin Ananyev#define NGX_HTTP_PARSE_INVALID_09_METHOD   12
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev#define NGX_HTTP_PARSE_INVALID_HEADER      13
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev/* unused                                  1 */
63e18a033bSKonstantin Ananyev#define NGX_HTTP_SUBREQUEST_IN_MEMORY      2
64e18a033bSKonstantin Ananyev#define NGX_HTTP_SUBREQUEST_WAITED         4
65e18a033bSKonstantin Ananyev#define NGX_HTTP_SUBREQUEST_CLONE          8
66e18a033bSKonstantin Ananyev
67e18a033bSKonstantin Ananyev#define NGX_HTTP_LOG_UNSAFE                1
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev#define NGX_HTTP_CONTINUE                  100
71e18a033bSKonstantin Ananyev#define NGX_HTTP_SWITCHING_PROTOCOLS       101
72e18a033bSKonstantin Ananyev#define NGX_HTTP_PROCESSING                102
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev#define NGX_HTTP_OK                        200
75e18a033bSKonstantin Ananyev#define NGX_HTTP_CREATED                   201
76e18a033bSKonstantin Ananyev#define NGX_HTTP_ACCEPTED                  202
77e18a033bSKonstantin Ananyev#define NGX_HTTP_NO_CONTENT                204
78e18a033bSKonstantin Ananyev#define NGX_HTTP_PARTIAL_CONTENT           206
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev#define NGX_HTTP_SPECIAL_RESPONSE          300
81e18a033bSKonstantin Ananyev#define NGX_HTTP_MOVED_PERMANENTLY         301
82e18a033bSKonstantin Ananyev#define NGX_HTTP_MOVED_TEMPORARILY         302
83e18a033bSKonstantin Ananyev#define NGX_HTTP_SEE_OTHER                 303
84e18a033bSKonstantin Ananyev#define NGX_HTTP_NOT_MODIFIED              304
85e18a033bSKonstantin Ananyev#define NGX_HTTP_TEMPORARY_REDIRECT        307
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyev#define NGX_HTTP_BAD_REQUEST               400
88e18a033bSKonstantin Ananyev#define NGX_HTTP_UNAUTHORIZED              401
89e18a033bSKonstantin Ananyev#define NGX_HTTP_FORBIDDEN                 403
90e18a033bSKonstantin Ananyev#define NGX_HTTP_NOT_FOUND                 404
91e18a033bSKonstantin Ananyev#define NGX_HTTP_NOT_ALLOWED               405
92e18a033bSKonstantin Ananyev#define NGX_HTTP_REQUEST_TIME_OUT          408
93e18a033bSKonstantin Ananyev#define NGX_HTTP_CONFLICT                  409
94e18a033bSKonstantin Ananyev#define NGX_HTTP_LENGTH_REQUIRED           411
95e18a033bSKonstantin Ananyev#define NGX_HTTP_PRECONDITION_FAILED       412
96e18a033bSKonstantin Ananyev#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE  413
97e18a033bSKonstantin Ananyev#define NGX_HTTP_REQUEST_URI_TOO_LARGE     414
98e18a033bSKonstantin Ananyev#define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE    415
99e18a033bSKonstantin Ananyev#define NGX_HTTP_RANGE_NOT_SATISFIABLE     416
100e18a033bSKonstantin Ananyev#define NGX_HTTP_MISDIRECTED_REQUEST       421
101e18a033bSKonstantin Ananyev#define NGX_HTTP_TOO_MANY_REQUESTS         429
102e18a033bSKonstantin Ananyev
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev/* Our own HTTP codes */
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev/* The special code to close connection without any response */
107e18a033bSKonstantin Ananyev#define NGX_HTTP_CLOSE                     444
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyev#define NGX_HTTP_NGINX_CODES               494
110e18a033bSKonstantin Ananyev
111e18a033bSKonstantin Ananyev#define NGX_HTTP_REQUEST_HEADER_TOO_LARGE  494
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev#define NGX_HTTPS_CERT_ERROR               495
114e18a033bSKonstantin Ananyev#define NGX_HTTPS_NO_CERT                  496
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev/*
117e18a033bSKonstantin Ananyev * We use the special code for the plain HTTP requests that are sent to
118e18a033bSKonstantin Ananyev * HTTPS port to distinguish it from 4XX in an error page redirection
119e18a033bSKonstantin Ananyev */
120e18a033bSKonstantin Ananyev#define NGX_HTTP_TO_HTTPS                  497
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyev/* 498 is the canceled code for the requests with invalid host name */
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev/*
125e18a033bSKonstantin Ananyev * HTTP does not define the code for the case when a client closed
126e18a033bSKonstantin Ananyev * the connection while we are processing its request so we introduce
127e18a033bSKonstantin Ananyev * own code to log such situation when a client has closed the connection
128e18a033bSKonstantin Ananyev * before we even try to send the HTTP header to it
129e18a033bSKonstantin Ananyev */
130e18a033bSKonstantin Ananyev#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499
131e18a033bSKonstantin Ananyev
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev#define NGX_HTTP_INTERNAL_SERVER_ERROR     500
134e18a033bSKonstantin Ananyev#define NGX_HTTP_NOT_IMPLEMENTED           501
135e18a033bSKonstantin Ananyev#define NGX_HTTP_BAD_GATEWAY               502
136e18a033bSKonstantin Ananyev#define NGX_HTTP_SERVICE_UNAVAILABLE       503
137e18a033bSKonstantin Ananyev#define NGX_HTTP_GATEWAY_TIME_OUT          504
138e18a033bSKonstantin Ananyev#define NGX_HTTP_INSUFFICIENT_STORAGE      507
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev
141e18a033bSKonstantin Ananyev#define NGX_HTTP_LOWLEVEL_BUFFERED         0xf0
142e18a033bSKonstantin Ananyev#define NGX_HTTP_WRITE_BUFFERED            0x10
143e18a033bSKonstantin Ananyev#define NGX_HTTP_GZIP_BUFFERED             0x20
144e18a033bSKonstantin Ananyev#define NGX_HTTP_SSI_BUFFERED              0x01
145e18a033bSKonstantin Ananyev#define NGX_HTTP_SUB_BUFFERED              0x02
146e18a033bSKonstantin Ananyev#define NGX_HTTP_COPY_BUFFERED             0x04
147e18a033bSKonstantin Ananyev
148e18a033bSKonstantin Ananyev
149e18a033bSKonstantin Ananyevtypedef enum {
150e18a033bSKonstantin Ananyev    NGX_HTTP_INITING_REQUEST_STATE = 0,
151e18a033bSKonstantin Ananyev    NGX_HTTP_READING_REQUEST_STATE,
152e18a033bSKonstantin Ananyev    NGX_HTTP_PROCESS_REQUEST_STATE,
153e18a033bSKonstantin Ananyev
154e18a033bSKonstantin Ananyev    NGX_HTTP_CONNECT_UPSTREAM_STATE,
155e18a033bSKonstantin Ananyev    NGX_HTTP_WRITING_UPSTREAM_STATE,
156e18a033bSKonstantin Ananyev    NGX_HTTP_READING_UPSTREAM_STATE,
157e18a033bSKonstantin Ananyev
158e18a033bSKonstantin Ananyev    NGX_HTTP_WRITING_REQUEST_STATE,
159e18a033bSKonstantin Ananyev    NGX_HTTP_LINGERING_CLOSE_STATE,
160e18a033bSKonstantin Ananyev    NGX_HTTP_KEEPALIVE_STATE
161e18a033bSKonstantin Ananyev} ngx_http_state_e;
162e18a033bSKonstantin Ananyev
163e18a033bSKonstantin Ananyev
164e18a033bSKonstantin Ananyevtypedef struct {
165e18a033bSKonstantin Ananyev    ngx_str_t                         name;
166e18a033bSKonstantin Ananyev    ngx_uint_t                        offset;
167e18a033bSKonstantin Ananyev    ngx_http_header_handler_pt        handler;
168e18a033bSKonstantin Ananyev} ngx_http_header_t;
169e18a033bSKonstantin Ananyev
170e18a033bSKonstantin Ananyev
171e18a033bSKonstantin Ananyevtypedef struct {
172e18a033bSKonstantin Ananyev    ngx_str_t                         name;
173e18a033bSKonstantin Ananyev    ngx_uint_t                        offset;
174e18a033bSKonstantin Ananyev} ngx_http_header_out_t;
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev
177e18a033bSKonstantin Ananyevtypedef struct {
178e18a033bSKonstantin Ananyev    ngx_list_t                        headers;
179e18a033bSKonstantin Ananyev
180e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *host;
181e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *connection;
182e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *if_modified_since;
183e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *if_unmodified_since;
184e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *if_match;
185e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *if_none_match;
186e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *user_agent;
187e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *referer;
188e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_length;
189e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_range;
190e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_type;
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *range;
193e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *if_range;
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *transfer_encoding;
196e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *expect;
197e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *upgrade;
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev#if (NGX_HTTP_GZIP)
200e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *accept_encoding;
201e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *via;
202e18a033bSKonstantin Ananyev#endif
203e18a033bSKonstantin Ananyev
204e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *authorization;
205e18a033bSKonstantin Ananyev
206e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *keep_alive;
207e18a033bSKonstantin Ananyev
208e18a033bSKonstantin Ananyev#if (NGX_HTTP_X_FORWARDED_FOR)
209e18a033bSKonstantin Ananyev    ngx_array_t                       x_forwarded_for;
210e18a033bSKonstantin Ananyev#endif
211e18a033bSKonstantin Ananyev
212e18a033bSKonstantin Ananyev#if (NGX_HTTP_REALIP)
213e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *x_real_ip;
214e18a033bSKonstantin Ananyev#endif
215e18a033bSKonstantin Ananyev
216e18a033bSKonstantin Ananyev#if (NGX_HTTP_HEADERS)
217e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *accept;
218e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *accept_language;
219e18a033bSKonstantin Ananyev#endif
220e18a033bSKonstantin Ananyev
221e18a033bSKonstantin Ananyev#if (NGX_HTTP_DAV)
222e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *depth;
223e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *destination;
224e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *overwrite;
225e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *date;
226e18a033bSKonstantin Ananyev#endif
227e18a033bSKonstantin Ananyev
228e18a033bSKonstantin Ananyev    ngx_str_t                         user;
229e18a033bSKonstantin Ananyev    ngx_str_t                         passwd;
230e18a033bSKonstantin Ananyev
231e18a033bSKonstantin Ananyev    ngx_array_t                       cookies;
232e18a033bSKonstantin Ananyev
233e18a033bSKonstantin Ananyev    ngx_str_t                         server;
234e18a033bSKonstantin Ananyev    off_t                             content_length_n;
235e18a033bSKonstantin Ananyev    time_t                            keep_alive_n;
236e18a033bSKonstantin Ananyev
237e18a033bSKonstantin Ananyev    unsigned                          connection_type:2;
238e18a033bSKonstantin Ananyev    unsigned                          chunked:1;
239e18a033bSKonstantin Ananyev    unsigned                          msie:1;
240e18a033bSKonstantin Ananyev    unsigned                          msie6:1;
241e18a033bSKonstantin Ananyev    unsigned                          opera:1;
242e18a033bSKonstantin Ananyev    unsigned                          gecko:1;
243e18a033bSKonstantin Ananyev    unsigned                          chrome:1;
244e18a033bSKonstantin Ananyev    unsigned                          safari:1;
245e18a033bSKonstantin Ananyev    unsigned                          konqueror:1;
246e18a033bSKonstantin Ananyev} ngx_http_headers_in_t;
247e18a033bSKonstantin Ananyev
248e18a033bSKonstantin Ananyev
249e18a033bSKonstantin Ananyevtypedef struct {
250e18a033bSKonstantin Ananyev    ngx_list_t                        headers;
251e18a033bSKonstantin Ananyev
252e18a033bSKonstantin Ananyev    ngx_uint_t                        status;
253e18a033bSKonstantin Ananyev    ngx_str_t                         status_line;
254e18a033bSKonstantin Ananyev
255e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *server;
256e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *date;
257e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_length;
258e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_encoding;
259e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *location;
260e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *refresh;
261e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *last_modified;
262e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *content_range;
263e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *accept_ranges;
264e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *www_authenticate;
265e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *expires;
266e18a033bSKonstantin Ananyev    ngx_table_elt_t                  *etag;
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyev    ngx_str_t                        *override_charset;
269e18a033bSKonstantin Ananyev
270e18a033bSKonstantin Ananyev    size_t                            content_type_len;
271e18a033bSKonstantin Ananyev    ngx_str_t                         content_type;
272e18a033bSKonstantin Ananyev    ngx_str_t                         charset;
273e18a033bSKonstantin Ananyev    u_char                           *content_type_lowcase;
274e18a033bSKonstantin Ananyev    ngx_uint_t                        content_type_hash;
275e18a033bSKonstantin Ananyev
276e18a033bSKonstantin Ananyev    ngx_array_t                       cache_control;
277e18a033bSKonstantin Ananyev
278e18a033bSKonstantin Ananyev    off_t                             content_length_n;
279e18a033bSKonstantin Ananyev    off_t                             content_offset;
280e18a033bSKonstantin Ananyev    time_t                            date_time;
281e18a033bSKonstantin Ananyev    time_t                            last_modified_time;
282e18a033bSKonstantin Ananyev} ngx_http_headers_out_t;
283e18a033bSKonstantin Ananyev
284e18a033bSKonstantin Ananyev
285e18a033bSKonstantin Ananyevtypedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);
286e18a033bSKonstantin Ananyev
287e18a033bSKonstantin Ananyevtypedef struct {
288e18a033bSKonstantin Ananyev    ngx_temp_file_t                  *temp_file;
289e18a033bSKonstantin Ananyev    ngx_chain_t                      *bufs;
290e18a033bSKonstantin Ananyev    ngx_buf_t                        *buf;
291e18a033bSKonstantin Ananyev    off_t                             rest;
292e18a033bSKonstantin Ananyev    off_t                             received;
293e18a033bSKonstantin Ananyev    ngx_chain_t                      *free;
294e18a033bSKonstantin Ananyev    ngx_chain_t                      *busy;
295e18a033bSKonstantin Ananyev    ngx_http_chunked_t               *chunked;
296e18a033bSKonstantin Ananyev    ngx_http_client_body_handler_pt   post_handler;
297e18a033bSKonstantin Ananyev} ngx_http_request_body_t;
298e18a033bSKonstantin Ananyev
299e18a033bSKonstantin Ananyev
300e18a033bSKonstantin Ananyevtypedef struct ngx_http_addr_conf_s  ngx_http_addr_conf_t;
301e18a033bSKonstantin Ananyev
302e18a033bSKonstantin Ananyevtypedef struct {
303e18a033bSKonstantin Ananyev    ngx_http_addr_conf_t             *addr_conf;
304e18a033bSKonstantin Ananyev    ngx_http_conf_ctx_t              *conf_ctx;
305e18a033bSKonstantin Ananyev
306e18a033bSKonstantin Ananyev#if (NGX_HTTP_SSL || NGX_COMPAT)
307e18a033bSKonstantin Ananyev    ngx_str_t                        *ssl_servername;
308e18a033bSKonstantin Ananyev#if (NGX_PCRE)
309e18a033bSKonstantin Ananyev    ngx_http_regex_t                 *ssl_servername_regex;
310e18a033bSKonstantin Ananyev#endif
311e18a033bSKonstantin Ananyev#endif
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev    ngx_chain_t                      *busy;
314e18a033bSKonstantin Ananyev    ngx_int_t                         nbusy;
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev    ngx_chain_t                      *free;
317e18a033bSKonstantin Ananyev
318e18a033bSKonstantin Ananyev    unsigned                          ssl:1;
319e18a033bSKonstantin Ananyev    unsigned                          proxy_protocol:1;
320e18a033bSKonstantin Ananyev} ngx_http_connection_t;
321e18a033bSKonstantin Ananyev
322e18a033bSKonstantin Ananyev
323e18a033bSKonstantin Ananyevtypedef void (*ngx_http_cleanup_pt)(void *data);
324e18a033bSKonstantin Ananyev
325e18a033bSKonstantin Ananyevtypedef struct ngx_http_cleanup_s  ngx_http_cleanup_t;
326e18a033bSKonstantin Ananyev
327e18a033bSKonstantin Ananyevstruct ngx_http_cleanup_s {
328e18a033bSKonstantin Ananyev    ngx_http_cleanup_pt               handler;
329e18a033bSKonstantin Ananyev    void                             *data;
330e18a033bSKonstantin Ananyev    ngx_http_cleanup_t               *next;
331e18a033bSKonstantin Ananyev};
332e18a033bSKonstantin Ananyev
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
335e18a033bSKonstantin Ananyev    void *data, ngx_int_t rc);
336e18a033bSKonstantin Ananyev
337e18a033bSKonstantin Ananyevtypedef struct {
338e18a033bSKonstantin Ananyev    ngx_http_post_subrequest_pt       handler;
339e18a033bSKonstantin Ananyev    void                             *data;
340e18a033bSKonstantin Ananyev} ngx_http_post_subrequest_t;
341e18a033bSKonstantin Ananyev
342e18a033bSKonstantin Ananyev
343e18a033bSKonstantin Ananyevtypedef struct ngx_http_postponed_request_s  ngx_http_postponed_request_t;
344e18a033bSKonstantin Ananyev
345e18a033bSKonstantin Ananyevstruct ngx_http_postponed_request_s {
346e18a033bSKonstantin Ananyev    ngx_http_request_t               *request;
347e18a033bSKonstantin Ananyev    ngx_chain_t                      *out;
348e18a033bSKonstantin Ananyev    ngx_http_postponed_request_t     *next;
349e18a033bSKonstantin Ananyev};
350e18a033bSKonstantin Ananyev
351e18a033bSKonstantin Ananyev
352e18a033bSKonstantin Ananyevtypedef struct ngx_http_posted_request_s  ngx_http_posted_request_t;
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyevstruct ngx_http_posted_request_s {
355e18a033bSKonstantin Ananyev    ngx_http_request_t               *request;
356e18a033bSKonstantin Ananyev    ngx_http_posted_request_t        *next;
357e18a033bSKonstantin Ananyev};
358e18a033bSKonstantin Ananyev
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
361e18a033bSKonstantin Ananyevtypedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);
362e18a033bSKonstantin Ananyev
363e18a033bSKonstantin Ananyev
364e18a033bSKonstantin Ananyevstruct ngx_http_request_s {
365e18a033bSKonstantin Ananyev    uint32_t                          signature;         /* "HTTP" */
366e18a033bSKonstantin Ananyev
367e18a033bSKonstantin Ananyev    ngx_connection_t                 *connection;
368e18a033bSKonstantin Ananyev
369e18a033bSKonstantin Ananyev    void                            **ctx;
370e18a033bSKonstantin Ananyev    void                            **main_conf;
371e18a033bSKonstantin Ananyev    void                            **srv_conf;
372e18a033bSKonstantin Ananyev    void                            **loc_conf;
373e18a033bSKonstantin Ananyev
374e18a033bSKonstantin Ananyev    ngx_http_event_handler_pt         read_event_handler;
375e18a033bSKonstantin Ananyev    ngx_http_event_handler_pt         write_event_handler;
376e18a033bSKonstantin Ananyev
377e18a033bSKonstantin Ananyev#if (NGX_HTTP_CACHE)
378e18a033bSKonstantin Ananyev    ngx_http_cache_t                 *cache;
379e18a033bSKonstantin Ananyev#endif
380e18a033bSKonstantin Ananyev
381e18a033bSKonstantin Ananyev    ngx_http_upstream_t              *upstream;
382e18a033bSKonstantin Ananyev    ngx_array_t                      *upstream_states;
383e18a033bSKonstantin Ananyev                                         /* of ngx_http_upstream_state_t */
384e18a033bSKonstantin Ananyev
385e18a033bSKonstantin Ananyev    ngx_pool_t                       *pool;
386e18a033bSKonstantin Ananyev    ngx_buf_t                        *header_in;
387e18a033bSKonstantin Ananyev
388e18a033bSKonstantin Ananyev    ngx_http_headers_in_t             headers_in;
389e18a033bSKonstantin Ananyev    ngx_http_headers_out_t            headers_out;
390e18a033bSKonstantin Ananyev
391e18a033bSKonstantin Ananyev    ngx_http_request_body_t          *request_body;
392e18a033bSKonstantin Ananyev
393e18a033bSKonstantin Ananyev    time_t                            lingering_time;
394e18a033bSKonstantin Ananyev    time_t                            start_sec;
395e18a033bSKonstantin Ananyev    ngx_msec_t                        start_msec;
396e18a033bSKonstantin Ananyev
397e18a033bSKonstantin Ananyev    ngx_uint_t                        method;
398e18a033bSKonstantin Ananyev    ngx_uint_t                        http_version;
399e18a033bSKonstantin Ananyev
400e18a033bSKonstantin Ananyev    ngx_str_t                         request_line;
401e18a033bSKonstantin Ananyev    ngx_str_t                         uri;
402e18a033bSKonstantin Ananyev    ngx_str_t                         args;
403e18a033bSKonstantin Ananyev    ngx_str_t                         exten;
404e18a033bSKonstantin Ananyev    ngx_str_t                         unparsed_uri;
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev    ngx_str_t                         method_name;
407e18a033bSKonstantin Ananyev    ngx_str_t                         http_protocol;
408e18a033bSKonstantin Ananyev
409e18a033bSKonstantin Ananyev    ngx_chain_t                      *out;
410e18a033bSKonstantin Ananyev    ngx_http_request_t               *main;
411e18a033bSKonstantin Ananyev    ngx_http_request_t               *parent;
412e18a033bSKonstantin Ananyev    ngx_http_postponed_request_t     *postponed;
413