blob: ca03588dd19c83058d8d2c0ca140028dd946bb02 [file] [log] [blame]
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00001#ifndef _NGX_HTTP_H_INCLUDED_
2#define _NGX_HTTP_H_INCLUDED_
3
4
5#include <ngx_config.h>
Igor Sysoevc1817842002-12-27 16:22:50 +00006
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00007#include <ngx_types.h>
Igor Sysoeva0bb31f2002-12-02 16:09:40 +00008#include <ngx_string.h>
9#include <ngx_table.h>
Igor Sysoev016b8522002-08-29 16:59:54 +000010#include <ngx_hunk.h>
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000011#include <ngx_files.h>
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000012#include <ngx_connection.h>
Igor Sysoevc1817842002-12-27 16:22:50 +000013#include <ngx_conf_file.h>
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000014
Igor Sysoevfcce8d52003-01-23 18:47:54 +000015/* STUB */
16#include <ngx_event_timer.h>
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000017
Igor Sysoev6a644c62003-03-04 06:33:48 +000018#define NGX_HTTP_VERSION_9 9
Igor Sysoevb0869052002-12-10 18:05:12 +000019#define NGX_HTTP_VERSION_10 1000
Igor Sysoev6a644c62003-03-04 06:33:48 +000020#define NGX_HTTP_VERSION_11 1001
Igor Sysoevb0869052002-12-10 18:05:12 +000021
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000022#define NGX_HTTP_GET 1
23#define NGX_HTTP_HEAD 2
24#define NGX_HTTP_POST 3
25
26#define NGX_HTTP_CONN_CLOSE 0
27#define NGX_HTTP_CONN_KEEP_ALIVE 1
28
Igor Sysoev016b8522002-08-29 16:59:54 +000029
Igor Sysoeva09f08d2003-04-25 14:43:13 +000030#define NGX_HTTP_PARSE_HEADER_DONE 1
31#define NGX_HTTP_PARSE_INVALID_METHOD 10
32#define NGX_HTTP_PARSE_INVALID_REQUEST 11
33#define NGX_HTTP_PARSE_TOO_LONG_URI 12
34#define NGX_HTTP_PARSE_INVALID_HEAD 13
35#define NGX_HTTP_PARSE_INVALID_HEADER 14
36#define NGX_HTTP_PARSE_TOO_LONG_HEADER 15
37#define NGX_HTTP_PARSE_NO_HOST_HEADER 16
38#define NGX_HTTP_PARSE_INVALID_CL_HEADER 17
Igor Sysoev016b8522002-08-29 16:59:54 +000039
Igor Sysoeve0af1b82002-08-16 15:27:03 +000040
41#define NGX_HTTP_OK 200
Igor Sysoevdc479b42003-03-20 16:09:44 +000042
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000043#define NGX_HTTP_SPECIAL_RESPONSE 300
Igor Sysoev42feecb2002-12-15 06:25:09 +000044#define NGX_HTTP_MOVED_PERMANENTLY 301
45#define NGX_HTTP_MOVED_TEMPORARILY 302
46#define NGX_HTTP_NOT_MODIFIED 304
Igor Sysoevdc479b42003-03-20 16:09:44 +000047
Igor Sysoev016b8522002-08-29 16:59:54 +000048#define NGX_HTTP_BAD_REQUEST 400
Igor Sysoevb2620632003-01-10 06:09:20 +000049#define NGX_HTTP_FORBIDDEN 403
Igor Sysoeve0af1b82002-08-16 15:27:03 +000050#define NGX_HTTP_NOT_FOUND 404
Igor Sysoevdc479b42003-03-20 16:09:44 +000051#define NGX_HTTP_REQUEST_TIME_OUT 408
Igor Sysoev1af7c822002-09-13 14:47:42 +000052#define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
Igor Sysoevdc479b42003-03-20 16:09:44 +000053
Igor Sysoev42feecb2002-12-15 06:25:09 +000054#define NGX_HTTP_INTERNAL_SERVER_ERROR 500
Igor Sysoevb7387572003-03-11 20:38:13 +000055#define NGX_HTTP_NOT_IMPLEMENTED 501
56#define NGX_HTTP_BAD_GATEWAY 502
57#define NGX_HTTP_SERVICE_UNAVAILABLE 503
58#define NGX_HTTP_GATEWAY_TIME_OUT 504
59
Igor Sysoeve0af1b82002-08-16 15:27:03 +000060
61
62#define NGX_HTTP_STATIC_HANDLER 0
63#define NGX_HTTP_DIRECTORY_HANDLER 1
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000064
65
Igor Sysoeve0af1b82002-08-16 15:27:03 +000066typedef struct {
Igor Sysoevdc479b42003-03-20 16:09:44 +000067 ngx_str_t name;
68 int offset;
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000069} ngx_http_header_t;
70
Igor Sysoev42feecb2002-12-15 06:25:09 +000071
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000072typedef struct {
Igor Sysoev73009772003-02-06 17:21:13 +000073 size_t host_name_len;
Igor Sysoeva09f08d2003-04-25 14:43:13 +000074 ssize_t content_length_n;
Igor Sysoeva19a85e2003-01-28 15:56:37 +000075
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000076 ngx_table_elt_t *host;
77 ngx_table_elt_t *connection;
Igor Sysoev42feecb2002-12-15 06:25:09 +000078 ngx_table_elt_t *if_modified_since;
Igor Sysoeva09f08d2003-04-25 14:43:13 +000079 ngx_table_elt_t *content_length;
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000080 ngx_table_elt_t *accept_encoding;
81
Igor Sysoevdc479b42003-03-20 16:09:44 +000082 ngx_table_elt_t *user_agent;
83
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000084 ngx_table_t *headers;
85} ngx_http_headers_in_t;
86
Igor Sysoev42feecb2002-12-15 06:25:09 +000087
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000088typedef struct {
Igor Sysoev1d8d9ee2003-04-28 15:06:39 +000089 ngx_chain_t chain[4];
90 ngx_hunk_t *header_out;
91 ngx_hunk_t *hunk;
92 ngx_hunk_t *file_hunk;
93 ngx_file_t temp_file;
94 ngx_path_t *temp_path;
95 off_t offset;
96 char *header_in_pos;
97} ngx_http_request_body_t;
98
99
100typedef struct {
Igor Sysoevb0869052002-12-10 18:05:12 +0000101 int status;
102 ngx_str_t status_line;
103
104 ngx_table_elt_t *server;
105 ngx_table_elt_t *date;
106 ngx_table_elt_t *content_type;
107 ngx_table_elt_t *location;
108 ngx_table_elt_t *last_modified;
109
110 ngx_table_t *headers;
111
112 off_t content_length;
113 char *charset;
114 char *etag;
115 time_t date_time;
116 time_t last_modified_time;
Igor Sysoev2b542382002-08-20 14:48:28 +0000117} ngx_http_headers_out_t;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000118
Igor Sysoev42feecb2002-12-15 06:25:09 +0000119
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000120typedef struct ngx_http_request_s ngx_http_request_t;
121
122struct ngx_http_request_s {
Igor Sysoevdc479b42003-03-20 16:09:44 +0000123 ngx_connection_t *connection;
Igor Sysoevb0869052002-12-10 18:05:12 +0000124
Igor Sysoevdc479b42003-03-20 16:09:44 +0000125 void **ctx;
126 void **srv_conf;
127 void **loc_conf;
Igor Sysoev96f83772002-09-07 10:14:25 +0000128
Igor Sysoevdc479b42003-03-20 16:09:44 +0000129 ngx_file_t file;
130
Igor Sysoev1d8d9ee2003-04-28 15:06:39 +0000131 ngx_pool_t *pool;
132 ngx_hunk_t *header_in;
133 ngx_http_request_body_t *request_body;
Igor Sysoev016b8522002-08-29 16:59:54 +0000134
Igor Sysoev1d8d9ee2003-04-28 15:06:39 +0000135 ngx_http_headers_in_t headers_in;
136 ngx_http_headers_out_t headers_out;
Igor Sysoeve0af1b82002-08-16 15:27:03 +0000137
Igor Sysoeve0af1b82002-08-16 15:27:03 +0000138 int (*handler)(ngx_http_request_t *r);
139
Igor Sysoev3a40d482002-09-12 14:42:29 +0000140 time_t lingering_time;
141
Igor Sysoevdc479b42003-03-20 16:09:44 +0000142 int method;
143 int http_version;
144 int http_major;
145 int http_minor;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000146
Igor Sysoevdc479b42003-03-20 16:09:44 +0000147 ngx_str_t request_line;
148 ngx_str_t uri;
149 ngx_str_t args;
150 ngx_str_t exten;
151 ngx_http_request_t *main;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000152
Igor Sysoev1b8b1192003-01-29 17:02:48 +0000153 u_int in_addr;
Igor Sysoevfe5cb6b2003-01-29 07:25:51 +0000154
Igor Sysoev1b8b1192003-01-29 17:02:48 +0000155 int port;
156 ngx_str_t port_name;
Igor Sysoev4e5e1172002-08-22 15:24:03 +0000157
Igor Sysoev1b8b1192003-01-29 17:02:48 +0000158 int filter;
159
Igor Sysoev1b8b1192003-01-29 17:02:48 +0000160 char *discarded_buffer;
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000161
Igor Sysoevb2620632003-01-10 06:09:20 +0000162 ngx_str_t path;
Igor Sysoevad22e012003-01-15 07:02:27 +0000163 int path_err;
Igor Sysoevb2620632003-01-10 06:09:20 +0000164
Igor Sysoeve2a31542003-04-08 15:40:10 +0000165 unsigned proxy:1;
Igor Sysoevfd675862003-04-11 16:01:14 +0000166 unsigned cachable:1;
Igor Sysoev3d062ad2003-03-05 06:37:42 +0000167 unsigned pipeline:1;
Igor Sysoev3a40d482002-09-12 14:42:29 +0000168 unsigned keepalive:1;
169 unsigned lingering_close:1;
170
Igor Sysoev682bf8e2002-09-16 15:01:44 +0000171 unsigned header_read:1;
Igor Sysoev9b25d692003-01-26 21:08:14 +0000172 unsigned header_timeout_set:1;
Igor Sysoev1af7c822002-09-13 14:47:42 +0000173
174 unsigned logging:1;
Igor Sysoev016b8522002-08-29 16:59:54 +0000175
Igor Sysoev2b542382002-08-20 14:48:28 +0000176 unsigned header_only:1;
Igor Sysoev2ba1ee02002-10-04 17:58:04 +0000177 unsigned unusual_uri:1; /* URI is not started with '/' - "GET http://" */
Igor Sysoev42feecb2002-12-15 06:25:09 +0000178 unsigned complex_uri:1; /* URI with "/." or with "//" (WIN32) */
Igor Sysoevb2620632003-01-10 06:09:20 +0000179 unsigned path_not_found:1;
Igor Sysoev1e7ec9d2003-02-11 07:14:40 +0000180#ifdef NGX_EVENT
181 unsigned write_level_event:1;
182#endif
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000183
184 int state;
185 char *uri_start;
186 char *uri_end;
187 char *uri_ext;
188 char *args_start;
Igor Sysoev3d062ad2003-03-05 06:37:42 +0000189 char *request_start;
Igor Sysoev2ba1ee02002-10-04 17:58:04 +0000190 char *request_end;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000191 char *header_name_start;
192 char *header_name_end;
193 char *header_start;
194 char *header_end;
195#ifdef NGX_EVENT
196 int (*state_handler)(ngx_http_request_t *r);
197#endif
198};
199
Igor Sysoev42feecb2002-12-15 06:25:09 +0000200
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000201typedef struct {
202 char *action;
203 char *client;
204 char *url;
205} ngx_http_log_ctx_t;
206
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000207
Igor Sysoevb2620632003-01-10 06:09:20 +0000208typedef int (*ngx_http_handler_pt)(ngx_http_request_t *r);
209
Igor Sysoev960ffa42002-12-26 07:24:21 +0000210typedef int (*ngx_http_output_header_filter_p)(ngx_http_request_t *r);
211
212typedef int (*ngx_http_output_body_filter_p)
213 (ngx_http_request_t *r, ngx_chain_t *chain);
214
215
Igor Sysoev960ffa42002-12-26 07:24:21 +0000216#define ngx_http_get_module_ctx(r, module) r->ctx[module.index]
Igor Sysoev96f83772002-09-07 10:14:25 +0000217
Igor Sysoevb7387572003-03-11 20:38:13 +0000218#define ngx_http_create_ctx(r, cx, module, size, error) \
Igor Sysoeve0268b92002-09-11 15:18:33 +0000219 do { \
Igor Sysoevb7387572003-03-11 20:38:13 +0000220 ngx_test_null(cx, ngx_pcalloc(r->pool, size), error); \
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000221 r->ctx[module.index] = cx; \
Igor Sysoeve0268b92002-09-11 15:18:33 +0000222 } while (0)
223
Igor Sysoev96f83772002-09-07 10:14:25 +0000224
225
226/* STUB */
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000227#define NGX_INDEX "index.html"
228
229
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000230/* STUB */
231int ngx_http_init(ngx_pool_t *pool, ngx_log_t *log);
Igor Sysoev42feecb2002-12-15 06:25:09 +0000232/**/
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000233
Igor Sysoev6b863e32003-05-12 15:52:24 +0000234void ngx_http_init_connection(ngx_connection_t *c);
235int ngx_parse_http_request_line(ngx_http_request_t *r);
236int ngx_parse_http_header_line(ngx_http_request_t *r, ngx_hunk_t *h);
Igor Sysoev73009772003-02-06 17:21:13 +0000237int ngx_http_handler(ngx_http_request_t *r);
238
239
Igor Sysoev1d8d9ee2003-04-28 15:06:39 +0000240int ngx_http_init_client_request_body(ngx_http_request_t *r, int size);
241int ngx_http_read_client_request_body(ngx_http_request_t *r);
242int ngx_http_init_client_request_body_chain(ngx_http_request_t *r);
243void ngx_http_reinit_client_request_body_hunks(ngx_http_request_t *r);
244
245
Igor Sysoev73009772003-02-06 17:21:13 +0000246int ngx_http_send_header(ngx_http_request_t *r);
Igor Sysoevdc479b42003-03-20 16:09:44 +0000247int ngx_http_special_response_handler(ngx_http_request_t *r, int error);
Igor Sysoev73009772003-02-06 17:21:13 +0000248
249
250time_t ngx_http_parse_time(char *value, size_t len);
251size_t ngx_http_get_time(char *buf, time_t t);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000252
253
Igor Sysoev42feecb2002-12-15 06:25:09 +0000254int ngx_http_discard_body(ngx_http_request_t *r);
255
256
Igor Sysoev2a2d2b52003-01-30 18:21:39 +0000257
258
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000259extern int ngx_max_module;
260extern ngx_array_t ngx_http_servers;
Igor Sysoeve0268b92002-09-11 15:18:33 +0000261
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000262
263extern int ngx_http_post_accept_timeout;
264extern int ngx_http_connection_pool_size;
265extern int ngx_http_request_pool_size;
266extern int ngx_http_client_header_timeout;
267extern int ngx_http_client_header_buffer_size;
Igor Sysoev6a644c62003-03-04 06:33:48 +0000268extern int ngx_http_large_client_header;
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000269extern int ngx_http_discarded_buffer_size;
270
Igor Sysoev6a644c62003-03-04 06:33:48 +0000271extern int ngx_http_url_in_error_log;
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000272
Igor Sysoevdc479b42003-03-20 16:09:44 +0000273extern ngx_array_t ngx_http_translate_handlers;
Igor Sysoevb2620632003-01-10 06:09:20 +0000274extern ngx_array_t ngx_http_index_handlers;
275
Igor Sysoeve2a31542003-04-08 15:40:10 +0000276extern int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
277extern int (*ngx_http_top_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
278
Igor Sysoevb2620632003-01-10 06:09:20 +0000279
Igor Sysoev73009772003-02-06 17:21:13 +0000280/* STUB */
281int ngx_http_log_handler(ngx_http_request_t *r);
282/**/
283
Igor Sysoeve0268b92002-09-11 15:18:33 +0000284
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000285#endif /* _NGX_HTTP_H_INCLUDED_ */