Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 1 | #ifndef _NGX_HTTP_H_INCLUDED_ |
| 2 | #define _NGX_HTTP_H_INCLUDED_ |
| 3 | |
| 4 | |
| 5 | #include <ngx_config.h> |
Igor Sysoev | c181784 | 2002-12-27 16:22:50 +0000 | [diff] [blame] | 6 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 7 | #include <ngx_types.h> |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 8 | #include <ngx_string.h> |
| 9 | #include <ngx_table.h> |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 10 | #include <ngx_hunk.h> |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 11 | #include <ngx_files.h> |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 12 | #include <ngx_connection.h> |
Igor Sysoev | c181784 | 2002-12-27 16:22:50 +0000 | [diff] [blame] | 13 | #include <ngx_conf_file.h> |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 14 | |
Igor Sysoev | fcce8d5 | 2003-01-23 18:47:54 +0000 | [diff] [blame^] | 15 | /* STUB */ |
| 16 | #include <ngx_event_timer.h> |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 17 | |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 18 | #define NGX_HTTP_VERSION_10 1000 |
| 19 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 20 | #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 Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 27 | |
Igor Sysoev | 1af7c82 | 2002-09-13 14:47:42 +0000 | [diff] [blame] | 28 | #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 Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 34 | |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 35 | |
| 36 | #define NGX_HTTP_OK 200 |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 37 | #define NGX_HTTP_SPECIAL_RESPONSE 300 |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 38 | #define NGX_HTTP_MOVED_PERMANENTLY 301 |
| 39 | #define NGX_HTTP_MOVED_TEMPORARILY 302 |
| 40 | #define NGX_HTTP_NOT_MODIFIED 304 |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 41 | #define NGX_HTTP_BAD_REQUEST 400 |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 42 | #define NGX_HTTP_FORBIDDEN 403 |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 43 | #define NGX_HTTP_NOT_FOUND 404 |
Igor Sysoev | 1af7c82 | 2002-09-13 14:47:42 +0000 | [diff] [blame] | 44 | #define NGX_HTTP_REQUEST_URI_TOO_LARGE 414 |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 45 | #define NGX_HTTP_INTERNAL_SERVER_ERROR 500 |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 46 | |
| 47 | |
| 48 | #define NGX_HTTP_STATIC_HANDLER 0 |
| 49 | #define NGX_HTTP_DIRECTORY_HANDLER 1 |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 50 | |
| 51 | |
Igor Sysoev | 0c331d9 | 2002-08-15 17:20:26 +0000 | [diff] [blame] | 52 | |
| 53 | typedef struct { |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 54 | char *doc_root; |
| 55 | size_t doc_root_len; |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 56 | |
Igor Sysoev | 682bf8e | 2002-09-16 15:01:44 +0000 | [diff] [blame] | 57 | size_t connection_pool_size; |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 58 | size_t request_pool_size; |
| 59 | |
| 60 | size_t header_buffer_size; |
| 61 | size_t discarded_buffer_size; |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 62 | |
Igor Sysoev | 682bf8e | 2002-09-16 15:01:44 +0000 | [diff] [blame] | 63 | ngx_msec_t header_timeout; |
| 64 | ngx_msec_t lingering_timeout; |
| 65 | time_t lingering_time; |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 66 | } ngx_http_server_t; |
| 67 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 68 | |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 69 | typedef struct { |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 70 | int len; |
| 71 | char *data; |
| 72 | int offset; |
| 73 | } ngx_http_header_t; |
| 74 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 75 | |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 76 | typedef struct { |
| 77 | ngx_table_elt_t *host; |
| 78 | ngx_table_elt_t *connection; |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 79 | ngx_table_elt_t *if_modified_since; |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 80 | 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 Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 86 | |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 87 | typedef struct { |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 88 | 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 Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 104 | } ngx_http_headers_out_t; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 105 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 106 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 107 | typedef struct ngx_http_request_s ngx_http_request_t; |
| 108 | |
| 109 | struct ngx_http_request_s { |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 110 | ngx_file_t file; |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 111 | |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 112 | void **ctx; |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 113 | void **srv_conf; |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 114 | void **loc_conf; |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 115 | |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 116 | ngx_pool_t *pool; |
| 117 | ngx_hunk_t *header_in; |
| 118 | |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 119 | ngx_http_headers_in_t headers_in; |
| 120 | ngx_http_headers_out_t headers_out; |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 121 | |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 122 | int (*handler)(ngx_http_request_t *r); |
| 123 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 124 | int method; |
| 125 | |
Igor Sysoev | 3a40d48 | 2002-09-12 14:42:29 +0000 | [diff] [blame] | 126 | time_t lingering_time; |
| 127 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 128 | int http_version; |
| 129 | int http_major; |
| 130 | int http_minor; |
| 131 | |
Igor Sysoev | 2d0d909 | 2002-12-03 15:45:38 +0000 | [diff] [blame] | 132 | ngx_str_t request_line; |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 133 | ngx_str_t uri; |
| 134 | ngx_str_t exten; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 135 | ngx_http_request_t *main; |
| 136 | |
Igor Sysoev | e0af1b8 | 2002-08-16 15:27:03 +0000 | [diff] [blame] | 137 | ngx_connection_t *connection; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 138 | |
Igor Sysoev | 4e5e117 | 2002-08-22 15:24:03 +0000 | [diff] [blame] | 139 | int filter; |
| 140 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 141 | ssize_t client_content_length; |
| 142 | char *discarded_buffer; |
| 143 | |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 144 | ngx_str_t path; |
Igor Sysoev | ad22e01 | 2003-01-15 07:02:27 +0000 | [diff] [blame] | 145 | int path_err; |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 146 | |
Igor Sysoev | 3a40d48 | 2002-09-12 14:42:29 +0000 | [diff] [blame] | 147 | unsigned keepalive:1; |
| 148 | unsigned lingering_close:1; |
| 149 | |
Igor Sysoev | 682bf8e | 2002-09-16 15:01:44 +0000 | [diff] [blame] | 150 | unsigned header_read:1; |
Igor Sysoev | 1af7c82 | 2002-09-13 14:47:42 +0000 | [diff] [blame] | 151 | unsigned header_timeout:1; |
| 152 | |
| 153 | unsigned logging:1; |
Igor Sysoev | 016b852 | 2002-08-29 16:59:54 +0000 | [diff] [blame] | 154 | |
Igor Sysoev | 2b54238 | 2002-08-20 14:48:28 +0000 | [diff] [blame] | 155 | unsigned header_only:1; |
Igor Sysoev | 2ba1ee0 | 2002-10-04 17:58:04 +0000 | [diff] [blame] | 156 | unsigned unusual_uri:1; /* URI is not started with '/' - "GET http://" */ |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 157 | unsigned complex_uri:1; /* URI with "/." or with "//" (WIN32) */ |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 158 | unsigned path_not_found:1; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 159 | |
| 160 | int state; |
| 161 | char *uri_start; |
| 162 | char *uri_end; |
| 163 | char *uri_ext; |
| 164 | char *args_start; |
Igor Sysoev | 2ba1ee0 | 2002-10-04 17:58:04 +0000 | [diff] [blame] | 165 | char *request_end; |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 166 | 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 Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 175 | |
Igor Sysoev | 0ad17c0 | 2002-08-26 15:18:19 +0000 | [diff] [blame] | 176 | typedef struct { |
| 177 | char *action; |
| 178 | char *client; |
| 179 | char *url; |
| 180 | } ngx_http_log_ctx_t; |
| 181 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 182 | |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 183 | typedef int (*ngx_http_handler_pt)(ngx_http_request_t *r); |
| 184 | |
Igor Sysoev | 960ffa4 | 2002-12-26 07:24:21 +0000 | [diff] [blame] | 185 | typedef int (*ngx_http_output_header_filter_p)(ngx_http_request_t *r); |
| 186 | |
| 187 | typedef int (*ngx_http_output_body_filter_p) |
| 188 | (ngx_http_request_t *r, ngx_chain_t *chain); |
| 189 | |
| 190 | |
| 191 | |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 192 | typedef struct { |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 193 | int index; |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 194 | |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 195 | void *(*create_srv_conf)(ngx_pool_t *p); |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 196 | char *(*init_srv_conf)(ngx_pool_t *p, void *conf); |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 197 | void *(*create_loc_conf)(ngx_pool_t *p); |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 198 | char *(*merge_loc_conf)(ngx_pool_t *p, void *prev, void *conf); |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 199 | |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 200 | int (*translate_handler)(ngx_http_request_t *r); |
Igor Sysoev | b086905 | 2002-12-10 18:05:12 +0000 | [diff] [blame] | 201 | |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 202 | int (*output_header_filter) (ngx_http_request_t *r); |
| 203 | int (*next_output_header_filter) (ngx_http_request_t *r); |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 204 | |
Igor Sysoev | 207ed5a | 2002-12-26 16:26:23 +0000 | [diff] [blame] | 205 | 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 Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 207 | } ngx_http_module_t; |
| 208 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 209 | |
Igor Sysoev | 960ffa4 | 2002-12-26 07:24:21 +0000 | [diff] [blame] | 210 | #define NGX_HTTP_MODULE 0x80000000 |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 211 | |
Igor Sysoev | 960ffa4 | 2002-12-26 07:24:21 +0000 | [diff] [blame] | 212 | #define NGX_HTTP_MODULE_TYPE 0x50545448 /* "HTTP" */ |
| 213 | |
| 214 | |
Igor Sysoev | 960ffa4 | 2002-12-26 07:24:21 +0000 | [diff] [blame] | 215 | #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 Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 218 | |
Igor Sysoev | a0bb31f | 2002-12-02 16:09:40 +0000 | [diff] [blame] | 219 | #define ngx_http_create_ctx(r, cx, module, size) \ |
Igor Sysoev | e0268b9 | 2002-09-11 15:18:33 +0000 | [diff] [blame] | 220 | do { \ |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 221 | ngx_test_null(cx, ngx_pcalloc(r->pool, size), NGX_ERROR); \ |
| 222 | r->ctx[module.index] = cx; \ |
Igor Sysoev | e0268b9 | 2002-09-11 15:18:33 +0000 | [diff] [blame] | 223 | } while (0) |
| 224 | |
Igor Sysoev | 96f8377 | 2002-09-07 10:14:25 +0000 | [diff] [blame] | 225 | |
| 226 | |
| 227 | /* STUB */ |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 228 | #define NGX_INDEX "index.html" |
| 229 | |
| 230 | |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 231 | /* STUB */ |
| 232 | int ngx_http_init(ngx_pool_t *pool, ngx_log_t *log); |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 233 | /**/ |
Igor Sysoev | a58e3ca | 2002-09-02 14:48:24 +0000 | [diff] [blame] | 234 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 235 | int ngx_http_init_connection(ngx_connection_t *c); |
| 236 | |
| 237 | |
Igor Sysoev | 42feecb | 2002-12-15 06:25:09 +0000 | [diff] [blame] | 238 | int ngx_http_discard_body(ngx_http_request_t *r); |
| 239 | |
| 240 | |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 241 | extern int ngx_max_module; |
| 242 | extern ngx_array_t ngx_http_servers; |
Igor Sysoev | e0268b9 | 2002-09-11 15:18:33 +0000 | [diff] [blame] | 243 | |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 244 | |
| 245 | extern int ngx_http_post_accept_timeout; |
| 246 | extern int ngx_http_connection_pool_size; |
| 247 | extern int ngx_http_request_pool_size; |
| 248 | extern int ngx_http_client_header_timeout; |
| 249 | extern int ngx_http_client_header_buffer_size; |
| 250 | extern int ngx_http_discarded_buffer_size; |
| 251 | |
| 252 | extern int ngx_http_lingering_timeout; |
| 253 | extern int ngx_http_lingering_time; |
| 254 | |
| 255 | |
Igor Sysoev | b262063 | 2003-01-10 06:09:20 +0000 | [diff] [blame] | 256 | extern ngx_array_t ngx_http_index_handlers; |
| 257 | |
| 258 | |
Igor Sysoev | 4e9393a | 2003-01-09 05:36:00 +0000 | [diff] [blame] | 259 | extern ngx_http_module_t *ngx_http_modules[]; |
Igor Sysoev | e0268b9 | 2002-09-11 15:18:33 +0000 | [diff] [blame] | 260 | |
| 261 | |
| 262 | |
Igor Sysoev | 6de5c2c | 2002-08-06 16:39:45 +0000 | [diff] [blame] | 263 | #endif /* _NGX_HTTP_H_INCLUDED_ */ |