blob: 82e8bf79b7b6d0939e90e598d787a5d387d2694c [file] [log] [blame]
Igor Sysoeva9830112003-05-19 16:39:14 +00001#ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
2#define _NGX_HTTP_REQUEST_H_INCLUDED_
3
4
Igor Sysoeva9830112003-05-19 16:39:14 +00005#define NGX_HTTP_VERSION_9 9
6#define NGX_HTTP_VERSION_10 1000
7#define NGX_HTTP_VERSION_11 1001
8
9#define NGX_HTTP_GET 1
10#define NGX_HTTP_HEAD 2
11#define NGX_HTTP_POST 3
12
Igor Sysoev419f9ac2003-10-21 16:49:56 +000013#define NGX_HTTP_CONNECTION_CLOSE 1
14#define NGX_HTTP_CONNECTION_KEEP_ALIVE 2
Igor Sysoeva9830112003-05-19 16:39:14 +000015
16
Igor Sysoev419f9ac2003-10-21 16:49:56 +000017#define NGX_NONE 1
Igor Sysoev3ae32482003-10-08 15:32:54 +000018
19
Igor Sysoeva9830112003-05-19 16:39:14 +000020#define NGX_HTTP_PARSE_HEADER_DONE 1
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000021
22#define NGX_HTTP_CLIENT_ERROR 10
Igor Sysoeva9830112003-05-19 16:39:14 +000023#define NGX_HTTP_PARSE_INVALID_METHOD 10
24#define NGX_HTTP_PARSE_INVALID_REQUEST 11
25#define NGX_HTTP_PARSE_TOO_LONG_URI 12
26#define NGX_HTTP_PARSE_INVALID_09_METHOD 13
Igor Sysoev10fc9ef2003-10-27 08:53:49 +000027
28#define NGX_HTTP_PARSE_HEADER_ERROR 14
Igor Sysoeva9830112003-05-19 16:39:14 +000029#define NGX_HTTP_PARSE_INVALID_HEADER 14
30#define NGX_HTTP_PARSE_TOO_LONG_HEADER 15
31#define NGX_HTTP_PARSE_NO_HOST_HEADER 16
32#define NGX_HTTP_PARSE_INVALID_CL_HEADER 17
33
34
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000035#define NGX_HTTP_OK 200
36#define NGX_HTTP_PARTIAL_CONTENT 206
Igor Sysoeva9830112003-05-19 16:39:14 +000037
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000038#define NGX_HTTP_SPECIAL_RESPONSE 300
39#define NGX_HTTP_MOVED_PERMANENTLY 301
40#define NGX_HTTP_MOVED_TEMPORARILY 302
41#define NGX_HTTP_NOT_MODIFIED 304
Igor Sysoeva9830112003-05-19 16:39:14 +000042
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000043#define NGX_HTTP_BAD_REQUEST 400
44#define NGX_HTTP_FORBIDDEN 403
45#define NGX_HTTP_NOT_FOUND 404
46#define NGX_HTTP_NOT_ALLOWED 405
47#define NGX_HTTP_REQUEST_TIME_OUT 408
48#define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE 413
49#define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
50#define NGX_HTTP_RANGE_NOT_SATISFIABLE 416
Igor Sysoeva9830112003-05-19 16:39:14 +000051
Igor Sysoev222a2ad2003-11-18 16:49:00 +000052/*
53 * HTTP does not define a code for the case when a client closed a connection
Igor Sysoev1b138ed2003-11-18 21:34:08 +000054 * while we are processing request so we introduce own code to log such
55 * situation when client has closed a connection before we even try to
56 * send HTTP header to it
Igor Sysoev222a2ad2003-11-18 16:49:00 +000057 */
Igor Sysoev1b138ed2003-11-18 21:34:08 +000058#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
Igor Sysoev222a2ad2003-11-18 16:49:00 +000059
Igor Sysoev2b0c76c2003-10-27 21:01:00 +000060#define NGX_HTTP_INTERNAL_SERVER_ERROR 500
61#define NGX_HTTP_NOT_IMPLEMENTED 501
62#define NGX_HTTP_BAD_GATEWAY 502
63#define NGX_HTTP_SERVICE_UNAVAILABLE 503
64#define NGX_HTTP_GATEWAY_TIME_OUT 504
Igor Sysoeva9830112003-05-19 16:39:14 +000065
66
67
68#define NGX_HTTP_STATIC_HANDLER 0
69#define NGX_HTTP_DIRECTORY_HANDLER 1
70
71
72typedef struct {
73 ngx_str_t name;
74 int offset;
75} ngx_http_header_t;
76
77
78typedef struct {
Igor Sysoevb5faed22003-10-29 08:30:44 +000079 ngx_table_t *headers; /* it must be first field */
80
Igor Sysoeva9830112003-05-19 16:39:14 +000081 ngx_table_elt_t *host;
82 ngx_table_elt_t *connection;
83 ngx_table_elt_t *if_modified_since;
Igor Sysoevdc9dd432003-10-22 16:38:26 +000084 ngx_table_elt_t *user_agent;
Igor Sysoev74e95c22003-11-09 20:03:38 +000085 ngx_table_elt_t *referer;
Igor Sysoevdc9dd432003-10-22 16:38:26 +000086
Igor Sysoeva9830112003-05-19 16:39:14 +000087 ngx_table_elt_t *content_length;
Igor Sysoevdc9dd432003-10-22 16:38:26 +000088 ngx_table_elt_t *accept_encoding;
Igor Sysoev7578ec92003-06-02 15:24:30 +000089 ngx_table_elt_t *range;
90
Igor Sysoevcf80a702003-11-03 22:20:44 +000091 ngx_table_elt_t *authorization;
92
Igor Sysoev54276be2003-10-20 17:14:07 +000093 ngx_table_elt_t *keep_alive;
Igor Sysoeva9830112003-05-19 16:39:14 +000094
Igor Sysoev419f9ac2003-10-21 16:49:56 +000095 size_t host_name_len;
96 ssize_t content_length_n;
97 size_t connection_type;
98 ssize_t keep_alive_n;
Igor Sysoeva9830112003-05-19 16:39:14 +000099} ngx_http_headers_in_t;
100
101
102typedef struct {
103 ngx_chain_t chain[4];
104 ngx_hunk_t *header_out;
105 ngx_hunk_t *hunk;
106 ngx_hunk_t *file_hunk;
107 ngx_file_t temp_file;
108 ngx_path_t *temp_path;
109 off_t offset;
110 char *header_in_pos;
111} ngx_http_request_body_t;
112
113
114typedef struct {
Igor Sysoev7578ec92003-06-02 15:24:30 +0000115 off_t start;
116 off_t end;
117 ngx_str_t content_range;
118} ngx_http_range_t;
119
120
121typedef struct {
Igor Sysoevb5faed22003-10-29 08:30:44 +0000122 ngx_table_t *headers; /* it must be first field */
123
Igor Sysoeva9830112003-05-19 16:39:14 +0000124 int status;
125 ngx_str_t status_line;
126
127 ngx_table_elt_t *server;
128 ngx_table_elt_t *date;
129 ngx_table_elt_t *content_type;
Igor Sysoev419f9ac2003-10-21 16:49:56 +0000130 ngx_table_elt_t *content_length;
Igor Sysoev2cdd7e92003-09-28 19:29:06 +0000131 ngx_table_elt_t *content_encoding;
Igor Sysoeva9830112003-05-19 16:39:14 +0000132 ngx_table_elt_t *location;
133 ngx_table_elt_t *last_modified;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000134 ngx_table_elt_t *content_range;
Igor Sysoev87a01ea2003-10-02 05:39:37 +0000135 ngx_table_elt_t *accept_ranges;
Igor Sysoev7578ec92003-06-02 15:24:30 +0000136
137 ngx_str_t charset;
138 ngx_array_t ranges;
Igor Sysoeva9830112003-05-19 16:39:14 +0000139
Igor Sysoev419f9ac2003-10-21 16:49:56 +0000140 off_t content_length_n;
Igor Sysoeva9830112003-05-19 16:39:14 +0000141 char *etag;
142 time_t date_time;
143 time_t last_modified_time;
144} ngx_http_headers_out_t;
145
146
Igor Sysoev865c1502003-11-30 20:03:18 +0000147struct ngx_http_cleanup_s {
Igor Sysoevc2bba092003-11-28 17:41:47 +0000148 union {
149 struct {
150 ngx_fd_t fd;
151 char *name;
152 } file;
153
154 struct {
155 ngx_http_cache_hash_t *hash;
156 ngx_http_cache_t *cache;
157 } cache;
158 } data;
159
Igor Sysoev865c1502003-11-30 20:03:18 +0000160 unsigned valid:1;
Igor Sysoevc2bba092003-11-28 17:41:47 +0000161 unsigned cache:1;
Igor Sysoev865c1502003-11-30 20:03:18 +0000162};
Igor Sysoevc2bba092003-11-28 17:41:47 +0000163
164
Igor Sysoevb3e73d82003-10-10 15:10:50 +0000165typedef int (*ngx_http_handler_pt)(ngx_http_request_t *r);
166
Igor Sysoeva9830112003-05-19 16:39:14 +0000167struct ngx_http_request_s {
Igor Sysoevc2bba092003-11-28 17:41:47 +0000168 ngx_connection_t *connection;
Igor Sysoeva9830112003-05-19 16:39:14 +0000169
Igor Sysoevc2bba092003-11-28 17:41:47 +0000170 void **ctx;
171 void **main_conf;
172 void **srv_conf;
173 void **loc_conf;
Igor Sysoeva9830112003-05-19 16:39:14 +0000174
Igor Sysoevc2bba092003-11-28 17:41:47 +0000175 ngx_http_cache_t *cache;
Igor Sysoev0e499db2003-11-27 07:45:22 +0000176
Igor Sysoeva9830112003-05-19 16:39:14 +0000177 ngx_file_t file;
178
179 ngx_pool_t *pool;
180 ngx_hunk_t *header_in;
181 ngx_http_request_body_t *request_body;
182
183 ngx_http_headers_in_t headers_in;
184 ngx_http_headers_out_t headers_out;
185
Igor Sysoev7578ec92003-06-02 15:24:30 +0000186 time_t lingering_time;
Igor Sysoeva9830112003-05-19 16:39:14 +0000187
188 int method;
189 int http_version;
190 int http_major;
191 int http_minor;
192
193 ngx_str_t request_line;
194 ngx_str_t uri;
195 ngx_str_t args;
196 ngx_str_t exten;
197 ngx_str_t unparsed_uri;
198
199 ngx_http_request_t *main;
200
Igor Sysoev6253ca12003-05-27 12:18:54 +0000201 u_int in_addr;
202 int port;
203 ngx_str_t *port_name; /* ":80" */
204 ngx_str_t *server_name;
205 ngx_array_t *virtual_names;
Igor Sysoeva9830112003-05-19 16:39:14 +0000206
Igor Sysoevb3e73d82003-10-10 15:10:50 +0000207 int phase;
208 int phase_handler;
209 ngx_http_handler_pt content_handler;
Igor Sysoeva9830112003-05-19 16:39:14 +0000210
Igor Sysoev10fc9ef2003-10-27 08:53:49 +0000211 ngx_temp_file_t *temp_file;
212 ngx_chain_t *request_hunks;
213 ngx_hunk_t *request_body_hunk;
214 int request_body_len;
215 void (*request_body_handler) (void *data);
216 void *data;
217
Igor Sysoevc2bba092003-11-28 17:41:47 +0000218 ngx_array_t cleanup;
219
Igor Sysoev7578ec92003-06-02 15:24:30 +0000220 char *discarded_buffer;
Igor Sysoevd59a0472003-11-10 21:09:22 +0000221 void **err_ctx;
222 int err_status;
Igor Sysoeva9830112003-05-19 16:39:14 +0000223
Igor Sysoev7578ec92003-06-02 15:24:30 +0000224 /* URI is not started with '/' - "GET http://" */
225 unsigned unusual_uri:1;
226 /* URI with "/.", "%" and on Win32 with "//" */
227 unsigned complex_uri:1;
228 unsigned header_timeout_set:1;
Igor Sysoeva9830112003-05-19 16:39:14 +0000229
Igor Sysoev7578ec92003-06-02 15:24:30 +0000230 unsigned proxy:1;
Igor Sysoev65977492003-11-02 22:56:18 +0000231 unsigned bypass_cache:1;
Igor Sysoevcf80a702003-11-03 22:20:44 +0000232 unsigned no_cache:1;
Igor Sysoev65977492003-11-02 22:56:18 +0000233
Igor Sysoev7578ec92003-06-02 15:24:30 +0000234#if 0
235 unsigned cachable:1;
Igor Sysoeva9830112003-05-19 16:39:14 +0000236#endif
Igor Sysoev7578ec92003-06-02 15:24:30 +0000237 unsigned pipeline:1;
Igor Sysoeva9830112003-05-19 16:39:14 +0000238
Igor Sysoev5bf3d252003-10-22 07:05:29 +0000239 /* can we use sendfile ? */
240 unsigned sendfile:1;
241
Igor Sysoev7578ec92003-06-02 15:24:30 +0000242 unsigned chunked:1;
243 unsigned header_only:1;
244 unsigned keepalive:1;
245 unsigned lingering_close:1;
Igor Sysoev10fc9ef2003-10-27 08:53:49 +0000246#if 0
Igor Sysoevb3e73d82003-10-10 15:10:50 +0000247 unsigned closed:1;
Igor Sysoev10fc9ef2003-10-27 08:53:49 +0000248#endif
Igor Sysoev7578ec92003-06-02 15:24:30 +0000249
250 /* TODO: use filter or bits ???? */
251 int filter;
252
253 /* used to parse HTTP headers */
254 int state;
255 char *uri_start;
256 char *uri_end;
257 char *uri_ext;
258 char *args_start;
259 char *request_start;
260 char *request_end;
261 char *header_name_start;
262 char *header_name_end;
263 char *header_start;
264 char *header_end;
Igor Sysoeva9830112003-05-19 16:39:14 +0000265};
266
267
Igor Sysoevb5faed22003-10-29 08:30:44 +0000268extern ngx_http_header_t ngx_http_headers_in[];
269extern ngx_http_header_t ngx_http_headers_out[];
270
271
272
Igor Sysoeva9830112003-05-19 16:39:14 +0000273#endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */