blob: 8d0596ab4d1b81eee868cd60eb69c053f04598ca [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 Sysoevb0869052002-12-10 18:05:12 +000018#define NGX_HTTP_VERSION_10 1000
19
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000020#define NGX_HTTP_GET 1
21#define NGX_HTTP_HEAD 2
22#define NGX_HTTP_POST 3
23
24#define NGX_HTTP_CONN_CLOSE 0
25#define NGX_HTTP_CONN_KEEP_ALIVE 1
26
Igor Sysoev016b8522002-08-29 16:59:54 +000027
Igor Sysoev1af7c822002-09-13 14:47:42 +000028#define NGX_HTTP_PARSE_HEADER_DONE 1
29#define NGX_HTTP_PARSE_INVALID_METHOD 10
30#define NGX_HTTP_PARSE_INVALID_REQUEST 11
31#define NGX_HTTP_PARSE_TOO_LONG_URI 12
32#define NGX_HTTP_PARSE_INVALID_HEAD 13
33#define NGX_HTTP_PARSE_INVALID_HEADER 14
Igor Sysoev016b8522002-08-29 16:59:54 +000034
Igor Sysoeve0af1b82002-08-16 15:27:03 +000035
36#define NGX_HTTP_OK 200
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000037#define NGX_HTTP_SPECIAL_RESPONSE 300
Igor Sysoev42feecb2002-12-15 06:25:09 +000038#define NGX_HTTP_MOVED_PERMANENTLY 301
39#define NGX_HTTP_MOVED_TEMPORARILY 302
40#define NGX_HTTP_NOT_MODIFIED 304
Igor Sysoev016b8522002-08-29 16:59:54 +000041#define NGX_HTTP_BAD_REQUEST 400
Igor Sysoevb2620632003-01-10 06:09:20 +000042#define NGX_HTTP_FORBIDDEN 403
Igor Sysoeve0af1b82002-08-16 15:27:03 +000043#define NGX_HTTP_NOT_FOUND 404
Igor Sysoev1af7c822002-09-13 14:47:42 +000044#define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
Igor Sysoev42feecb2002-12-15 06:25:09 +000045#define NGX_HTTP_INTERNAL_SERVER_ERROR 500
Igor Sysoeve0af1b82002-08-16 15:27:03 +000046
47
48#define NGX_HTTP_STATIC_HANDLER 0
49#define NGX_HTTP_DIRECTORY_HANDLER 1
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000050
51
Igor Sysoev0c331d92002-08-15 17:20:26 +000052
53typedef struct {
Igor Sysoev016b8522002-08-29 16:59:54 +000054 char *doc_root;
55 size_t doc_root_len;
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000056
Igor Sysoev682bf8e2002-09-16 15:01:44 +000057 size_t connection_pool_size;
Igor Sysoeva58e3ca2002-09-02 14:48:24 +000058 size_t request_pool_size;
59
60 size_t header_buffer_size;
61 size_t discarded_buffer_size;
Igor Sysoev016b8522002-08-29 16:59:54 +000062
Igor Sysoev682bf8e2002-09-16 15:01:44 +000063 ngx_msec_t header_timeout;
64 ngx_msec_t lingering_timeout;
65 time_t lingering_time;
Igor Sysoeve0af1b82002-08-16 15:27:03 +000066} ngx_http_server_t;
67
Igor Sysoev42feecb2002-12-15 06:25:09 +000068
Igor Sysoeve0af1b82002-08-16 15:27:03 +000069typedef struct {
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000070 int len;
71 char *data;
72 int offset;
73} ngx_http_header_t;
74
Igor Sysoev42feecb2002-12-15 06:25:09 +000075
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000076typedef struct {
77 ngx_table_elt_t *host;
78 ngx_table_elt_t *connection;
Igor Sysoev42feecb2002-12-15 06:25:09 +000079 ngx_table_elt_t *if_modified_since;
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000080 ngx_table_elt_t *user_agent;
81 ngx_table_elt_t *accept_encoding;
82
83 ngx_table_t *headers;
84} ngx_http_headers_in_t;
85
Igor Sysoev42feecb2002-12-15 06:25:09 +000086
Igor Sysoeva0bb31f2002-12-02 16:09:40 +000087typedef struct {
Igor Sysoevb0869052002-12-10 18:05:12 +000088 int status;
89 ngx_str_t status_line;
90
91 ngx_table_elt_t *server;
92 ngx_table_elt_t *date;
93 ngx_table_elt_t *content_type;
94 ngx_table_elt_t *location;
95 ngx_table_elt_t *last_modified;
96
97 ngx_table_t *headers;
98
99 off_t content_length;
100 char *charset;
101 char *etag;
102 time_t date_time;
103 time_t last_modified_time;
Igor Sysoev2b542382002-08-20 14:48:28 +0000104} ngx_http_headers_out_t;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000105
Igor Sysoev42feecb2002-12-15 06:25:09 +0000106
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000107typedef struct ngx_http_request_s ngx_http_request_t;
108
109struct ngx_http_request_s {
Igor Sysoev42feecb2002-12-15 06:25:09 +0000110 ngx_file_t file;
Igor Sysoevb0869052002-12-10 18:05:12 +0000111
Igor Sysoev96f83772002-09-07 10:14:25 +0000112 void **ctx;
Igor Sysoev96f83772002-09-07 10:14:25 +0000113 void **srv_conf;
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000114 void **loc_conf;
Igor Sysoev96f83772002-09-07 10:14:25 +0000115
Igor Sysoev016b8522002-08-29 16:59:54 +0000116 ngx_pool_t *pool;
117 ngx_hunk_t *header_in;
118
Igor Sysoeva0bb31f2002-12-02 16:09:40 +0000119 ngx_http_headers_in_t headers_in;
120 ngx_http_headers_out_t headers_out;
Igor Sysoeve0af1b82002-08-16 15:27:03 +0000121
Igor Sysoeve0af1b82002-08-16 15:27:03 +0000122 int (*handler)(ngx_http_request_t *r);
123
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000124 int method;
125
Igor Sysoev3a40d482002-09-12 14:42:29 +0000126 time_t lingering_time;
127
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000128 int http_version;
129 int http_major;
130 int http_minor;
131
Igor Sysoev2d0d9092002-12-03 15:45:38 +0000132 ngx_str_t request_line;
Igor Sysoevb0869052002-12-10 18:05:12 +0000133 ngx_str_t uri;
134 ngx_str_t exten;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000135 ngx_http_request_t *main;
136
Igor Sysoeve0af1b82002-08-16 15:27:03 +0000137 ngx_connection_t *connection;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000138
Igor Sysoev4e5e1172002-08-22 15:24:03 +0000139 int filter;
140
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000141 ssize_t client_content_length;
142 char *discarded_buffer;
143
Igor Sysoevb2620632003-01-10 06:09:20 +0000144 ngx_str_t path;
Igor Sysoevad22e012003-01-15 07:02:27 +0000145 int path_err;
Igor Sysoevb2620632003-01-10 06:09:20 +0000146
Igor Sysoev3a40d482002-09-12 14:42:29 +0000147 unsigned keepalive:1;
148 unsigned lingering_close:1;
149
Igor Sysoev682bf8e2002-09-16 15:01:44 +0000150 unsigned header_read:1;
Igor Sysoev1af7c822002-09-13 14:47:42 +0000151 unsigned header_timeout:1;
152
153 unsigned logging:1;
Igor Sysoev016b8522002-08-29 16:59:54 +0000154
Igor Sysoev2b542382002-08-20 14:48:28 +0000155 unsigned header_only:1;
Igor Sysoev2ba1ee02002-10-04 17:58:04 +0000156 unsigned unusual_uri:1; /* URI is not started with '/' - "GET http://" */
Igor Sysoev42feecb2002-12-15 06:25:09 +0000157 unsigned complex_uri:1; /* URI with "/." or with "//" (WIN32) */
Igor Sysoevb2620632003-01-10 06:09:20 +0000158 unsigned path_not_found:1;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000159
160 int state;
161 char *uri_start;
162 char *uri_end;
163 char *uri_ext;
164 char *args_start;
Igor Sysoev2ba1ee02002-10-04 17:58:04 +0000165 char *request_end;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000166 char *header_name_start;
167 char *header_name_end;
168 char *header_start;
169 char *header_end;
170#ifdef NGX_EVENT
171 int (*state_handler)(ngx_http_request_t *r);
172#endif
173};
174
Igor Sysoev42feecb2002-12-15 06:25:09 +0000175
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000176typedef struct {
177 char *action;
178 char *client;
179 char *url;
180} ngx_http_log_ctx_t;
181
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000182
Igor Sysoevb2620632003-01-10 06:09:20 +0000183typedef int (*ngx_http_handler_pt)(ngx_http_request_t *r);
184
Igor Sysoev960ffa42002-12-26 07:24:21 +0000185typedef int (*ngx_http_output_header_filter_p)(ngx_http_request_t *r);
186
187typedef int (*ngx_http_output_body_filter_p)
188 (ngx_http_request_t *r, ngx_chain_t *chain);
189
190
191
Igor Sysoev96f83772002-09-07 10:14:25 +0000192typedef struct {
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000193 int index;
Igor Sysoevb0869052002-12-10 18:05:12 +0000194
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000195 void *(*create_srv_conf)(ngx_pool_t *p);
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000196 char *(*init_srv_conf)(ngx_pool_t *p, void *conf);
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000197 void *(*create_loc_conf)(ngx_pool_t *p);
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000198 char *(*merge_loc_conf)(ngx_pool_t *p, void *prev, void *conf);
Igor Sysoevb0869052002-12-10 18:05:12 +0000199
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000200 int (*translate_handler)(ngx_http_request_t *r);
Igor Sysoevb0869052002-12-10 18:05:12 +0000201
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000202 int (*output_header_filter) (ngx_http_request_t *r);
203 int (*next_output_header_filter) (ngx_http_request_t *r);
Igor Sysoev42feecb2002-12-15 06:25:09 +0000204
Igor Sysoev207ed5a2002-12-26 16:26:23 +0000205 int (*output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
206 int (*next_output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
Igor Sysoev96f83772002-09-07 10:14:25 +0000207} ngx_http_module_t;
208
Igor Sysoev42feecb2002-12-15 06:25:09 +0000209
Igor Sysoev960ffa42002-12-26 07:24:21 +0000210#define NGX_HTTP_MODULE 0x80000000
Igor Sysoev96f83772002-09-07 10:14:25 +0000211
Igor Sysoev960ffa42002-12-26 07:24:21 +0000212#define NGX_HTTP_MODULE_TYPE 0x50545448 /* "HTTP" */
213
214
Igor Sysoev960ffa42002-12-26 07:24:21 +0000215#define ngx_http_get_module_srv_conf(r, module) r->srv_conf[module.index]
216#define ngx_http_get_module_loc_conf(r, module) r->loc_conf[module.index]
217#define ngx_http_get_module_ctx(r, module) r->ctx[module.index]
Igor Sysoev96f83772002-09-07 10:14:25 +0000218
Igor Sysoeva0bb31f2002-12-02 16:09:40 +0000219#define ngx_http_create_ctx(r, cx, module, size) \
Igor Sysoeve0268b92002-09-11 15:18:33 +0000220 do { \
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000221 ngx_test_null(cx, ngx_pcalloc(r->pool, size), NGX_ERROR); \
222 r->ctx[module.index] = cx; \
Igor Sysoeve0268b92002-09-11 15:18:33 +0000223 } while (0)
224
Igor Sysoev96f83772002-09-07 10:14:25 +0000225
226
227/* STUB */
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000228#define NGX_INDEX "index.html"
229
230
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000231/* STUB */
232int ngx_http_init(ngx_pool_t *pool, ngx_log_t *log);
Igor Sysoev42feecb2002-12-15 06:25:09 +0000233/**/
Igor Sysoeva58e3ca2002-09-02 14:48:24 +0000234
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000235int ngx_http_init_connection(ngx_connection_t *c);
236
237
Igor Sysoev42feecb2002-12-15 06:25:09 +0000238int ngx_http_discard_body(ngx_http_request_t *r);
239
240
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000241extern int ngx_max_module;
242extern ngx_array_t ngx_http_servers;
Igor Sysoeve0268b92002-09-11 15:18:33 +0000243
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000244
245extern int ngx_http_post_accept_timeout;
246extern int ngx_http_connection_pool_size;
247extern int ngx_http_request_pool_size;
248extern int ngx_http_client_header_timeout;
249extern int ngx_http_client_header_buffer_size;
250extern int ngx_http_discarded_buffer_size;
251
252extern int ngx_http_lingering_timeout;
253extern int ngx_http_lingering_time;
254
255
Igor Sysoevb2620632003-01-10 06:09:20 +0000256extern ngx_array_t ngx_http_index_handlers;
257
258
Igor Sysoev4e9393a2003-01-09 05:36:00 +0000259extern ngx_http_module_t *ngx_http_modules[];
Igor Sysoeve0268b92002-09-11 15:18:33 +0000260
261
262
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000263#endif /* _NGX_HTTP_H_INCLUDED_ */