Fix Headers TOC parser, use body length as limit
[MonkeyD.git] / src / include / request.h
blob763408ecde25535e291d8f9e9004cf3079829602
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
30 #define MK_REQUEST_DEFAULT_PAGE "<HTML><BODY><H1>%s</H1>%s<BR><HR><ADDRESS>%s</ADDRESS></BODY></HTML>"
32 /* Handle index file names: index.* */
33 #define MAX_INDEX_NOMBRE 50
34 struct indexfile
36 char indexname[MAX_INDEX_NOMBRE];
37 struct indexfile *next;
38 } *first_index;
40 #define MK_CRLF "\r\n"
41 #define MK_ENDBLOCK "\r\n\r\n"
43 mk_pointer mk_crlf;
44 mk_pointer mk_endblock;
46 /* Headers */
47 #define RH_ACCEPT "Accept:"
48 #define RH_ACCEPT_CHARSET "Accept-Charset:"
49 #define RH_ACCEPT_ENCODING "Accept-Encoding:"
50 #define RH_ACCEPT_LANGUAGE "Accept-Language:"
51 #define RH_CONNECTION "Connection:"
52 #define RH_COOKIE "Cookie:"
53 #define RH_CONTENT_LENGTH "Content-Length:"
54 #define RH_CONTENT_RANGE "Content-Range:"
55 #define RH_CONTENT_TYPE "Content-type:"
56 #define RH_IF_MODIFIED_SINCE "If-Modified-Since:"
57 #define RH_HOST "Host:"
58 #define RH_LAST_MODIFIED "Last-Modified:"
59 #define RH_LAST_MODIFIED_SINCE "Last-Modified-Since:"
60 #define RH_REFERER "Referer:"
61 #define RH_RANGE "Range:"
62 #define RH_USER_AGENT "User-Agent:"
64 mk_pointer mk_rh_accept;
65 mk_pointer mk_rh_accept_charset;
66 mk_pointer mk_rh_accept_encoding;
67 mk_pointer mk_rh_accept_language;
68 mk_pointer mk_rh_connection;
69 mk_pointer mk_rh_cookie;
70 mk_pointer mk_rh_content_length;
71 mk_pointer mk_rh_content_range;
72 mk_pointer mk_rh_content_type;
73 mk_pointer mk_rh_if_modified_since;
74 mk_pointer mk_rh_host;
75 mk_pointer mk_rh_last_modified;
76 mk_pointer mk_rh_last_modified_since;
77 mk_pointer mk_rh_referer;
78 mk_pointer mk_rh_range;
79 mk_pointer mk_rh_user_agent;
81 /* Aqui se registran temporalmente los
82 parametros de una peticion */
83 #define MAX_REQUEST_METHOD 10
84 #define MAX_REQUEST_URI 1025
85 #define MAX_REQUEST_PROTOCOL 10
86 #define MAX_SCRIPTALIAS 3
88 #define MK_REQUEST_STATUS_INCOMPLETE -1
89 #define MK_REQUEST_STATUS_COMPLETED 0
91 #define EXIT_NORMAL 0
92 #define EXIT_ABORT -2
93 #define EXIT_PCONNECTION 24
95 /* Request error messages for log file */
96 #define ERROR_MSG_400 "[error 400] Bad Request"
97 #define ERROR_MSG_403 "[error 403] Forbidden"
98 #define ERROR_MSG_404 "[error 404] Not Found"
99 #define ERROR_MSG_405 "[error 405] Method Not Allowed"
100 #define ERROR_MSG_408 "[error 408] Request Timeout"
101 #define ERROR_MSG_411 "[error 411] Length Required"
102 #define ERROR_MSG_500 "[error 500] Internal Server Error"
103 #define ERROR_MSG_501 "[error 501] Not Implemented"
104 #define ERROR_MSG_505 "[error 505] HTTP Version Not Supported"
106 /* mk pointers with error messages */
107 mk_pointer request_error_msg_400;
108 mk_pointer request_error_msg_403;
109 mk_pointer request_error_msg_404;
110 mk_pointer request_error_msg_405;
111 mk_pointer request_error_msg_408;
112 mk_pointer request_error_msg_411;
113 mk_pointer request_error_msg_500;
114 mk_pointer request_error_msg_501;
115 mk_pointer request_error_msg_505;
117 struct request_idx
119 struct client_request *first;
120 struct client_request *last;
123 struct client_request
125 int pipelined; /* Pipelined request */
126 int socket;
127 int counter_connections; /* Count persistent connections */
128 int status; /* Request status */
129 char *body; /* Original request sent */
131 mk_pointer *ipv4;
133 int body_length;
135 int body_pos_end;
136 int first_method;
138 time_t init_time;
139 struct request *request; /* Parsed request */
140 struct client_request *next;
143 pthread_key_t request_index;
145 struct header_toc
147 char *init;
148 char *end;
149 int status; /* 0: not found, 1: found = skip! */
150 struct header_toc *next;
153 /* Request plugin Handler, each request can be handled by
154 * several plugins, we handle list in a simple list */
155 struct handler
157 struct plugin *p;
158 struct handler *next;
161 struct request
163 int status;
164 int pipelined; /* Pipelined request */
165 mk_pointer body;
167 /*----First header of client request--*/
168 int method;
169 mk_pointer method_p;
170 mk_pointer uri; /* original request */
171 char *uri_processed; /* processed request */
172 int uri_twin;
174 int protocol;
176 /* If request specify Connection: close, Monkey will
177 * close the connection after send the response, by
178 * default this var is set as VAR_OFF;
180 int close_now;
182 /*---Request headers--*/
183 int content_length;
184 mk_pointer accept;
185 mk_pointer accept_language;
186 mk_pointer accept_encoding;
187 mk_pointer accept_charset;
188 mk_pointer content_type;
189 mk_pointer connection;
190 mk_pointer cookies;
191 mk_pointer host;
192 mk_pointer if_modified_since;
193 mk_pointer last_modified_since;
194 mk_pointer range;
195 mk_pointer referer;
196 mk_pointer resume;
197 mk_pointer user_agent;
198 /*---------------------*/
200 /* POST */
201 mk_pointer post_variables;
202 /*-----------------*/
204 /*-Internal-*/
205 mk_pointer real_path; /* Absolute real path */
206 char *user_uri; /* ~user/...path */
207 mk_pointer query_string; /* ?... */
209 char *virtual_user; /* Virtualhost user */
210 char *script_filename;
211 int keep_alive;
212 int user_home; /* user_home request(VAR_ON/VAR_OFF) */
214 /*-Connection-*/
215 int port;
216 /*------------*/
218 int make_log;
219 int cgi_pipe[2];
221 /* file descriptors */
222 int fd_file;
224 struct file_info *file_info;
225 struct host *host_conf;
226 struct log_info *log; /* Request Log */
227 struct header_values *headers; /* headers response */
228 struct request *next;
230 long loop;
231 long bytes_to_send;
232 off_t bytes_offset;
234 /* Plugin handlers */
235 struct plugin *handled_by;
238 struct header_values
240 int status;
242 int content_length;
243 mk_pointer content_length_p;
245 int cgi;
246 int pconnections_left;
247 int ranges[2];
248 int transfer_encoding;
249 int breakline;
251 mk_pointer content_type;
252 mk_pointer last_modified;
253 char *location;
257 struct request *mk_request_parse(struct client_request *cr);
258 int mk_request_process(struct client_request *cr, struct request *s_request);
259 mk_pointer mk_request_index(char *pathfile);
262 /* Custom HTML Page for errors */
263 mk_pointer *mk_request_set_default_page(char *title, mk_pointer message,
264 char *signature);
266 int mk_request_header_process(struct request *sr);
267 mk_pointer mk_request_header_find(struct header_toc *toc, int toc_len,
268 char *request_body, mk_pointer header);
270 void mk_request_error(int num_error, struct client_request *cr,
271 struct request *s_request, int debug,
272 struct log_info *s_log);
274 struct request *mk_request_alloc();
275 void mk_request_free_list(struct client_request *cr);
276 void mk_request_free(struct request *sr);
278 struct client_request *mk_request_client_create(int socket);
279 struct client_request *mk_request_client_get(int socket);
280 struct client_request *mk_request_client_remove(int socket);
282 void mk_request_init_error_msgs();
284 int mk_handler_read(int socket, struct client_request *cr);
285 int mk_handler_write(int socket, struct client_request *cr);
288 struct header_toc *mk_request_header_toc_create(int len);
289 void mk_request_header_toc_parse(struct header_toc *toc, int toc_len,
290 char *data, int len);
292 void mk_request_ka_next(struct client_request *cr);
293 #endif