Default request chunk size set to 4096 bytes
[MonkeyD.git] / src / include / request.h
blob2a1b7b3b5008b7949e70bf9d7776f42dd02ae390
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 /* Monkey HTTP Daemon
4 * ------------------
5 * Copyright (C) 2001-2010, Eduardo Silva P. <edsiper@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Library General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 /* request.c */
24 #include "memory.h"
25 #include "scheduler.h"
27 #ifndef MK_REQUEST_H
28 #define MK_REQUEST_H
31 /* Request buffer chunks = 4KB */
32 #define MK_REQUEST_CHUNK (int) 4096
34 #define MK_REQUEST_DEFAULT_PAGE "<HTML><BODY><H1>%s</H1>%s<BR><HR><ADDRESS>%s</ADDRESS></BODY></HTML>"
36 /* Handle index file names: index.* */
37 #define MAX_INDEX_NAME 50
38 struct indexfile
40 char indexname[MAX_INDEX_NAME];
41 struct indexfile *next;
42 } *first_index;
44 #define MK_CRLF "\r\n"
45 #define MK_ENDBLOCK "\r\n\r\n"
47 mk_pointer mk_crlf;
48 mk_pointer mk_endblock;
50 /* Headers */
51 #define RH_ACCEPT "Accept:"
52 #define RH_ACCEPT_CHARSET "Accept-Charset:"
53 #define RH_ACCEPT_ENCODING "Accept-Encoding:"
54 #define RH_ACCEPT_LANGUAGE "Accept-Language:"
55 #define RH_CONNECTION "Connection:"
56 #define RH_COOKIE "Cookie:"
57 #define RH_CONTENT_LENGTH "Content-Length:"
58 #define RH_CONTENT_RANGE "Content-Range:"
59 #define RH_CONTENT_TYPE "Content-type:"
60 #define RH_IF_MODIFIED_SINCE "If-Modified-Since:"
61 #define RH_HOST "Host:"
62 #define RH_LAST_MODIFIED "Last-Modified:"
63 #define RH_LAST_MODIFIED_SINCE "Last-Modified-Since:"
64 #define RH_REFERER "Referer:"
65 #define RH_RANGE "Range:"
66 #define RH_USER_AGENT "User-Agent:"
68 mk_pointer mk_rh_accept;
69 mk_pointer mk_rh_accept_charset;
70 mk_pointer mk_rh_accept_encoding;
71 mk_pointer mk_rh_accept_language;
72 mk_pointer mk_rh_connection;
73 mk_pointer mk_rh_cookie;
74 mk_pointer mk_rh_content_length;
75 mk_pointer mk_rh_content_range;
76 mk_pointer mk_rh_content_type;
77 mk_pointer mk_rh_if_modified_since;
78 mk_pointer mk_rh_host;
79 mk_pointer mk_rh_last_modified;
80 mk_pointer mk_rh_last_modified_since;
81 mk_pointer mk_rh_referer;
82 mk_pointer mk_rh_range;
83 mk_pointer mk_rh_user_agent;
85 /* Aqui se registran temporalmente los
86 parametros de una peticion */
87 #define MAX_REQUEST_METHOD 10
88 #define MAX_REQUEST_URI 1025
89 #define MAX_REQUEST_PROTOCOL 10
90 #define MAX_SCRIPTALIAS 3
92 #define MK_REQUEST_STATUS_INCOMPLETE -1
93 #define MK_REQUEST_STATUS_COMPLETED 0
95 #define EXIT_NORMAL 0
96 #define EXIT_ERROR -1
97 #define EXIT_ABORT -2
98 #define EXIT_PCONNECTION 24
100 struct request_idx
102 struct client_request *first;
103 struct client_request *last;
106 struct client_request
108 int pipelined; /* Pipelined request */
109 int socket;
110 int counter_connections; /* Count persistent connections */
111 int status; /* Request status */
112 char *body; /* Original request sent */
114 mk_pointer *ipv4;
116 int body_size;
117 int body_length;
119 int body_pos_end;
120 int first_method;
122 time_t init_time;
123 struct request *request; /* Parsed request */
124 struct client_request *next;
127 pthread_key_t request_index;
129 struct header_toc
131 char *init;
132 char *end;
133 int status; /* 0: not found, 1: found = skip! */
134 struct header_toc *next;
137 /* Request plugin Handler, each request can be handled by
138 * several plugins, we handle list in a simple list */
139 struct handler
141 struct plugin *p;
142 struct handler *next;
145 struct request
147 int status;
149 int pipelined; /* Pipelined request */
150 mk_pointer body;
152 /*----First header of client request--*/
153 int method;
154 mk_pointer method_p;
155 mk_pointer uri; /* original request */
156 char *uri_processed; /* processed request */
157 int uri_twin;
159 int protocol;
160 mk_pointer protocol_p;
162 /* If request specify Connection: close, Monkey will
163 * close the connection after send the response, by
164 * default this var is set to VAR_OFF;
166 int close_now;
168 /*---Request headers--*/
169 int content_length;
170 mk_pointer accept;
171 mk_pointer accept_language;
172 mk_pointer accept_encoding;
173 mk_pointer accept_charset;
174 mk_pointer content_type;
175 mk_pointer connection;
176 mk_pointer cookies;
177 mk_pointer host;
178 mk_pointer if_modified_since;
179 mk_pointer last_modified_since;
180 mk_pointer range;
181 mk_pointer referer;
182 mk_pointer resume;
183 mk_pointer user_agent;
184 /*---------------------*/
186 /* POST */
187 mk_pointer post_variables;
188 /*-----------------*/
190 /*-Internal-*/
191 mk_pointer real_path; /* Absolute real path */
192 char *user_uri; /* ~user/...path */
193 mk_pointer query_string; /* ?... */
195 char *virtual_user; /* Virtualhost user */
196 char *script_filename;
197 int keep_alive;
198 int user_home; /* user_home request(VAR_ON/VAR_OFF) */
200 /*-Connection-*/
201 int port;
202 /*------------*/
204 /* file descriptors */
205 int fd_file;
207 struct file_info *file_info;
208 struct host *host_conf;
209 struct header_values *headers; /* headers response */
210 struct request *next;
212 long loop;
213 long bytes_to_send;
214 off_t bytes_offset;
216 /* Plugin handlers */
217 struct plugin *handled_by;
220 struct header_values
222 int status;
223 mk_pointer *status_p;
225 /* Length of the content to send */
226 long content_length;
228 /* Private value, real length of the file requested */
229 long real_length;
231 int cgi;
232 int pconnections_left;
233 int ranges[2];
234 int transfer_encoding;
235 int breakline;
237 time_t last_modified;
238 mk_pointer content_type;
239 char *location;
242 struct request *mk_request_parse(struct client_request *cr);
243 int mk_request_process(struct client_request *cr, struct request *s_request);
244 mk_pointer mk_request_index(char *pathfile);
247 /* Custom HTML Page for errors */
248 mk_pointer *mk_request_set_default_page(char *title, mk_pointer message,
249 char *signature);
251 int mk_request_header_process(struct request *sr);
252 mk_pointer mk_request_header_find(struct header_toc *toc, int toc_len,
253 char *request_body, mk_pointer header);
255 void mk_request_error(int http_status, struct client_request *cr,
256 struct request *sr);
258 struct request *mk_request_alloc();
259 void mk_request_free_list(struct client_request *cr);
260 void mk_request_free(struct request *sr);
262 struct client_request *mk_request_client_create(int socket);
263 struct client_request *mk_request_client_get(int socket);
264 void mk_request_client_remove(int socket);
266 void mk_request_init_error_msgs();
268 int mk_handler_read(int socket, struct client_request *cr);
269 int mk_handler_write(int socket, struct client_request *cr);
272 struct header_toc *mk_request_header_toc_create(int len);
273 void mk_request_header_toc_parse(struct header_toc *toc, int toc_len,
274 char *data, int len);
276 void mk_request_ka_next(struct client_request *cr);
277 #endif