1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 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.
25 #include "scheduler.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
36 char indexname
[MAX_INDEX_NOMBRE
];
37 struct indexfile
*next
;
40 #define MK_CRLF "\r\n"
41 #define MK_ENDBLOCK "\r\n\r\n"
44 mk_pointer mk_endblock
;
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 -1
92 #define EXIT_PCONNECTION 24
94 /* Request error messages for log file */
95 #define ERROR_MSG_400 "[error 400] Bad Request"
96 #define ERROR_MSG_403 "[error 403] Forbidden"
97 #define ERROR_MSG_404 "[error 404] Not Found"
98 #define ERROR_MSG_405 "[error 405] Method Not Allowed"
99 #define ERROR_MSG_408 "[error 408] Request Timeout"
100 #define ERROR_MSG_411 "[error 411] Length Required"
101 #define ERROR_MSG_500 "[error 500] Internal Server Error"
102 #define ERROR_MSG_501 "[error 501] Not Implemented"
103 #define ERROR_MSG_505 "[error 505] HTTP Version Not Supported"
105 /* mk pointers with error messages */
106 mk_pointer request_error_msg_400
;
107 mk_pointer request_error_msg_403
;
108 mk_pointer request_error_msg_404
;
109 mk_pointer request_error_msg_405
;
110 mk_pointer request_error_msg_408
;
111 mk_pointer request_error_msg_411
;
112 mk_pointer request_error_msg_500
;
113 mk_pointer request_error_msg_501
;
114 mk_pointer request_error_msg_505
;
118 struct client_request
*first
;
119 struct client_request
*last
;
122 struct client_request
124 int pipelined
; /* Pipelined request */
126 int counter_connections
; /* Count persistent connections */
127 int status
; /* Request status */
128 char *body
; /* Original request sent */
138 struct request
*request
; /* Parsed request */
139 struct client_request
*next
;
142 pthread_key_t request_index
;
148 int status
; /* 0: not found, 1: found = skip! */
149 struct header_toc
*next
;
152 /* Request plugin Handler, each request can be handled by
153 * several plugins, we handle list in a simple list */
157 struct handler
*next
;
163 int pipelined
; /* Pipelined request */
166 /*----First header of client request--*/
169 mk_pointer uri
; /* original request */
170 char *uri_processed
; /* processed request */
174 /*------------------*/
176 /*---Request headers--*/
179 mk_pointer accept_language
;
180 mk_pointer accept_encoding
;
181 mk_pointer accept_charset
;
182 mk_pointer content_type
;
183 mk_pointer connection
;
186 mk_pointer if_modified_since
;
187 mk_pointer last_modified_since
;
191 mk_pointer user_agent
;
192 /*---------------------*/
195 mk_pointer post_variables
;
196 /*-----------------*/
199 mk_pointer real_path
; /* Absolute real path */
200 char *user_uri
; /* ~user/...path */
201 mk_pointer query_string
; /* ?... */
203 char *virtual_user
; /* Virtualhost user */
204 char *script_filename
;
206 int user_home
; /* user_home request(VAR_ON/VAR_OFF) */
215 /* file descriptors */
218 struct file_info
*file_info
;
219 struct host
*host_conf
;
220 struct log_info
*log
; /* Request Log */
221 struct header_values
*headers
; /* headers response */
222 struct request
*next
;
228 /* Plugin handlers */
229 struct plugin
*handled_by
;
237 mk_pointer content_length_p
;
240 int pconnections_left
;
242 int transfer_encoding
;
245 mk_pointer content_type
;
246 mk_pointer last_modified
;
251 struct request
*mk_request_parse(struct client_request
*cr
);
252 int mk_request_process(struct client_request
*cr
, struct request
*s_request
);
253 mk_pointer
mk_request_index(char *pathfile
);
256 /* Custom HTML Page for errors */
257 mk_pointer
*mk_request_set_default_page(char *title
, mk_pointer message
,
260 int mk_request_header_process(struct request
*sr
);
261 mk_pointer
mk_request_header_find(struct header_toc
*toc
, int toc_len
,
262 char *request_body
, mk_pointer header
);
264 void mk_request_error(int num_error
, struct client_request
*cr
,
265 struct request
*s_request
, int debug
,
266 struct log_info
*s_log
);
268 struct request
*mk_request_alloc();
269 void mk_request_free_list(struct client_request
*cr
);
270 void mk_request_free(struct request
*sr
);
272 struct client_request
*mk_request_client_create(int socket
);
273 struct client_request
*mk_request_client_get(int socket
);
274 struct client_request
*mk_request_client_remove(int socket
);
276 void mk_request_init_error_msgs();
278 int mk_handler_read(int socket
, struct client_request
*cr
);
279 int mk_handler_write(int socket
, struct client_request
*cr
);
282 struct header_toc
*mk_request_header_toc_create(int len
);
283 void mk_request_header_toc_parse(struct header_toc
*toc
, char *data
, int len
);
285 void mk_request_ka_next(struct client_request
*cr
);