1 | /* Licensed to the Apache Software Foundation (ASF) under one or more |
2 | * contributor license agreements. See the NOTICE file distributed with |
3 | * this work for additional information regarding copyright ownership. |
4 | * The ASF licenses this file to You under the Apache License, Version 2.0 |
5 | * (the "License"); you may not use this file except in compliance with |
6 | * the License. You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | */ |
16 | |
17 | /** |
18 | * @file httpd.h |
19 | * @brief HTTP Daemon routines |
20 | * |
21 | * @defgroup APACHE Apache |
22 | * |
23 | * Top level group of which all other groups are a member |
24 | * @{ |
25 | * |
26 | * @defgroup APACHE_MODS Apache Modules |
27 | * Top level group for Apache Modules |
28 | * @defgroup APACHE_OS Operating System Specific |
29 | * @defgroup APACHE_CORE Apache Core |
30 | * @{ |
31 | * @defgroup APACHE_CORE_DAEMON HTTP Daemon Routine |
32 | * @{ |
33 | */ |
34 | |
35 | #ifndef APACHE_HTTPD_H |
36 | #define APACHE_HTTPD_H |
37 | |
38 | /* XXX - We need to push more stuff to other .h files, or even .c files, to |
39 | * make this file smaller |
40 | */ |
41 | |
42 | /* Headers in which EVERYONE has an interest... */ |
43 | #include "ap_config.h" |
44 | #include "ap_mmn.h" |
45 | |
46 | #include "ap_release.h" |
47 | |
48 | #include "apr.h" |
49 | #include "apr_general.h" |
50 | #include "apr_tables.h" |
51 | #include "apr_pools.h" |
52 | #include "apr_time.h" |
53 | #include "apr_network_io.h" |
54 | #include "apr_buckets.h" |
55 | #include "apr_poll.h" |
56 | |
57 | #include "os.h" |
58 | |
59 | #include "ap_regex.h" |
60 | |
61 | #if APR_HAVE_STDLIB_H |
62 | #include <stdlib.h> |
63 | #endif |
64 | |
65 | /* Note: apr_uri.h is also included, see below */ |
66 | |
67 | #ifdef __cplusplus |
68 | extern "C" { |
69 | #endif |
70 | |
71 | #ifdef CORE_PRIVATE |
72 | |
73 | /* ----------------------------- config dir ------------------------------ */ |
74 | |
75 | /** Define this to be the default server home dir. Most things later in this |
76 | * file with a relative pathname will have this added. |
77 | */ |
78 | #ifndef HTTPD_ROOT |
79 | #ifdef OS2 |
80 | /** Set default for OS/2 file system */ |
81 | #define HTTPD_ROOT "/os2httpd" |
82 | #elif defined(WIN32) |
83 | /** Set default for Windows file system */ |
84 | #define HTTPD_ROOT "/apache" |
85 | #elif defined (BEOS) |
86 | /** Set the default for BeOS */ |
87 | #define HTTPD_ROOT "/boot/home/apache" |
88 | #elif defined (NETWARE) |
89 | /** Set the default for NetWare */ |
90 | #define HTTPD_ROOT "/apache" |
91 | #else |
92 | /** Set for all other OSs */ |
93 | #define HTTPD_ROOT "/usr/local/apache" |
94 | #endif |
95 | #endif /* HTTPD_ROOT */ |
96 | |
97 | /* |
98 | * --------- You shouldn't have to edit anything below this line ---------- |
99 | * |
100 | * Any modifications to any defaults not defined above should be done in the |
101 | * respective configuration file. |
102 | * |
103 | */ |
104 | |
105 | /** |
106 | * Default location of documents. Can be overridden by the DocumentRoot |
107 | * directive. |
108 | */ |
109 | #ifndef DOCUMENT_LOCATION |
110 | #ifdef OS2 |
111 | /* Set default for OS/2 file system */ |
112 | #define DOCUMENT_LOCATION HTTPD_ROOT "/docs" |
113 | #else |
114 | /* Set default for non OS/2 file system */ |
115 | #define DOCUMENT_LOCATION HTTPD_ROOT "/htdocs" |
116 | #endif |
117 | #endif /* DOCUMENT_LOCATION */ |
118 | |
119 | /** Maximum number of dynamically loaded modules */ |
120 | #ifndef DYNAMIC_MODULE_LIMIT |
121 | #define DYNAMIC_MODULE_LIMIT 128 |
122 | #endif |
123 | |
124 | /** Default administrator's address */ |
125 | #define DEFAULT_ADMIN "[no address given]" |
126 | |
127 | /** The name of the log files */ |
128 | #ifndef DEFAULT_ERRORLOG |
129 | #if defined(OS2) || defined(WIN32) |
130 | #define DEFAULT_ERRORLOG "logs/error.log" |
131 | #else |
132 | #define DEFAULT_ERRORLOG "logs/error_log" |
133 | #endif |
134 | #endif /* DEFAULT_ERRORLOG */ |
135 | |
136 | /** Define this to be what your per-directory security files are called */ |
137 | #ifndef DEFAULT_ACCESS_FNAME |
138 | #ifdef OS2 |
139 | /* Set default for OS/2 file system */ |
140 | #define DEFAULT_ACCESS_FNAME "htaccess" |
141 | #else |
142 | #define DEFAULT_ACCESS_FNAME ".htaccess" |
143 | #endif |
144 | #endif /* DEFAULT_ACCESS_FNAME */ |
145 | |
146 | /** The name of the server config file */ |
147 | #ifndef SERVER_CONFIG_FILE |
148 | #define SERVER_CONFIG_FILE "conf/httpd.conf" |
149 | #endif |
150 | |
151 | /** The default path for CGI scripts if none is currently set */ |
152 | #ifndef DEFAULT_PATH |
153 | #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin" |
154 | #endif |
155 | |
156 | /** The path to the suExec wrapper, can be overridden in Configuration */ |
157 | #if !defined(NETWARE) && !defined(WIN32) |
158 | #ifndef SUEXEC_BIN |
159 | #define SUEXEC_BIN HTTPD_ROOT "/bin/suexec" |
160 | #endif |
161 | #endif |
162 | |
163 | /** The timeout for waiting for messages */ |
164 | #ifndef DEFAULT_TIMEOUT |
165 | #define DEFAULT_TIMEOUT 300 |
166 | #endif |
167 | |
168 | /** The timeout for waiting for keepalive timeout until next request */ |
169 | #ifndef DEFAULT_KEEPALIVE_TIMEOUT |
170 | #define DEFAULT_KEEPALIVE_TIMEOUT 5 |
171 | #endif |
172 | |
173 | /** The number of requests to entertain per connection */ |
174 | #ifndef DEFAULT_KEEPALIVE |
175 | #define DEFAULT_KEEPALIVE 100 |
176 | #endif |
177 | |
178 | /* |
179 | * Limits on the size of various request items. These limits primarily |
180 | * exist to prevent simple denial-of-service attacks on a server based |
181 | * on misuse of the protocol. The recommended values will depend on the |
182 | * nature of the server resources -- CGI scripts and database backends |
183 | * might require large values, but most servers could get by with much |
184 | * smaller limits than we use below. The request message body size can |
185 | * be limited by the per-dir config directive LimitRequestBody. |
186 | * |
187 | * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE |
188 | * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190. |
189 | * These two limits can be lowered or raised by the server config |
190 | * directives LimitRequestLine and LimitRequestFieldsize, respectively. |
191 | * |
192 | * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by |
193 | * the server config directive LimitRequestFields. |
194 | */ |
195 | |
196 | /** default limit on bytes in Request-Line (Method+URI+HTTP-version) */ |
197 | #ifndef DEFAULT_LIMIT_REQUEST_LINE |
198 | #define DEFAULT_LIMIT_REQUEST_LINE 8190 |
199 | #endif |
200 | /** default limit on bytes in any one header field */ |
201 | #ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE |
202 | #define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190 |
203 | #endif |
204 | /** default limit on number of request header fields */ |
205 | #ifndef DEFAULT_LIMIT_REQUEST_FIELDS |
206 | #define DEFAULT_LIMIT_REQUEST_FIELDS 100 |
207 | #endif |
208 | |
209 | /** |
210 | * The default default character set name to add if AddDefaultCharset is |
211 | * enabled. Overridden with AddDefaultCharsetName. |
212 | */ |
213 | #define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1" |
214 | |
215 | #endif /* CORE_PRIVATE */ |
216 | |
217 | /** default HTTP Server protocol */ |
218 | #define AP_SERVER_PROTOCOL "HTTP/1.1" |
219 | |
220 | |
221 | /* ------------------ stuff that modules are allowed to look at ----------- */ |
222 | |
223 | /** Define this to be what your HTML directory content files are called */ |
224 | #ifndef AP_DEFAULT_INDEX |
225 | #define AP_DEFAULT_INDEX "index.html" |
226 | #endif |
227 | |
228 | |
229 | /** |
230 | * Define this to be what type you'd like returned for files with unknown |
231 | * suffixes. |
232 | * @warning MUST be all lower case. |
233 | */ |
234 | #ifndef DEFAULT_CONTENT_TYPE |
235 | #define DEFAULT_CONTENT_TYPE "text/plain" |
236 | #endif |
237 | |
238 | /** |
239 | * NO_CONTENT_TYPE is an alternative DefaultType value that suppresses |
240 | * setting any default type when there's no information (e.g. a proxy). |
241 | */ |
242 | #ifndef NO_CONTENT_TYPE |
243 | #define NO_CONTENT_TYPE "none" |
244 | #endif |
245 | |
246 | /** The name of the MIME types file */ |
247 | #ifndef AP_TYPES_CONFIG_FILE |
248 | #define AP_TYPES_CONFIG_FILE "conf/mime.types" |
249 | #endif |
250 | |
251 | /* |
252 | * Define the HTML doctype strings centrally. |
253 | */ |
254 | /** HTML 2.0 Doctype */ |
255 | #define DOCTYPE_HTML_2_0 "<!DOCTYPE HTML PUBLIC \"-//IETF//" \ |
256 | "DTD HTML 2.0//EN\">\n" |
257 | /** HTML 3.2 Doctype */ |
258 | #define DOCTYPE_HTML_3_2 "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
259 | "DTD HTML 3.2 Final//EN\">\n" |
260 | /** HTML 4.0 Strict Doctype */ |
261 | #define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
262 | "DTD HTML 4.0//EN\"\n" \ |
263 | "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" |
264 | /** HTML 4.0 Transitional Doctype */ |
265 | #define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
266 | "DTD HTML 4.0 Transitional//EN\"\n" \ |
267 | "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" |
268 | /** HTML 4.0 Frameset Doctype */ |
269 | #define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
270 | "DTD HTML 4.0 Frameset//EN\"\n" \ |
271 | "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n" |
272 | /** XHTML 1.0 Strict Doctype */ |
273 | #define DOCTYPE_XHTML_1_0S "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
274 | "DTD XHTML 1.0 Strict//EN\"\n" \ |
275 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
276 | "xhtml1-strict.dtd\">\n" |
277 | /** XHTML 1.0 Transitional Doctype */ |
278 | #define DOCTYPE_XHTML_1_0T "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
279 | "DTD XHTML 1.0 Transitional//EN\"\n" \ |
280 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
281 | "xhtml1-transitional.dtd\">\n" |
282 | /** XHTML 1.0 Frameset Doctype */ |
283 | #define DOCTYPE_XHTML_1_0F "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
284 | "DTD XHTML 1.0 Frameset//EN\"\n" \ |
285 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
286 | "xhtml1-frameset.dtd\">" |
287 | |
288 | /** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */ |
289 | #define HTTP_VERSION(major,minor) (1000* : pass=0 *(major)+ : pass=0 +(minor)) |
290 | /** Major part of HTTP protocol */ |
291 | #define HTTP_VERSION_MAJOR(number) ((number)/1000) |
292 | /** Minor part of HTTP protocol */ |
293 | #define HTTP_VERSION_MINOR(number) ((number)%1000) |
294 | |
295 | /* -------------- Port number for server running standalone --------------- */ |
296 | |
297 | /** default HTTP Port */ |
298 | #define DEFAULT_HTTP_PORT 80 |
299 | /** default HTTPS Port */ |
300 | #define DEFAULT_HTTPS_PORT 443 |
301 | /** |
302 | * Check whether @a port is the default port for the request @a r. |
303 | * @param port The port number |
304 | * @param r The request |
305 | * @see #ap_default_port |
306 | */ |
307 | #define ap_is_default_port(port,r) ((port) == : true=0, false=0 == ap_default_port(r)) |
308 | /** |
309 | * Get the default port for a request (which depends on the scheme). |
310 | * @param r The request |
311 | */ |
312 | #define ap_default_port(r) ap_run_default_port : enter=0, leave=0
ap_run_default_port : server/ line=21 column=1
ap_run_default_port : server/ line=16 column=1
ap_run_default_port : modules/loggers/ line=76 column=1
ap_run_default_port(r) |
313 | /** |
314 | * Get the scheme for a request. |
315 | * @param r The request |
316 | */ |
317 | #define ap_http_scheme(r) ap_run_http_scheme : enter=0, leave=0
ap_run_http_scheme : server/ line=211 column=1
ap_run_http_scheme : server/ line=209 column=1
ap_run_http_scheme(r) |
318 | |
319 | /** The default string length */ |
320 | #define MAX_STRING_LEN HUGE_STRING_LEN |
321 | |
322 | /** The length of a Huge string */ |
323 | #define HUGE_STRING_LEN 8192 |
324 | |
325 | /** The size of the server's internal read-write buffers */ |
326 | #define AP_IOBUFSIZE 8192 |
327 | |
328 | /** The max number of regex captures that can be expanded by ap_pregsub */ |
329 | #define AP_MAX_REG_MATCH 10 |
330 | |
331 | /** |
332 | * APR_HAS_LARGE_FILES introduces the problem of spliting sendfile into |
333 | * mutiple buckets, no greater than MAX(apr_size_t), and more granular |
334 | * than that in case the brigade code/filters attempt to read it directly. |
335 | * ### 16mb is an invention, no idea if it is reasonable. |
336 | */ |
337 | #define AP_MAX_SENDFILE 16777216 /* 2^24 */ |
338 | |
339 | /** |
340 | * MPM child process exit status values |
341 | * The MPM parent process may check the status to see if special |
342 | * error handling is required. |
343 | */ |
344 | /** a normal exit */ |
345 | #define APEXIT_OK 0x0 |
346 | /** A fatal error arising during the server's init sequence */ |
347 | #define APEXIT_INIT 0x2 |
348 | /** The child died during its init sequence */ |
349 | #define APEXIT_CHILDINIT 0x3 |
350 | /** |
351 | * The child exited due to a resource shortage. |
352 | * The parent should limit the rate of forking until |
353 | * the situation is resolved. |
354 | */ |
355 | #define APEXIT_CHILDSICK 0x7 |
356 | /** |
357 | * A fatal error, resulting in the whole server aborting. |
358 | * If a child exits with this error, the parent process |
359 | * considers this a server-wide fatal error and aborts. |
360 | */ |
361 | #define APEXIT_CHILDFATAL 0xf |
362 | |
363 | #ifndef AP_DECLARE |
364 | /** |
365 | * Stuff marked #AP_DECLARE is part of the API, and intended for use |
366 | * by modules. Its purpose is to allow us to add attributes that |
367 | * particular platforms or compilers require to every exported function. |
368 | */ |
369 | # define AP_DECLARE(type) type |
370 | #endif |
371 | |
372 | #ifndef AP_DECLARE_NONSTD |
373 | /** |
374 | * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for |
375 | * use by modules. The difference between #AP_DECLARE and |
376 | * #AP_DECLARE_NONSTD is that the latter is required for any functions |
377 | * which use varargs or are used via indirect function call. This |
378 | * is to accomodate the two calling conventions in windows dlls. |
379 | */ |
380 | # define AP_DECLARE_NONSTD(type) type |
381 | #endif |
382 | #ifndef AP_DECLARE_DATA |
383 | # define AP_DECLARE_DATA |
384 | #endif |
385 | |
386 | #ifndef AP_MODULE_DECLARE |
387 | # define AP_MODULE_DECLARE(type) type |
388 | #endif |
389 | #ifndef AP_MODULE_DECLARE_NONSTD |
390 | # define AP_MODULE_DECLARE_NONSTD(type) type |
391 | #endif |
392 | #ifndef AP_MODULE_DECLARE_DATA |
393 | # define AP_MODULE_DECLARE_DATA |
394 | #endif |
395 | |
396 | /** |
397 | * @internal |
398 | * modules should not use functions marked AP_CORE_DECLARE |
399 | */ |
400 | #ifndef AP_CORE_DECLARE |
401 | # define AP_CORE_DECLARE AP_DECLARE |
402 | #endif |
403 | |
404 | /** |
405 | * @internal |
406 | * modules should not use functions marked AP_CORE_DECLARE_NONSTD |
407 | */ |
408 | |
409 | #ifndef AP_CORE_DECLARE_NONSTD |
410 | # define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD |
411 | #endif |
412 | |
413 | /** |
414 | * @brief The numeric version information is broken out into fields within this |
415 | * structure. |
416 | */ |
417 | typedef struct { |
418 | int major; /**< major number */ |
419 | int minor; /**< minor number */ |
420 | int patch; /**< patch number */ |
421 | const char *add_string; /**< additional string like "-dev" */ |
422 | } ap_version_t; |
423 | |
424 | /** |
425 | * Return httpd's version information in a numeric form. |
426 | * |
427 | * @param version Pointer to a version structure for returning the version |
428 | * information. |
429 | */ |
430 | AP_DECLARE(void) ap_get_server_revision(ap_version_t *version); |
431 | |
432 | /** |
433 | * Get the server version string, as controlled by the ServerTokens directive |
434 | * @return The server version string |
435 | * @deprecated @see ap_get_server_banner() and ap_get_server_description() |
436 | */ |
437 | AP_DECLARE(const char *) ap_get_server_version(void); |
438 | |
439 | /** |
440 | * Get the server banner in a form suitable for sending over the |
441 | * network, with the level of information controlled by the |
442 | * ServerTokens directive. |
443 | * @return The server banner |
444 | */ |
445 | AP_DECLARE(const char *) ap_get_server_banner(void); |
446 | |
447 | /** |
448 | * Get the server description in a form suitable for local displays, |
449 | * status reports, or logging. This includes the detailed server |
450 | * version and information about some modules. It is not affected |
451 | * by the ServerTokens directive. |
452 | * @return The server description |
453 | */ |
454 | AP_DECLARE(const char *) ap_get_server_description(void); |
455 | |
456 | /** |
457 | * Add a component to the server description and banner strings |
458 | * (The latter is returned by the deprecated function |
459 | * ap_get_server_version().) |
460 | * @param pconf The pool to allocate the component from |
461 | * @param component The string to add |
462 | */ |
463 | AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component); |
464 | |
465 | /** |
466 | * Get the date a time that the server was built |
467 | * @return The server build time string |
468 | */ |
469 | AP_DECLARE(const char *) ap_get_server_built(void); |
470 | |
471 | #define DECLINED -1 /**< Module declines to handle */ |
472 | #define DONE -2 /**< Module has served the response completely |
473 | * - it's safe to die() with no more output |
474 | */ |
475 | #define OK 0 /**< Module has handled this stage. */ |
476 | |
477 | |
478 | /** |
479 | * @defgroup HTTP_Status HTTP Status Codes |
480 | * @{ |
481 | */ |
482 | /** |
483 | * The size of the static array in http_protocol.c for storing |
484 | * all of the potential response status-lines (a sparse table). |
485 | * A future version should dynamically generate the apr_table_t at startup. |
486 | */ |
487 | #define RESPONSE_CODES 57 |
488 | |
489 | #define HTTP_CONTINUE 100 |
490 | #define HTTP_SWITCHING_PROTOCOLS 101 |
491 | #define HTTP_PROCESSING 102 |
492 | #define HTTP_OK 200 |
493 | #define HTTP_CREATED 201 |
494 | #define HTTP_ACCEPTED 202 |
495 | #define HTTP_NON_AUTHORITATIVE 203 |
496 | #define HTTP_NO_CONTENT 204 |
497 | #define HTTP_RESET_CONTENT 205 |
498 | #define HTTP_PARTIAL_CONTENT 206 |
499 | #define HTTP_MULTI_STATUS 207 |
500 | #define HTTP_MULTIPLE_CHOICES 300 |
501 | #define HTTP_MOVED_PERMANENTLY 301 |
502 | #define HTTP_MOVED_TEMPORARILY 302 |
503 | #define HTTP_SEE_OTHER 303 |
504 | #define HTTP_NOT_MODIFIED 304 |
505 | #define HTTP_USE_PROXY 305 |
506 | #define HTTP_TEMPORARY_REDIRECT 307 |
507 | #define HTTP_BAD_REQUEST 400 |
508 | #define HTTP_UNAUTHORIZED 401 |
509 | #define HTTP_PAYMENT_REQUIRED 402 |
510 | #define HTTP_FORBIDDEN 403 |
511 | #define HTTP_NOT_FOUND 404 |
512 | #define HTTP_METHOD_NOT_ALLOWED 405 |
513 | #define HTTP_NOT_ACCEPTABLE 406 |
514 | #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407 |
515 | #define HTTP_REQUEST_TIME_OUT 408 |
516 | #define HTTP_CONFLICT 409 |
517 | #define HTTP_GONE 410 |
518 | #define HTTP_LENGTH_REQUIRED 411 |
519 | #define HTTP_PRECONDITION_FAILED 412 |
520 | #define HTTP_REQUEST_ENTITY_TOO_LARGE 413 |
521 | #define HTTP_REQUEST_URI_TOO_LARGE 414 |
522 | #define HTTP_UNSUPPORTED_MEDIA_TYPE 415 |
523 | #define HTTP_RANGE_NOT_SATISFIABLE 416 |
524 | #define HTTP_EXPECTATION_FAILED 417 |
525 | #define HTTP_UNPROCESSABLE_ENTITY 422 |
526 | #define HTTP_LOCKED 423 |
527 | #define HTTP_FAILED_DEPENDENCY 424 |
528 | #define HTTP_UPGRADE_REQUIRED 426 |
529 | #define HTTP_INTERNAL_SERVER_ERROR 500 |
530 | #define HTTP_NOT_IMPLEMENTED 501 |
531 | #define HTTP_BAD_GATEWAY 502 |
532 | #define HTTP_SERVICE_UNAVAILABLE 503 |
533 | #define HTTP_GATEWAY_TIME_OUT 504 |
534 | #define HTTP_VERSION_NOT_SUPPORTED 505 |
535 | #define HTTP_VARIANT_ALSO_VARIES 506 |
536 | #define HTTP_INSUFFICIENT_STORAGE 507 |
537 | #define HTTP_NOT_EXTENDED 510 |
538 | |
539 | /** is the status code informational */ |
540 | #define ap_is_HTTP_INFO(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 100)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 200)) |
541 | /** is the status code OK ?*/ |
542 | #define ap_is_HTTP_SUCCESS(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 200)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 300)) |
543 | /** is the status code a redirect */ |
544 | #define ap_is_HTTP_REDIRECT(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 300)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 400)) |
545 | /** is the status code a error (client or server) */ |
546 | #define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600)) |
547 | /** is the status code a client error */ |
548 | #define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500)) |
549 | /** is the status code a server error */ |
550 | #define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600)) |
551 | /** is the status code a (potentially) valid response code? */ |
552 | #define ap_is_HTTP_VALID_RESPONSE(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 100)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 600)) |
553 | |
554 | /** should the status code drop the connection */ |
555 | #define ap_status_drops_connection(x) \ |
556 | (((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_BAD_REQUEST) || : true=0, false=0 || \ |
557 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_TIME_OUT) || : true=0, false=0 || \ |
558 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_LENGTH_REQUIRED) || : true=0, false=0 || \ |
559 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_ENTITY_TOO_LARGE) || : true=0, false=0 || \ |
560 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_URI_TOO_LARGE) || : true=0, false=0 || \ |
561 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_INTERNAL_SERVER_ERROR) || : true=0, false=0 || \ |
562 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_SERVICE_UNAVAILABLE) || : true=0, false=0 || \ |
563 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_NOT_IMPLEMENTED)) |
564 | /** @} */ |
565 | |
566 | /** |
567 | * @defgroup Methods List of Methods recognized by the server |
568 | * @ingroup APACHE_CORE_DAEMON |
569 | * @{ |
570 | * |
571 | * @brief Methods recognized (but not necessarily handled) by the server. |
572 | * |
573 | * These constants are used in bit shifting masks of size int, so it is |
574 | * unsafe to have more methods than bits in an int. HEAD == M_GET. |
575 | * This list must be tracked by the list in http_protocol.c in routine |
576 | * ap_method_name_of(). |
577 | * |
578 | */ |
579 | |
580 | #define M_GET 0 /** RFC 2616: HTTP */ |
581 | #define M_PUT 1 /* : */ |
582 | #define M_POST 2 |
583 | #define M_DELETE 3 |
584 | #define M_CONNECT 4 |
585 | #define M_OPTIONS 5 |
586 | #define M_TRACE 6 /** RFC 2616: HTTP */ |
587 | #define M_PATCH 7 /** no rfc(!) ### remove this one? */ |
588 | #define M_PROPFIND 8 /** RFC 2518: WebDAV */ |
589 | #define M_PROPPATCH 9 /* : */ |
590 | #define M_MKCOL 10 |
591 | #define M_COPY 11 |
592 | #define M_MOVE 12 |
593 | #define M_LOCK 13 |
594 | #define M_UNLOCK 14 /** RFC 2518: WebDAV */ |
595 | #define M_VERSION_CONTROL 15 /** RFC 3253: WebDAV Versioning */ |
596 | #define M_CHECKOUT 16 /* : */ |
597 | #define M_UNCHECKOUT 17 |
598 | #define M_CHECKIN 18 |
599 | #define M_UPDATE 19 |
600 | #define M_LABEL 20 |
601 | #define M_REPORT 21 |
602 | #define M_MKWORKSPACE 22 |
603 | #define M_MKACTIVITY 23 |
604 | #define M_BASELINE_CONTROL 24 |
605 | #define M_MERGE 25 |
606 | #define M_INVALID 26 /** RFC 3253: WebDAV Versioning */ |
607 | |
608 | /** |
609 | * METHODS needs to be equal to the number of bits |
610 | * we are using for limit masks. |
611 | */ |
612 | #define METHODS 64 |
613 | |
614 | /** |
615 | * The method mask bit to shift for anding with a bitmask. |
616 | */ |
617 | #define AP_METHOD_BIT ((apr_int64_t)1) |
618 | /** @} */ |
619 | |
620 | |
621 | /** @see ap_method_list_t */ |
622 | typedef struct ap_method_list_t ap_method_list_t; |
623 | |
624 | /** |
625 | * @struct ap_method_list_t |
626 | * @brief Structure for handling HTTP methods. |
627 | * |
628 | * Methods known to the server are accessed via a bitmask shortcut; |
629 | * extension methods are handled by an array. |
630 | */ |
631 | struct ap_method_list_t { |
632 | /** The bitmask used for known methods */ |
633 | apr_int64_t method_mask; |
634 | /** the array used for extension methods */ |
635 | apr_array_header_t *method_list; |
636 | }; |
637 | |
638 | /** |
639 | * @defgroup module_magic Module Magic mime types |
640 | * @{ |
641 | */ |
642 | /** Magic for mod_cgi[d] */ |
643 | #define CGI_MAGIC_TYPE "application/x-httpd-cgi" |
644 | /** Magic for mod_include */ |
645 | #define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html" |
646 | /** Magic for mod_include */ |
647 | #define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3" |
648 | /** Magic for mod_dir */ |
649 | #define DIR_MAGIC_TYPE "httpd/unix-directory" |
650 | |
651 | /** @} */ |
652 | /* Just in case your linefeed isn't the one the other end is expecting. */ |
653 | #if !APR_CHARSET_EBCDIC |
654 | /** linefeed */ |
655 | #define LF 10 |
656 | /** carrige return */ |
657 | #define CR 13 |
658 | /** carrige return /Line Feed Combo */ |
659 | #define CRLF "\015\012" |
660 | #else /* APR_CHARSET_EBCDIC */ |
661 | /* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done |
662 | * in the buff package (bread/bputs/bwrite). Everywhere else, we use |
663 | * "native EBCDIC" CR and NL characters. These are therefore |
664 | * defined as |
665 | * '\r' and '\n'. |
666 | */ |
667 | #define CR '\r' |
668 | #define LF '\n' |
669 | #define CRLF "\r\n" |
670 | #endif /* APR_CHARSET_EBCDIC */ |
671 | /** Useful for common code with either platform charset. */ |
672 | #define CRLF_ASCII "\015\012" |
673 | |
674 | /** |
675 | * @defgroup values_request_rec_body Possible values for request_rec.read_body |
676 | * @{ |
677 | * Possible values for request_rec.read_body (set by handling module): |
678 | */ |
679 | |
680 | /** Send 413 error if message has any body */ |
681 | #define REQUEST_NO_BODY 0 |
682 | /** Send 411 error if body without Content-Length */ |
683 | #define REQUEST_CHUNKED_ERROR 1 |
684 | /** If chunked, remove the chunks for me. */ |
685 | #define REQUEST_CHUNKED_DECHUNK 2 |
686 | /** @} // values_request_rec_body */ |
687 | |
688 | /** |
689 | * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info |
690 | * @ingroup APACHE_CORE_DAEMON |
691 | * @{ |
692 | * Possible values for request_rec.used_path_info: |
693 | */ |
694 | |
695 | /** Accept the path_info from the request */ |
696 | #define AP_REQ_ACCEPT_PATH_INFO 0 |
697 | /** Return a 404 error if path_info was given */ |
698 | #define AP_REQ_REJECT_PATH_INFO 1 |
699 | /** Module may chose to use the given path_info */ |
700 | #define AP_REQ_DEFAULT_PATH_INFO 2 |
701 | |
702 | /** @} // values_request_rec_used_path_info */ |
703 | |
704 | |
705 | /* |
706 | * Things which may vary per file-lookup WITHIN a request --- |
707 | * e.g., state of MIME config. Basically, the name of an object, info |
708 | * about the object, and any other info we may ahve which may need to |
709 | * change as we go poking around looking for it (e.g., overridden by |
710 | * .htaccess files). |
711 | * |
712 | * Note how the default state of almost all these things is properly |
713 | * zero, so that allocating it with pcalloc does the right thing without |
714 | * a whole lot of hairy initialization... so long as we are willing to |
715 | * make the (fairly) portable assumption that the bit pattern of a NULL |
716 | * pointer is, in fact, zero. |
717 | */ |
718 | |
719 | /** |
720 | * @brief This represents the result of calling htaccess; these are cached for |
721 | * each request. |
722 | */ |
723 | struct htaccess_result { |
724 | /** the directory to which this applies */ |
725 | const char *dir; |
726 | /** the overrides allowed for the .htaccess file */ |
727 | int override; |
728 | /** the override options allowed for the .htaccess file */ |
729 | int override_opts; |
730 | /** the configuration directives */ |
731 | struct ap_conf_vector_t *htaccess; |
732 | /** the next one, or NULL if no more; N.B. never change this */ |
733 | const struct htaccess_result *next; |
734 | }; |
735 | |
736 | /* The following four types define a hierarchy of activities, so that |
737 | * given a request_rec r you can write r->connection->server->process |
738 | * to get to the process_rec. While this reduces substantially the |
739 | * number of arguments that various hooks require beware that in |
740 | * threaded versions of the server you must consider multiplexing |
741 | * issues. */ |
742 | |
743 | |
744 | /** A structure that represents one process */ |
745 | typedef struct process_rec process_rec; |
746 | /** A structure that represents a virtual server */ |
747 | typedef struct server_rec server_rec; |
748 | /** A structure that represents one connection */ |
749 | typedef struct conn_rec conn_rec; |
750 | /** A structure that represents the current request */ |
751 | typedef struct request_rec request_rec; |
752 | /** A structure that represents the status of the current connection */ |
753 | typedef struct conn_state_t conn_state_t; |
754 | |
755 | /* ### would be nice to not include this from httpd.h ... */ |
756 | /* This comes after we have defined the request_rec type */ |
757 | #include "apr_uri.h" |
758 | |
759 | /** |
760 | * @brief A structure that represents one process |
761 | */ |
762 | struct process_rec { |
763 | /** Global pool. Cleared upon normal exit */ |
764 | apr_pool_t *pool; |
765 | /** Configuration pool. Cleared upon restart */ |
766 | apr_pool_t *pconf; |
767 | /** Number of command line arguments passed to the program */ |
768 | int argc; |
769 | /** The command line arguments */ |
770 | const char * const *argv; |
771 | /** The program name used to execute the program */ |
772 | const char *short_name; |
773 | }; |
774 | |
775 | /** |
776 | * @brief A structure that represents the current request |
777 | */ |
778 | struct request_rec { |
779 | /** The pool associated with the request */ |
780 | apr_pool_t *pool; |
781 | /** The connection to the client */ |
782 | conn_rec *connection; |
783 | /** The virtual host for this request */ |
784 | server_rec *server; |
785 | |
786 | /** Pointer to the redirected request if this is an external redirect */ |
787 | request_rec *next; |
788 | /** Pointer to the previous request if this is an internal redirect */ |
789 | request_rec *prev; |
790 | |
791 | /** Pointer to the main request if this is a sub-request |
792 | * (see http_request.h) */ |
793 | request_rec *main; |
794 | |
795 | /* Info about the request itself... we begin with stuff that only |
796 | * protocol.c should ever touch... |
797 | */ |
798 | /** First line of request */ |
799 | char *the_request; |
800 | /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */ |
801 | int assbackwards; |
802 | /** A proxy request (calculated during post_read_request/translate_name) |
803 | * possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE, |
804 | * PROXYREQ_RESPONSE |
805 | */ |
806 | int proxyreq; |
807 | /** HEAD request, as opposed to GET */ |
808 | int header_only; |
809 | /** Protocol string, as given to us, or HTTP/0.9 */ |
810 | char *protocol; |
811 | /** Protocol version number of protocol; 1.1 = 1001 */ |
812 | int proto_num; |
813 | /** Host, as set by full URI or Host: */ |
814 | const char *hostname; |
815 | |
816 | /** Time when the request started */ |
817 | apr_time_t request_time; |
818 | |
819 | /** Status line, if set by script */ |
820 | const char *status_line; |
821 | /** Status line */ |
822 | int status; |
823 | |
824 | /* Request method, two ways; also, protocol, etc.. Outside of protocol.c, |
825 | * look, but don't touch. |
826 | */ |
827 | |
828 | /** Request method (eg. GET, HEAD, POST, etc.) */ |
829 | const char *method; |
830 | /** M_GET, M_POST, etc. */ |
831 | int method_number; |
832 | |
833 | /** |
834 | * 'allowed' is a bitvector of the allowed methods. |
835 | * |
836 | * A handler must ensure that the request method is one that |
837 | * it is capable of handling. Generally modules should DECLINE |
838 | * any request methods they do not handle. Prior to aborting the |
839 | * handler like this the handler should set r->allowed to the list |
840 | * of methods that it is willing to handle. This bitvector is used |
841 | * to construct the "Allow:" header required for OPTIONS requests, |
842 | * and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes. |
843 | * |
844 | * Since the default_handler deals with OPTIONS, all modules can |
845 | * usually decline to deal with OPTIONS. TRACE is always allowed, |
846 | * modules don't need to set it explicitly. |
847 | * |
848 | * Since the default_handler will always handle a GET, a |
849 | * module which does *not* implement GET should probably return |
850 | * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET |
851 | * handler can't be installed by mod_actions. |
852 | */ |
853 | apr_int64_t allowed; |
854 | /** Array of extension methods */ |
855 | apr_array_header_t *allowed_xmethods; |
856 | /** List of allowed methods */ |
857 | ap_method_list_t *allowed_methods; |
858 | |
859 | /** byte count in stream is for body */ |
860 | apr_off_t sent_bodyct; |
861 | /** body byte count, for easy access */ |
862 | apr_off_t bytes_sent; |
863 | /** Last modified time of the requested resource */ |
864 | apr_time_t mtime; |
865 | |
866 | /* HTTP/1.1 connection-level features */ |
867 | |
868 | /** sending chunked transfer-coding */ |
869 | int chunked; |
870 | /** The Range: header */ |
871 | const char *range; |
872 | /** The "real" content length */ |
873 | apr_off_t clength; |
874 | |
875 | /** Remaining bytes left to read from the request body */ |
876 | apr_off_t remaining; |
877 | /** Number of bytes that have been read from the request body */ |
878 | apr_off_t read_length; |
879 | /** Method for reading the request body |
880 | * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY, |
881 | * REQUEST_CHUNKED_DECHUNK, etc...) */ |
882 | int read_body; |
883 | /** reading chunked transfer-coding */ |
884 | int read_chunked; |
885 | /** is client waiting for a 100 response? */ |
886 | unsigned expecting_100; |
887 | |
888 | /* MIME header environments, in and out. Also, an array containing |
889 | * environment variables to be passed to subprocesses, so people can |
890 | * write modules to add to that environment. |
891 | * |
892 | * The difference between headers_out and err_headers_out is that the |
893 | * latter are printed even on error, and persist across internal redirects |
894 | * (so the headers printed for ErrorDocument handlers will have them). |
895 | * |
896 | * The 'notes' apr_table_t is for notes from one module to another, with no |
897 | * other set purpose in mind... |
898 | */ |
899 | |
900 | /** MIME header environment from the request */ |
901 | apr_table_t *headers_in; |
902 | /** MIME header environment for the response */ |
903 | apr_table_t *headers_out; |
904 | /** MIME header environment for the response, printed even on errors and |
905 | * persist across internal redirects */ |
906 | apr_table_t *err_headers_out; |
907 | /** Array of environment variables to be used for sub processes */ |
908 | apr_table_t *subprocess_env; |
909 | /** Notes from one module to another */ |
910 | apr_table_t *notes; |
911 | |
912 | /* content_type, handler, content_encoding, and all content_languages |
913 | * MUST be lowercased strings. They may be pointers to static strings; |
914 | * they should not be modified in place. |
915 | */ |
916 | /** The content-type for the current request */ |
917 | const char *content_type; /* Break these out --- we dispatch on 'em */ |
918 | /** The handler string that we use to call a handler function */ |
919 | const char *handler; /* What we *really* dispatch on */ |
920 | |
921 | /** How to encode the data */ |
922 | const char *content_encoding; |
923 | /** Array of strings representing the content languages */ |
924 | apr_array_header_t *content_languages; |
925 | |
926 | /** variant list validator (if negotiated) */ |
927 | char *vlist_validator; |
928 | |
929 | /** If an authentication check was made, this gets set to the user name. */ |
930 | char *user; |
931 | /** If an authentication check was made, this gets set to the auth type. */ |
932 | char *ap_auth_type; |
933 | |
934 | /** This response can not be cached */ |
935 | int no_cache; |
936 | /** There is no local copy of this response */ |
937 | int no_local_copy; |
938 | |
939 | /* What object is being requested (either directly, or via include |
940 | * or content-negotiation mapping). |
941 | */ |
942 | |
943 | /** The URI without any parsing performed */ |
944 | char *unparsed_uri; |
945 | /** The path portion of the URI, or "/" if no path provided */ |
946 | char *uri; |
947 | /** The filename on disk corresponding to this response */ |
948 | char *filename; |
949 | /* XXX: What does this mean? Please define "canonicalize" -aaron */ |
950 | /** The true filename, we canonicalize r->filename if these don't match */ |
951 | char *canonical_filename; |
952 | /** The PATH_INFO extracted from this request */ |
953 | char *path_info; |
954 | /** The QUERY_ARGS extracted from this request */ |
955 | char *args; |
956 | /** finfo.protection (st_mode) set to zero if no such file */ |
957 | apr_finfo_t finfo; |
958 | /** A struct containing the components of URI */ |
959 | apr_uri_t parsed_uri; |
960 | |
961 | /** |
962 | * Flag for the handler to accept or reject path_info on |
963 | * the current request. All modules should respect the |
964 | * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO |
965 | * values, while AP_REQ_DEFAULT_PATH_INFO indicates they |
966 | * may follow existing conventions. This is set to the |
967 | * user's preference upon HOOK_VERY_FIRST of the fixups. |
968 | */ |
969 | int used_path_info; |
970 | |
971 | /* Various other config info which may change with .htaccess files |
972 | * These are config vectors, with one void* pointer for each module |
973 | * (the thing pointed to being the module's business). |
974 | */ |
975 | |
976 | /** Options set in config files, etc. */ |
977 | struct ap_conf_vector_t *per_dir_config; |
978 | /** Notes on *this* request */ |
979 | struct ap_conf_vector_t *request_config; |
980 | |
981 | /** |
982 | * A linked list of the .htaccess configuration directives |
983 | * accessed by this request. |
984 | * N.B. always add to the head of the list, _never_ to the end. |
985 | * that way, a sub request's list can (temporarily) point to a parent's list |
986 | */ |
987 | const struct htaccess_result *htaccess; |
988 | |
989 | /** A list of output filters to be used for this request */ |
990 | struct ap_filter_t *output_filters; |
991 | /** A list of input filters to be used for this request */ |
992 | struct ap_filter_t *input_filters; |
993 | |
994 | /** A list of protocol level output filters to be used for this |
995 | * request */ |
996 | struct ap_filter_t *proto_output_filters; |
997 | /** A list of protocol level input filters to be used for this |
998 | * request */ |
999 | struct ap_filter_t *proto_input_filters; |
1000 | |
1001 | /** A flag to determine if the eos bucket has been sent yet */ |
1002 | int eos_sent; |
1003 | |
1004 | /* Things placed at the end of the record to avoid breaking binary |
1005 | * compatibility. It would be nice to remember to reorder the entire |
1006 | * record to improve 64bit alignment the next time we need to break |
1007 | * binary compatibility for some other reason. |
1008 | */ |
1009 | |
1010 | /** MIME trailer environment from the request */ |
1011 | apr_table_t *trailers_in; |
1012 | /** MIME trailer environment from the response */ |
1013 | apr_table_t *trailers_out; |
1014 | }; |
1015 | |
1016 | /** |
1017 | * @defgroup ProxyReq Proxy request types |
1018 | * |
1019 | * Possible values of request_rec->proxyreq. A request could be normal, |
1020 | * proxied or reverse proxied. Normally proxied and reverse proxied are |
1021 | * grouped together as just "proxied", but sometimes it's necessary to |
1022 | * tell the difference between the two, such as for authentication. |
1023 | * @{ |
1024 | */ |
1025 | |
1026 | #define PROXYREQ_NONE 0 /**< No proxy */ |
1027 | #define PROXYREQ_PROXY 1 /**< Standard proxy */ |
1028 | #define PROXYREQ_REVERSE 2 /**< Reverse proxy */ |
1029 | #define PROXYREQ_RESPONSE 3 /**< Origin response */ |
1030 | |
1031 | /* @} */ |
1032 | |
1033 | /** |
1034 | * @brief Enumeration of connection keepalive options |
1035 | */ |
1036 | typedef enum { |
1037 | AP_CONN_UNKNOWN, |
1038 | AP_CONN_CLOSE, |
1039 | AP_CONN_KEEPALIVE |
1040 | } ap_conn_keepalive_e; |
1041 | |
1042 | /** |
1043 | * @brief Structure to store things which are per connection |
1044 | */ |
1045 | struct conn_rec { |
1046 | /** Pool associated with this connection */ |
1047 | apr_pool_t *pool; |
1048 | /** Physical vhost this conn came in on */ |
1049 | server_rec *base_server; |
1050 | /** used by http_vhost.c */ |
1051 | void *vhost_lookup_data; |
1052 | |
1053 | /* Information about the connection itself */ |
1054 | /** local address */ |
1055 | apr_sockaddr_t *local_addr; |
1056 | /** remote address */ |
1057 | apr_sockaddr_t *remote_addr; |
1058 | |
1059 | /** Client's IP address */ |
1060 | char *remote_ip; |
1061 | /** Client's DNS name, if known. NULL if DNS hasn't been checked, |
1062 | * "" if it has and no address was found. N.B. Only access this though |
1063 | * get_remote_host() */ |
1064 | char *remote_host; |
1065 | /** Only ever set if doing rfc1413 lookups. N.B. Only access this through |
1066 | * get_remote_logname() */ |
1067 | char *remote_logname; |
1068 | |
1069 | /** Are we still talking? */ |
1070 | unsigned aborted:1; |
1071 | |
1072 | /** Are we going to keep the connection alive for another request? |
1073 | * @see ap_conn_keepalive_e */ |
1074 | ap_conn_keepalive_e keepalive; |
1075 | |
1076 | /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, |
1077 | * 1 yes/success */ |
1078 | signed int double_reverse:2; |
1079 | |
1080 | /** How many times have we used it? */ |
1081 | int keepalives; |
1082 | /** server IP address */ |
1083 | char *local_ip; |
1084 | /** used for ap_get_server_name when UseCanonicalName is set to DNS |
1085 | * (ignores setting of HostnameLookups) */ |
1086 | char *local_host; |
1087 | |
1088 | /** ID of this connection; unique at any point in time */ |
1089 | long id; |
1090 | /** Config vector containing pointers to connections per-server |
1091 | * config structures. */ |
1092 | struct ap_conf_vector_t *conn_config; |
1093 | /** Notes on *this* connection: send note from one module to |
1094 | * another. must remain valid for all requests on this conn */ |
1095 | apr_table_t *notes; |
1096 | /** A list of input filters to be used for this connection */ |
1097 | struct ap_filter_t *input_filters; |
1098 | /** A list of output filters to be used for this connection */ |
1099 | struct ap_filter_t *output_filters; |
1100 | /** handle to scoreboard information for this connection */ |
1101 | void *sbh; |
1102 | /** The bucket allocator to use for all bucket/brigade creations */ |
1103 | struct apr_bucket_alloc_t *bucket_alloc; |
1104 | /** The current state of this connection */ |
1105 | conn_state_t *cs; |
1106 | /** Is there data pending in the input filters? */ |
1107 | int data_in_input_filters; |
1108 | |
1109 | /** Are there any filters that clogg/buffer the input stream, breaking |
1110 | * the event mpm. |
1111 | */ |
1112 | int clogging_input_filters; |
1113 | }; |
1114 | |
1115 | /** |
1116 | * Enumeration of connection states |
1117 | */ |
1118 | typedef enum { |
1119 | CONN_STATE_CHECK_REQUEST_LINE_READABLE, |
1120 | CONN_STATE_READ_REQUEST_LINE, |
1121 | CONN_STATE_LINGER |
1122 | } conn_state_e; |
1123 | |
1124 | /** |
1125 | * @brief A structure to contain connection state information |
1126 | */ |
1127 | struct conn_state_t { |
1128 | /** APR_RING of expiration timeouts */ |
1129 | APR_RING_ENTRY(conn_state_t) timeout_list; |
1130 | /** the expiration time of the next keepalive timeout */ |
1131 | apr_time_t expiration_time; |
1132 | /** Current state of the connection */ |
1133 | conn_state_e state; |
1134 | /** connection record this struct refers to */ |
1135 | conn_rec *c; |
1136 | /** memory pool to allocate from */ |
1137 | apr_pool_t *p; |
1138 | /** bucket allocator */ |
1139 | apr_bucket_alloc_t *bucket_alloc; |
1140 | /** poll file decriptor information */ |
1141 | apr_pollfd_t pfd; |
1142 | }; |
1143 | |
1144 | /* Per-vhost config... */ |
1145 | |
1146 | /** |
1147 | * The address 255.255.255.255, when used as a virtualhost address, |
1148 | * will become the "default" server when the ip doesn't match other vhosts. |
1149 | */ |
1150 | #define DEFAULT_VHOST_ADDR 0xfffffffful |
1151 | |
1152 | |
1153 | /** |
1154 | * @struct server_addr_rec |
1155 | * @brief A structure to be used for Per-vhost config |
1156 | */ |
1157 | typedef struct server_addr_rec server_addr_rec; |
1158 | struct server_addr_rec { |
1159 | /** The next server in the list */ |
1160 | server_addr_rec *next; |
1161 | /** The bound address, for this server */ |
1162 | apr_sockaddr_t *host_addr; |
1163 | /** The bound port, for this server */ |
1164 | apr_port_t host_port; |
1165 | /** The name given in "<VirtualHost>" */ |
1166 | char *virthost; |
1167 | }; |
1168 | |
1169 | /** |
1170 | * @brief A structure to store information for each virtual server |
1171 | */ |
1172 | struct server_rec { |
1173 | /** The process this server is running in */ |
1174 | process_rec *process; |
1175 | /** The next server in the list */ |
1176 | server_rec *next; |
1177 | |
1178 | /** The name of the server */ |
1179 | const char *defn_name; |
1180 | /** The line of the config file that the server was defined on */ |
1181 | unsigned defn_line_number; |
1182 | |
1183 | /* Contact information */ |
1184 | |
1185 | /** The admin's contact information */ |
1186 | char *server_admin; |
1187 | /** The server hostname */ |
1188 | char *server_hostname; |
1189 | /** for redirects, etc. */ |
1190 | apr_port_t port; |
1191 | |
1192 | /* Log files --- note that transfer log is now in the modules... */ |
1193 | |
1194 | /** The name of the error log */ |
1195 | char *error_fname; |
1196 | /** A file descriptor that references the error log */ |
1197 | apr_file_t *error_log; |
1198 | /** The log level for this server */ |
1199 | int loglevel; |
1200 | |
1201 | /* Module-specific configuration for server, and defaults... */ |
1202 | |
1203 | /** true if this is the virtual server */ |
1204 | int is_virtual; |
1205 | /** Config vector containing pointers to modules' per-server config |
1206 | * structures. */ |
1207 | struct ap_conf_vector_t *module_config; |
1208 | /** MIME type info, etc., before we start checking per-directory info */ |
1209 | struct ap_conf_vector_t *lookup_defaults; |
1210 | |
1211 | /* Transaction handling */ |
1212 | |
1213 | /** I haven't got a clue */ |
1214 | server_addr_rec *addrs; |
1215 | /** Timeout, as an apr interval, before we give up */ |
1216 | apr_interval_time_t timeout; |
1217 | /** The apr interval we will wait for another request */ |
1218 | apr_interval_time_t keep_alive_timeout; |
1219 | /** Maximum requests per connection */ |
1220 | int keep_alive_max; |
1221 | /** Use persistent connections? */ |
1222 | int keep_alive; |
1223 | |
1224 | /** Pathname for ServerPath */ |
1225 | const char *path; |
1226 | /** Length of path */ |
1227 | int pathlen; |
1228 | |
1229 | /** Normal names for ServerAlias servers */ |
1230 | apr_array_header_t *names; |
1231 | /** Wildcarded names for ServerAlias servers */ |
1232 | apr_array_header_t *wild_names; |
1233 | |
1234 | /** limit on size of the HTTP request line */ |
1235 | int limit_req_line; |
1236 | /** limit on size of any request header field */ |
1237 | int limit_req_fieldsize; |
1238 | /** limit on number of request header fields */ |
1239 | int limit_req_fields; |
1240 | |
1241 | /** The server request scheme for redirect responses */ |
1242 | const char *server_scheme; |
1243 | }; |
1244 | |
1245 | typedef struct core_output_filter_ctx { |
1246 | apr_bucket_brigade *b; |
1247 | /** subpool of c->pool used for resources |
1248 | * which may outlive the request |
1249 | */ |
1250 | apr_pool_t *deferred_write_pool; |
1251 | } core_output_filter_ctx_t; |
1252 | |
1253 | typedef struct core_filter_ctx { |
1254 | apr_bucket_brigade *b; |
1255 | apr_bucket_brigade *tmpbb; |
1256 | } core_ctx_t; |
1257 | |
1258 | typedef struct core_net_rec { |
1259 | /** Connection to the client */ |
1260 | apr_socket_t *client_socket; |
1261 | |
1262 | /** connection record */ |
1263 | conn_rec *c; |
1264 | |
1265 | core_output_filter_ctx_t *out_ctx; |
1266 | core_ctx_t *in_ctx; |
1267 | } core_net_rec; |
1268 | |
1269 | /** |
1270 | * Examine a field value (such as a media-/content-type) string and return |
1271 | * it sans any parameters; e.g., strip off any ';charset=foo' and the like. |
1272 | * @param p Pool to allocate memory from |
1273 | * @param intype The field to examine |
1274 | * @return A copy of the field minus any parameters |
1275 | */ |
1276 | AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype); |
1277 | |
1278 | /** |
1279 | * Convert a time from an integer into a string in a specified format |
1280 | * @param p The pool to allocate memory from |
1281 | * @param t The time to convert |
1282 | * @param fmt The format to use for the conversion |
1283 | * @param gmt Convert the time for GMT? |
1284 | * @return The string that represents the specified time |
1285 | */ |
1286 | AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt); |
1287 | |
1288 | /* String handling. The *_nc variants allow you to use non-const char **s as |
1289 | arguments (unfortunately C won't automatically convert a char ** to a const |
1290 | char **) */ |
1291 | |
1292 | /** |
1293 | * Get the characters until the first occurance of a specified character |
1294 | * @param p The pool to allocate memory from |
1295 | * @param line The string to get the characters from |
1296 | * @param stop The character to stop at |
1297 | * @return A copy of the characters up to the first stop character |
1298 | */ |
1299 | AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop); |
1300 | |
1301 | /** |
1302 | * Get the characters until the first occurance of a specified character |
1303 | * @param p The pool to allocate memory from |
1304 | * @param line The string to get the characters from |
1305 | * @param stop The character to stop at |
1306 | * @return A copy of the characters up to the first stop character |
1307 | * @note This is the same as ap_getword(), except it doesn't use const char **. |
1308 | */ |
1309 | AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop); |
1310 | |
1311 | /** |
1312 | * Get the first word from a given string. A word is defined as all characters |
1313 | * up to the first whitespace. |
1314 | * @param p The pool to allocate memory from |
1315 | * @param line The string to traverse |
1316 | * @return The first word in the line |
1317 | */ |
1318 | AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line); |
1319 | |
1320 | /** |
1321 | * Get the first word from a given string. A word is defined as all characters |
1322 | * up to the first whitespace. |
1323 | * @param p The pool to allocate memory from |
1324 | * @param line The string to traverse |
1325 | * @return The first word in the line |
1326 | * @note The same as ap_getword_white(), except it doesn't use const char** |
1327 | */ |
1328 | AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line); |
1329 | |
1330 | /** |
1331 | * Get all characters from the first occurance of @a stop to the first "\0" |
1332 | * @param p The pool to allocate memory from |
1333 | * @param line The line to traverse |
1334 | * @param stop The character to start at |
1335 | * @return A copy of all caracters after the first occurance of the specified |
1336 | * character |
1337 | */ |
1338 | AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line, |
1339 | char stop); |
1340 | |
1341 | /** |
1342 | * Get all characters from the first occurance of @a stop to the first "\0" |
1343 | * @param p The pool to allocate memory from |
1344 | * @param line The line to traverse |
1345 | * @param stop The character to start at |
1346 | * @return A copy of all caracters after the first occurance of the specified |
1347 | * character |
1348 | * @note The same as ap_getword_nulls(), except it doesn't use const char **. |
1349 | */ |
1350 | AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop); |
1351 | |
1352 | /** |
1353 | * Get the second word in the string paying attention to quoting |
1354 | * @param p The pool to allocate from |
1355 | * @param line The line to traverse |
1356 | * @return A copy of the string |
1357 | */ |
1358 | AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line); |
1359 | |
1360 | /** |
1361 | * Get the second word in the string paying attention to quoting |
1362 | * @param p The pool to allocate from |
1363 | * @param line The line to traverse |
1364 | * @return A copy of the string |
1365 | * @note The same as ap_getword_conf(), except it doesn't use const char **. |
1366 | */ |
1367 | AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line); |
1368 | |
1369 | /** |
1370 | * Check a string for any ${ENV} environment variable construct and replace |
1371 | * each them by the value of that environment variable, if it exists. If the |
1372 | * environment value does not exist, leave the ${ENV} construct alone; it |
1373 | * means something else. |
1374 | * @param p The pool to allocate from |
1375 | * @param word The string to check |
1376 | * @return The string with the replaced environment variables |
1377 | */ |
1378 | AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word); |
1379 | |
1380 | /** |
1381 | * Size an HTTP header field list item, as separated by a comma. |
1382 | * @param field The field to size |
1383 | * @param len The length of the field |
1384 | * @return The return value is a pointer to the beginning of the non-empty |
1385 | * list item within the original string (or NULL if there is none) and the |
1386 | * address of field is shifted to the next non-comma, non-whitespace |
1387 | * character. len is the length of the item excluding any beginning whitespace. |
1388 | */ |
1389 | AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len); |
1390 | |
1391 | /** |
1392 | * Retrieve an HTTP header field list item, as separated by a comma, |
1393 | * while stripping insignificant whitespace and lowercasing anything not in |
1394 | * a quoted string or comment. |
1395 | * @param p The pool to allocate from |
1396 | * @param field The field to retrieve |
1397 | * @return The return value is a new string containing the converted list |
1398 | * item (or NULL if none) and the address pointed to by field is |
1399 | * shifted to the next non-comma, non-whitespace. |
1400 | */ |
1401 | AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field); |
1402 | |
1403 | /** |
1404 | * Find an item in canonical form (lowercase, no extra spaces) within |
1405 | * an HTTP field value list. |
1406 | * @param p The pool to allocate from |
1407 | * @param line The field value list to search |
1408 | * @param tok The token to search for |
1409 | * @return 1 if found, 0 if not found. |
1410 | */ |
1411 | AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok); |
1412 | |
1413 | /** |
1414 | * Retrieve a token, spacing over it and adjusting the pointer to |
1415 | * the first non-white byte afterwards. Note that these tokens |
1416 | * are delimited by semis and commas and can also be delimited |
1417 | * by whitespace at the caller's option. |
1418 | * @param p The pool to allocate from |
1419 | * @param accept_line The line to retrieve the token from (adjusted afterwards) |
1420 | * @param accept_white Is it delimited by whitespace |
1421 | * @return the token |
1422 | */ |
1423 | AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white); |
1424 | |
1425 | /** |
1426 | * Find http tokens, see the definition of token from RFC2068 |
1427 | * @param p The pool to allocate from |
1428 | * @param line The line to find the token |
1429 | * @param tok The token to find |
1430 | * @return 1 if the token is found, 0 otherwise |
1431 | */ |
1432 | AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok); |
1433 | |
1434 | /** |
1435 | * find http tokens from the end of the line |
1436 | * @param p The pool to allocate from |
1437 | * @param line The line to find the token |
1438 | * @param tok The token to find |
1439 | * @return 1 if the token is found, 0 otherwise |
1440 | */ |
1441 | AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok); |
1442 | |
1443 | /** |
1444 | * Check for an Absolute URI syntax |
1445 | * @param u The string to check |
1446 | * @return 1 if URI, 0 otherwise |
1447 | */ |
1448 | AP_DECLARE(int) ap_is_url(const char *u); |
1449 | |
1450 | /** |
1451 | * Unescape a URL |
1452 | * @param url The url to unescape |
1453 | * @return 0 on success, non-zero otherwise |
1454 | */ |
1455 | AP_DECLARE(int) ap_unescape_url(char *url); |
1456 | |
1457 | /** |
1458 | * Unescape a URL, including encoded slashes. |
1459 | * @param url The url to unescape |
1460 | * @return 0 on success, non-zero otherwise |
1461 | */ |
1462 | AP_DECLARE(int) ap_unescape_url_keep2f(char *url); |
1463 | |
1464 | /** |
1465 | * Unescape a URL, including encoded slashes. |
1466 | * @param url The url to unescape |
1467 | * @param decode_slashes Whether or not slashes should be decoded or not |
1468 | * @return 0 on success, non-zero otherwise |
1469 | */ |
1470 | AP_DECLARE(int) ap_unescape_url_keep2f_ex(char *url, int decode_slashes); |
1471 | |
1472 | /** |
1473 | * Convert all double slashes to single slashes |
1474 | * @param name The string to convert |
1475 | */ |
1476 | AP_DECLARE(void) ap_no2slash(char *name); |
1477 | |
1478 | /** |
1479 | * Remove all ./ and xx/../ substrings from a file name. Also remove |
1480 | * any leading ../ or /../ substrings. |
1481 | * @param name the file name to parse |
1482 | */ |
1483 | AP_DECLARE(void) ap_getparents(char *name); |
1484 | |
1485 | /** |
1486 | * Escape a path segment, as defined in RFC 1808 |
1487 | * @param p The pool to allocate from |
1488 | * @param s The path to convert |
1489 | * @return The converted URL |
1490 | */ |
1491 | AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s); |
1492 | |
1493 | /** |
1494 | * convert an OS path to a URL in an OS dependant way. |
1495 | * @param p The pool to allocate from |
1496 | * @param path The path to convert |
1497 | * @param partial if set, assume that the path will be appended to something |
1498 | * with a '/' in it (and thus does not prefix "./") |
1499 | * @return The converted URL |
1500 | */ |
1501 | AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial); |
1502 | |
1503 | /** @see ap_os_escape_path */ |
1504 | #define ap_escape_uri(ppool,path) ap_os_escape_path : enter=0, leave=0
ap_os_escape_path : include/httpd.h line=1501 column=20
ap_os_escape_path(ppool,path,1) |
1505 | |
1506 | /** |
1507 | * Escape an html string |
1508 | * @param p The pool to allocate from |
1509 | * @param s The html to escape |
1510 | * @return The escaped string |
1511 | */ |
1512 | AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s); |
1513 | /** |
1514 | * Escape an html string |
1515 | * @param p The pool to allocate from |
1516 | * @param s The html to escape |
1517 | * @param toasc Whether to escape all non-ASCII chars to &#nnn; |
1518 | * @return The escaped string |
1519 | */ |
1520 | AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc); |
1521 | |
1522 | /** |
1523 | * Escape a string for logging |
1524 | * @param p The pool to allocate from |
1525 | * @param str The string to escape |
1526 | * @return The escaped string |
1527 | */ |
1528 | AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str); |
1529 | |
1530 | /** |
1531 | * Escape a string for logging into the error log (without a pool) |
1532 | * @param dest The buffer to write to |
1533 | * @param source The string to escape |
1534 | * @param buflen The buffer size for the escaped string (including "\0") |
1535 | * @return The len of the escaped string (always < maxlen) |
1536 | */ |
1537 | AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source, |
1538 | apr_size_t buflen); |
1539 | |
1540 | /** |
1541 | * Construct a full hostname |
1542 | * @param p The pool to allocate from |
1543 | * @param hostname The hostname of the server |
1544 | * @param port The port the server is running on |
1545 | * @param r The current request |
1546 | * @return The server's hostname |
1547 | */ |
1548 | AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname, |
1549 | apr_port_t port, const request_rec *r); |
1550 | |
1551 | /** |
1552 | * Escape a shell command |
1553 | * @param p The pool to allocate from |
1554 | * @param s The command to escape |
1555 | * @return The escaped shell command |
1556 | */ |
1557 | AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s); |
1558 | |
1559 | /** |
1560 | * Count the number of directories in a path |
1561 | * @param path The path to count |
1562 | * @return The number of directories |
1563 | */ |
1564 | AP_DECLARE(int) ap_count_dirs(const char *path); |
1565 | |
1566 | /** |
1567 | * Copy at most @a n leading directories of @a s into @a d. @a d |
1568 | * should be at least as large as @a s plus 1 extra byte |
1569 | * |
1570 | * @param d The location to copy to |
1571 | * @param s The location to copy from |
1572 | * @param n The number of directories to copy |
1573 | * @return value is the ever useful pointer to the trailing "\0" of d |
1574 | * @note on platforms with drive letters, n = 0 returns the "/" root, |
1575 | * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0 |
1576 | * returns the empty string. */ |
1577 | AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n); |
1578 | |
1579 | /** |
1580 | * Return the parent directory name (including trailing /) of the file |
1581 | * @a s |
1582 | * @param p The pool to allocate from |
1583 | * @param s The file to get the parent of |
1584 | * @return A copy of the file's parent directory |
1585 | */ |
1586 | AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s); |
1587 | |
1588 | /** |
1589 | * Given a directory and filename, create a single path from them. This |
1590 | * function is smart enough to ensure that there is a single '/' between the |
1591 | * directory and file names |
1592 | * @param a The pool to allocate from |
1593 | * @param dir The directory name |
1594 | * @param f The filename |
1595 | * @return A copy of the full path |
1596 | * @note Never consider using this function if you are dealing with filesystem |
1597 | * names that need to remain canonical, unless you are merging an apr_dir_read |
1598 | * path and returned filename. Otherwise, the result is not canonical. |
1599 | */ |
1600 | AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f); |
1601 | |
1602 | /** |
1603 | * Test if the given path has an an absolute path. |
1604 | * @param p The pool to allocate from |
1605 | * @param dir The directory name |
1606 | * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have |
1607 | * multiple forms of absolute paths. This only reports if the path is absolute |
1608 | * in a canonical sense. |
1609 | */ |
1610 | AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir); |
1611 | |
1612 | /** |
1613 | * Does the provided string contain wildcard characters? This is useful |
1614 | * for determining if the string should be passed to strcmp_match or to strcmp. |
1615 | * The only wildcard characters recognized are '?' and '*' |
1616 | * @param str The string to check |
1617 | * @return 1 if the string has wildcards, 0 otherwise |
1618 | */ |
1619 | AP_DECLARE(int) ap_is_matchexp(const char *str); |
1620 | |
1621 | /** |
1622 | * Determine if a string matches a patterm containing the wildcards '?' or '*' |
1623 | * @param str The string to check |
1624 | * @param expected The pattern to match against |
1625 | * @return 1 if the two strings match, 0 otherwise |
1626 | */ |
1627 | AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected); |
1628 | |
1629 | /** |
1630 | * Determine if a string matches a patterm containing the wildcards '?' or '*', |
1631 | * ignoring case |
1632 | * @param str The string to check |
1633 | * @param expected The pattern to match against |
1634 | * @return 1 if the two strings match, 0 otherwise |
1635 | */ |
1636 | AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected); |
1637 | |
1638 | /** |
1639 | * Find the first occurrence of the substring s2 in s1, regardless of case |
1640 | * @param s1 The string to search |
1641 | * @param s2 The substring to search for |
1642 | * @return A pointer to the beginning of the substring |
1643 | * @remark See apr_strmatch() for a faster alternative |
1644 | */ |
1645 | AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2); |
1646 | |
1647 | /** |
1648 | * Return a pointer to the location inside of bigstring immediately after prefix |
1649 | * @param bigstring The input string |
1650 | * @param prefix The prefix to strip away |
1651 | * @return A pointer relative to bigstring after prefix |
1652 | */ |
1653 | AP_DECLARE(const char *) ap_stripprefix(const char *bigstring, |
1654 | const char *prefix); |
1655 | |
1656 | /** |
1657 | * Decode a base64 encoded string into memory allocated from a pool |
1658 | * @param p The pool to allocate from |
1659 | * @param bufcoded The encoded string |
1660 | * @return The decoded string |
1661 | */ |
1662 | AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded); |
1663 | |
1664 | /** |
1665 | * Encode a string into memory allocated from a pool in base 64 format |
1666 | * @param p The pool to allocate from |
1667 | * @param string The plaintext string |
1668 | * @return The encoded string |
1669 | */ |
1670 | AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string); |
1671 | |
1672 | /** |
1673 | * Compile a regular expression to be used later |
1674 | * @param p The pool to allocate from |
1675 | * @param pattern the regular expression to compile |
1676 | * @param cflags The bitwise or of one or more of the following: |
1677 | * @li REG_EXTENDED - Use POSIX extended Regular Expressions |
1678 | * @li REG_ICASE - Ignore case |
1679 | * @li REG_NOSUB - Support for substring addressing of matches |
1680 | * not required |
1681 | * @li REG_NEWLINE - Match-any-character operators don't match new-line |
1682 | * @return The compiled regular expression |
1683 | */ |
1684 | AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, |
1685 | int cflags); |
1686 | |
1687 | /** |
1688 | * Free the memory associated with a compiled regular expression |
1689 | * @param p The pool the regex was allocated from |
1690 | * @param reg The regular expression to free |
1691 | */ |
1692 | AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg); |
1693 | |
1694 | /** |
1695 | * After performing a successful regex match, you may use this function to |
1696 | * perform a series of string substitutions based on subexpressions that were |
1697 | * matched during the call to ap_regexec |
1698 | * @param p The pool to allocate from |
1699 | * @param input An arbitrary string containing $1 through $9. These are |
1700 | * replaced with the corresponding matched sub-expressions |
1701 | * @param source The string that was originally matched to the regex |
1702 | * @param nmatch the nmatch returned from ap_pregex |
1703 | * @param pmatch the pmatch array returned from ap_pregex |
1704 | */ |
1705 | AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char *source, |
1706 | size_t nmatch, ap_regmatch_t pmatch[]); |
1707 | |
1708 | /** |
1709 | * After performing a successful regex match, you may use this function to |
1710 | * perform a series of string substitutions based on subexpressions that were |
1711 | * matched during the call to ap_regexec |
1712 | * @param p The pool to allocate from |
1713 | * @param result where to store the result, will be set to NULL on error |
1714 | * @param input An arbitrary string containing $1 through $9. These are |
1715 | * replaced with the corresponding matched sub-expressions |
1716 | * @param source The string that was originally matched to the regex |
1717 | * @param nmatch the nmatch returned from ap_pregex |
1718 | * @param pmatch the pmatch array returned from ap_pregex |
1719 | * @param maxlen the maximum string length to return, 0 for unlimited |
1720 | * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise. |
1721 | */ |
1722 | AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result, |
1723 | const char *input, const char *source, |
1724 | apr_size_t nmatch, |
1725 | ap_regmatch_t pmatch[], |
1726 | apr_size_t maxlen); |
1727 | |
1728 | /** |
1729 | * We want to downcase the type/subtype for comparison purposes |
1730 | * but nothing else because ;parameter=foo values are case sensitive. |
1731 | * @param s The content-type to convert to lowercase |
1732 | */ |
1733 | AP_DECLARE(void) ap_content_type_tolower(char *s); |
1734 | |
1735 | /** |
1736 | * convert a string to all lowercase |
1737 | * @param s The string to convert to lowercase |
1738 | */ |
1739 | AP_DECLARE(void) ap_str_tolower(char *s); |
1740 | |
1741 | /** |
1742 | * Search a string from left to right for the first occurrence of a |
1743 | * specific character |
1744 | * @param str The string to search |
1745 | * @param c The character to search for |
1746 | * @return The index of the first occurrence of c in str |
1747 | */ |
1748 | AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */ |
1749 | |
1750 | /** |
1751 | * Search a string from right to left for the first occurrence of a |
1752 | * specific character |
1753 | * @param str The string to search |
1754 | * @param c The character to search for |
1755 | * @return The index of the first occurrence of c in str |
1756 | */ |
1757 | AP_DECLARE(int) ap_rind(const char *str, char c); |
1758 | |
1759 | /** |
1760 | * Given a string, replace any bare " with \" . |
1761 | * @param p The pool to allocate memory from |
1762 | * @param instring The string to search for " |
1763 | * @return A copy of the string with escaped quotes |
1764 | */ |
1765 | AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring); |
1766 | |
1767 | /** |
1768 | * Given a string, append the PID deliminated by delim. |
1769 | * Usually used to create a pid-appended filepath name |
1770 | * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not |
1771 | * a macro, to avoid unistd.h dependency |
1772 | * @param p The pool to allocate memory from |
1773 | * @param string The string to append the PID to |
1774 | * @param delim The string to use to deliminate the string from the PID |
1775 | * @return A copy of the string with the PID appended |
1776 | */ |
1777 | AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string, |
1778 | const char *delim); |
1779 | |
1780 | /** |
1781 | * Parse a given timeout parameter string into an apr_interval_time_t value. |
1782 | * The unit of the time interval is given as postfix string to the numeric |
1783 | * string. Currently the following units are understood: |
1784 | * |
1785 | * ms : milliseconds |
1786 | * s : seconds |
1787 | * mi[n] : minutes |
1788 | * h : hours |
1789 | * |
1790 | * If no unit is contained in the given timeout parameter the default_time_unit |
1791 | * will be used instead. |
1792 | * @param timeout_parameter The string containing the timeout parameter. |
1793 | * @param timeout The timeout value to be returned. |
1794 | * @param default_time_unit The default time unit to use if none is specified |
1795 | * in timeout_parameter. |
1796 | * @return Status value indicating whether the parsing was successful or not. |
1797 | */ |
1798 | AP_DECLARE(apr_status_t) ap_timeout_parameter_parse( |
1799 | const char *timeout_parameter, |
1800 | apr_interval_time_t *timeout, |
1801 | const char *default_time_unit); |
1802 | |
1803 | /* Misc system hackery */ |
1804 | /** |
1805 | * Given the name of an object in the file system determine if it is a directory |
1806 | * @param p The pool to allocate from |
1807 | * @param name The name of the object to check |
1808 | * @return 1 if it is a directory, 0 otherwise |
1809 | */ |
1810 | AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name); |
1811 | |
1812 | /** |
1813 | * Given the name of an object in the file system determine if it is a directory - this version is symlink aware |
1814 | * @param p The pool to allocate from |
1815 | * @param name The name of the object to check |
1816 | * @return 1 if it is a directory, 0 otherwise |
1817 | */ |
1818 | AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name); |
1819 | |
1820 | #ifdef _OSD_POSIX |
1821 | extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process); |
1822 | #endif /* _OSD_POSIX */ |
1823 | |
1824 | /** |
1825 | * Determine the local host name for the current machine |
1826 | * @param p The pool to allocate from |
1827 | * @return A copy of the local host name |
1828 | */ |
1829 | char *ap_get_local_host(apr_pool_t *p); |
1830 | |
1831 | /** |
1832 | * Log an assertion to the error log |
1833 | * @param szExp The assertion that failed |
1834 | * @param szFile The file the assertion is in |
1835 | * @param nLine The line the assertion is defined on |
1836 | */ |
1837 | AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine) |
1838 | __attribute__((noreturn)); |
1839 | |
1840 | /** |
1841 | * @internal Internal Assert function |
1842 | */ |
1843 | #define ap_assert(exp) ((exp) conditional operator : true=1, false=0 ? (void)0 : ap_log_assert : enter=0, leave=0
ap_log_assert : include/httpd.h line=1837 column=18
ap_log_assert(#exp,__FILE__,__LINE__)) |
1844 | |
1845 | /** |
1846 | * Redefine assert() to something more useful for an Apache... |
1847 | * |
1848 | * Use ap_assert() if the condition should always be checked. |
1849 | * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG |
1850 | * is defined. |
1851 | */ |
1852 | #ifdef AP_DEBUG |
1853 | #define AP_DEBUG_ASSERT(exp) ap_assert(exp) |
1854 | #else |
1855 | #define AP_DEBUG_ASSERT(exp) ((void)0) |
1856 | #endif |
1857 | |
1858 | /** |
1859 | * @defgroup stopsignal Flags which indicate places where the sever should stop for debugging. |
1860 | * @{ |
1861 | * A set of flags which indicate places where the server should raise(SIGSTOP). |
1862 | * This is useful for debugging, because you can then attach to that process |
1863 | * with gdb and continue. This is important in cases where one_process |
1864 | * debugging isn't possible. |
1865 | */ |
1866 | /** stop on a Detach */ |
1867 | #define SIGSTOP_DETACH 1 |
1868 | /** stop making a child process */ |
1869 | #define SIGSTOP_MAKE_CHILD 2 |
1870 | /** stop spawning a child process */ |
1871 | #define SIGSTOP_SPAWN_CHILD 4 |
1872 | /** stop spawning a child process with a piped log */ |
1873 | #define SIGSTOP_PIPED_LOG_SPAWN 8 |
1874 | /** stop spawning a CGI child process */ |
1875 | #define SIGSTOP_CGI_CHILD 16 |
1876 | |
1877 | /** Macro to get GDB started */ |
1878 | #ifdef DEBUG_SIGSTOP |
1879 | extern int raise_sigstop_flags; |
1880 | #define RAISE_SIGSTOP(x) do { \ |
1881 | if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\ |
1882 | } while (0) |
1883 | #else |
1884 | #define RAISE_SIGSTOP(x) |
1885 | #endif |
1886 | /** @} */ |
1887 | /** |
1888 | * Get HTML describing the address and (optionally) admin of the server. |
1889 | * @param prefix Text which is prepended to the return value |
1890 | * @param r The request_rec |
1891 | * @return HTML describing the server, allocated in @a r's pool. |
1892 | */ |
1893 | AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r); |
1894 | |
1895 | |
1896 | /** |
1897 | * Short function to execute a command and return the first line of |
1898 | * output minus \r \n. Useful for "obscuring" passwords via exec calls |
1899 | * @param p the pool to allocate from |
1900 | * @param cmd the command to execute |
1901 | * @param argv the arguments to pass to the cmd |
1902 | * @return ptr to characters or NULL on any error |
1903 | */ |
1904 | AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p, |
1905 | const char *cmd, |
1906 | const char * const *argv); |
1907 | |
1908 | /** strtoul does not exist on sunos4. */ |
1909 | #ifdef strtoul |
1910 | #undef strtoul |
1911 | #endif |
1912 | #define strtoul strtoul_is_not_a_portable_function_use_strtol_instead |
1913 | |
1914 | /* The C library has functions that allow const to be silently dropped ... |
1915 | these macros detect the drop in maintainer mode, but use the native |
1916 | methods for normal builds |
1917 | |
1918 | Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs |
1919 | to be included before the macros are defined or compilation will fail. |
1920 | */ |
1921 | #include <string.h> |
1922 | |
1923 | AP_DECLARE(char *) ap_strchr(char *s, int c); |
1924 | AP_DECLARE(const char *) ap_strchr_c(const char *s, int c); |
1925 | AP_DECLARE(char *) ap_strrchr(char *s, int c); |
1926 | AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c); |
1927 | AP_DECLARE(char *) ap_strstr(char *s, const char *c); |
1928 | AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c); |
1929 | |
1930 | #ifdef AP_DEBUG |
1931 | |
1932 | #undef strchr |
1933 | # define strchr(s, c) ap_strchr(s,c) |
1934 | #undef strrchr |
1935 | # define strrchr(s, c) ap_strrchr(s,c) |
1936 | #undef strstr |
1937 | # define strstr(s, c) ap_strstr(s,c) |
1938 | |
1939 | #else |
1940 | |
1941 | /** use this instead of strchr */ |
1942 | # define ap_strchr(s, c) strchr : enter=0, leave=0
strchr : /usr/include/string.h line=235 column=14
strchr(s, c) |
1943 | /** use this instead of strchr */ |
1944 | # define ap_strchr_c(s, c) MC/DC independently affect : true=0, false=0 strchr : enter=0, leave=0
strchr : /usr/include/string.h line=235 column=14
strchr(s, c) |
1945 | /** use this instead of strrchr */ |
1946 | # define ap_strrchr(s, c) strrchr : enter=0, leave=0
strrchr : /usr/include/string.h line=262 column=14
strrchr(s, c) |
1947 | /** use this instead of strrchr */ |
1948 | # define ap_strrchr_c(s, c) strrchr : enter=54, leave=54
strrchr : /usr/include/string.h line=262 column=14
strrchr(s, c) |
1949 | /** use this instead of strrstr*/ |
1950 | # define ap_strstr(s, c) strstr(s, c) |
1951 | /** use this instead of strrstr*/ |
1952 | # define ap_strstr_c(s, c) MC/DC independently affect : true=0, false=0 strstr : enter=0, leave=0
strstr : /usr/include/string.h line=342 column=14
strstr(s, c) |
1953 | |
1954 | #endif |
1955 | |
1956 | #define AP_NORESTART APR_OS_START_USEERR + : pass=0 + 1 |
1957 | |
1958 | #ifdef __cplusplus |
1959 | } |
1960 | #endif |
1961 | |
1962 | #endif /* !APACHE_HTTPD_H */ |
1963 | |
1964 | /** @} //APACHE Daemon */ |
1965 | /** @} //APACHE Core */ |
1966 | /** @} //APACHE super group */ |
1967 | |
1968 | [EOF] |