Annotation of win32/apache22/include/httpd.h, revision 1.1
1.1 ! moko 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 (but not 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*(major)+(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) == 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(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(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) >= 100)&&((x) < 200))
! 541: /** is the status code OK ?*/
! 542: #define ap_is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300))
! 543: /** is the status code a redirect */
! 544: #define ap_is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 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) >= 100)&&((x) < 600))
! 553:
! 554: /** should the status code drop the connection */
! 555: #define ap_status_drops_connection(x) \
! 556: (((x) == HTTP_BAD_REQUEST) || \
! 557: ((x) == HTTP_REQUEST_TIME_OUT) || \
! 558: ((x) == HTTP_LENGTH_REQUIRED) || \
! 559: ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \
! 560: ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \
! 561: ((x) == HTTP_INTERNAL_SERVER_ERROR) || \
! 562: ((x) == HTTP_SERVICE_UNAVAILABLE) || \
! 563: ((x) == 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:
! 1011: /**
! 1012: * @defgroup ProxyReq Proxy request types
! 1013: *
! 1014: * Possible values of request_rec->proxyreq. A request could be normal,
! 1015: * proxied or reverse proxied. Normally proxied and reverse proxied are
! 1016: * grouped together as just "proxied", but sometimes it's necessary to
! 1017: * tell the difference between the two, such as for authentication.
! 1018: * @{
! 1019: */
! 1020:
! 1021: #define PROXYREQ_NONE 0 /**< No proxy */
! 1022: #define PROXYREQ_PROXY 1 /**< Standard proxy */
! 1023: #define PROXYREQ_REVERSE 2 /**< Reverse proxy */
! 1024: #define PROXYREQ_RESPONSE 3 /**< Origin response */
! 1025:
! 1026: /* @} */
! 1027:
! 1028: /**
! 1029: * @brief Enumeration of connection keepalive options
! 1030: */
! 1031: typedef enum {
! 1032: AP_CONN_UNKNOWN,
! 1033: AP_CONN_CLOSE,
! 1034: AP_CONN_KEEPALIVE
! 1035: } ap_conn_keepalive_e;
! 1036:
! 1037: /**
! 1038: * @brief Structure to store things which are per connection
! 1039: */
! 1040: struct conn_rec {
! 1041: /** Pool associated with this connection */
! 1042: apr_pool_t *pool;
! 1043: /** Physical vhost this conn came in on */
! 1044: server_rec *base_server;
! 1045: /** used by http_vhost.c */
! 1046: void *vhost_lookup_data;
! 1047:
! 1048: /* Information about the connection itself */
! 1049: /** local address */
! 1050: apr_sockaddr_t *local_addr;
! 1051: /** remote address */
! 1052: apr_sockaddr_t *remote_addr;
! 1053:
! 1054: /** Client's IP address */
! 1055: char *remote_ip;
! 1056: /** Client's DNS name, if known. NULL if DNS hasn't been checked,
! 1057: * "" if it has and no address was found. N.B. Only access this though
! 1058: * get_remote_host() */
! 1059: char *remote_host;
! 1060: /** Only ever set if doing rfc1413 lookups. N.B. Only access this through
! 1061: * get_remote_logname() */
! 1062: char *remote_logname;
! 1063:
! 1064: /** Are we still talking? */
! 1065: unsigned aborted:1;
! 1066:
! 1067: /** Are we going to keep the connection alive for another request?
! 1068: * @see ap_conn_keepalive_e */
! 1069: ap_conn_keepalive_e keepalive;
! 1070:
! 1071: /** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
! 1072: * 1 yes/success */
! 1073: signed int double_reverse:2;
! 1074:
! 1075: /** How many times have we used it? */
! 1076: int keepalives;
! 1077: /** server IP address */
! 1078: char *local_ip;
! 1079: /** used for ap_get_server_name when UseCanonicalName is set to DNS
! 1080: * (ignores setting of HostnameLookups) */
! 1081: char *local_host;
! 1082:
! 1083: /** ID of this connection; unique at any point in time */
! 1084: long id;
! 1085: /** Config vector containing pointers to connections per-server
! 1086: * config structures. */
! 1087: struct ap_conf_vector_t *conn_config;
! 1088: /** Notes on *this* connection: send note from one module to
! 1089: * another. must remain valid for all requests on this conn */
! 1090: apr_table_t *notes;
! 1091: /** A list of input filters to be used for this connection */
! 1092: struct ap_filter_t *input_filters;
! 1093: /** A list of output filters to be used for this connection */
! 1094: struct ap_filter_t *output_filters;
! 1095: /** handle to scoreboard information for this connection */
! 1096: void *sbh;
! 1097: /** The bucket allocator to use for all bucket/brigade creations */
! 1098: struct apr_bucket_alloc_t *bucket_alloc;
! 1099: /** The current state of this connection */
! 1100: conn_state_t *cs;
! 1101: /** Is there data pending in the input filters? */
! 1102: int data_in_input_filters;
! 1103:
! 1104: /** Are there any filters that clogg/buffer the input stream, breaking
! 1105: * the event mpm.
! 1106: */
! 1107: int clogging_input_filters;
! 1108: };
! 1109:
! 1110: /**
! 1111: * Enumeration of connection states
! 1112: */
! 1113: typedef enum {
! 1114: CONN_STATE_CHECK_REQUEST_LINE_READABLE,
! 1115: CONN_STATE_READ_REQUEST_LINE,
! 1116: CONN_STATE_LINGER
! 1117: } conn_state_e;
! 1118:
! 1119: /**
! 1120: * @brief A structure to contain connection state information
! 1121: */
! 1122: struct conn_state_t {
! 1123: /** APR_RING of expiration timeouts */
! 1124: APR_RING_ENTRY(conn_state_t) timeout_list;
! 1125: /** the expiration time of the next keepalive timeout */
! 1126: apr_time_t expiration_time;
! 1127: /** Current state of the connection */
! 1128: conn_state_e state;
! 1129: /** connection record this struct refers to */
! 1130: conn_rec *c;
! 1131: /** memory pool to allocate from */
! 1132: apr_pool_t *p;
! 1133: /** bucket allocator */
! 1134: apr_bucket_alloc_t *bucket_alloc;
! 1135: /** poll file decriptor information */
! 1136: apr_pollfd_t pfd;
! 1137: };
! 1138:
! 1139: /* Per-vhost config... */
! 1140:
! 1141: /**
! 1142: * The address 255.255.255.255, when used as a virtualhost address,
! 1143: * will become the "default" server when the ip doesn't match other vhosts.
! 1144: */
! 1145: #define DEFAULT_VHOST_ADDR 0xfffffffful
! 1146:
! 1147:
! 1148: /**
! 1149: * @struct server_addr_rec
! 1150: * @brief A structure to be used for Per-vhost config
! 1151: */
! 1152: typedef struct server_addr_rec server_addr_rec;
! 1153: struct server_addr_rec {
! 1154: /** The next server in the list */
! 1155: server_addr_rec *next;
! 1156: /** The bound address, for this server */
! 1157: apr_sockaddr_t *host_addr;
! 1158: /** The bound port, for this server */
! 1159: apr_port_t host_port;
! 1160: /** The name given in "<VirtualHost>" */
! 1161: char *virthost;
! 1162: };
! 1163:
! 1164: /**
! 1165: * @brief A structure to store information for each virtual server
! 1166: */
! 1167: struct server_rec {
! 1168: /** The process this server is running in */
! 1169: process_rec *process;
! 1170: /** The next server in the list */
! 1171: server_rec *next;
! 1172:
! 1173: /** The name of the server */
! 1174: const char *defn_name;
! 1175: /** The line of the config file that the server was defined on */
! 1176: unsigned defn_line_number;
! 1177:
! 1178: /* Contact information */
! 1179:
! 1180: /** The admin's contact information */
! 1181: char *server_admin;
! 1182: /** The server hostname */
! 1183: char *server_hostname;
! 1184: /** for redirects, etc. */
! 1185: apr_port_t port;
! 1186:
! 1187: /* Log files --- note that transfer log is now in the modules... */
! 1188:
! 1189: /** The name of the error log */
! 1190: char *error_fname;
! 1191: /** A file descriptor that references the error log */
! 1192: apr_file_t *error_log;
! 1193: /** The log level for this server */
! 1194: int loglevel;
! 1195:
! 1196: /* Module-specific configuration for server, and defaults... */
! 1197:
! 1198: /** true if this is the virtual server */
! 1199: int is_virtual;
! 1200: /** Config vector containing pointers to modules' per-server config
! 1201: * structures. */
! 1202: struct ap_conf_vector_t *module_config;
! 1203: /** MIME type info, etc., before we start checking per-directory info */
! 1204: struct ap_conf_vector_t *lookup_defaults;
! 1205:
! 1206: /* Transaction handling */
! 1207:
! 1208: /** I haven't got a clue */
! 1209: server_addr_rec *addrs;
! 1210: /** Timeout, as an apr interval, before we give up */
! 1211: apr_interval_time_t timeout;
! 1212: /** The apr interval we will wait for another request */
! 1213: apr_interval_time_t keep_alive_timeout;
! 1214: /** Maximum requests per connection */
! 1215: int keep_alive_max;
! 1216: /** Use persistent connections? */
! 1217: int keep_alive;
! 1218:
! 1219: /** Pathname for ServerPath */
! 1220: const char *path;
! 1221: /** Length of path */
! 1222: int pathlen;
! 1223:
! 1224: /** Normal names for ServerAlias servers */
! 1225: apr_array_header_t *names;
! 1226: /** Wildcarded names for ServerAlias servers */
! 1227: apr_array_header_t *wild_names;
! 1228:
! 1229: /** limit on size of the HTTP request line */
! 1230: int limit_req_line;
! 1231: /** limit on size of any request header field */
! 1232: int limit_req_fieldsize;
! 1233: /** limit on number of request header fields */
! 1234: int limit_req_fields;
! 1235:
! 1236: /** The server request scheme for redirect responses */
! 1237: const char *server_scheme;
! 1238: };
! 1239:
! 1240: typedef struct core_output_filter_ctx {
! 1241: apr_bucket_brigade *b;
! 1242: /** subpool of c->pool used for resources
! 1243: * which may outlive the request
! 1244: */
! 1245: apr_pool_t *deferred_write_pool;
! 1246: } core_output_filter_ctx_t;
! 1247:
! 1248: typedef struct core_filter_ctx {
! 1249: apr_bucket_brigade *b;
! 1250: apr_bucket_brigade *tmpbb;
! 1251: } core_ctx_t;
! 1252:
! 1253: typedef struct core_net_rec {
! 1254: /** Connection to the client */
! 1255: apr_socket_t *client_socket;
! 1256:
! 1257: /** connection record */
! 1258: conn_rec *c;
! 1259:
! 1260: core_output_filter_ctx_t *out_ctx;
! 1261: core_ctx_t *in_ctx;
! 1262: } core_net_rec;
! 1263:
! 1264: /**
! 1265: * Examine a field value (such as a media-/content-type) string and return
! 1266: * it sans any parameters; e.g., strip off any ';charset=foo' and the like.
! 1267: * @param p Pool to allocate memory from
! 1268: * @param intype The field to examine
! 1269: * @return A copy of the field minus any parameters
! 1270: */
! 1271: AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype);
! 1272:
! 1273: /**
! 1274: * Convert a time from an integer into a string in a specified format
! 1275: * @param p The pool to allocate memory from
! 1276: * @param t The time to convert
! 1277: * @param fmt The format to use for the conversion
! 1278: * @param gmt Convert the time for GMT?
! 1279: * @return The string that represents the specified time
! 1280: */
! 1281: AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt);
! 1282:
! 1283: /* String handling. The *_nc variants allow you to use non-const char **s as
! 1284: arguments (unfortunately C won't automatically convert a char ** to a const
! 1285: char **) */
! 1286:
! 1287: /**
! 1288: * Get the characters until the first occurance of a specified character
! 1289: * @param p The pool to allocate memory from
! 1290: * @param line The string to get the characters from
! 1291: * @param stop The character to stop at
! 1292: * @return A copy of the characters up to the first stop character
! 1293: */
! 1294: AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop);
! 1295:
! 1296: /**
! 1297: * Get the characters until the first occurance of a specified character
! 1298: * @param p The pool to allocate memory from
! 1299: * @param line The string to get the characters from
! 1300: * @param stop The character to stop at
! 1301: * @return A copy of the characters up to the first stop character
! 1302: * @note This is the same as ap_getword(), except it doesn't use const char **.
! 1303: */
! 1304: AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop);
! 1305:
! 1306: /**
! 1307: * Get the first word from a given string. A word is defined as all characters
! 1308: * up to the first whitespace.
! 1309: * @param p The pool to allocate memory from
! 1310: * @param line The string to traverse
! 1311: * @return The first word in the line
! 1312: */
! 1313: AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line);
! 1314:
! 1315: /**
! 1316: * Get the first word from a given string. A word is defined as all characters
! 1317: * up to the first whitespace.
! 1318: * @param p The pool to allocate memory from
! 1319: * @param line The string to traverse
! 1320: * @return The first word in the line
! 1321: * @note The same as ap_getword_white(), except it doesn't use const char**
! 1322: */
! 1323: AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line);
! 1324:
! 1325: /**
! 1326: * Get all characters from the first occurance of @a stop to the first "\0"
! 1327: * @param p The pool to allocate memory from
! 1328: * @param line The line to traverse
! 1329: * @param stop The character to start at
! 1330: * @return A copy of all caracters after the first occurance of the specified
! 1331: * character
! 1332: */
! 1333: AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line,
! 1334: char stop);
! 1335:
! 1336: /**
! 1337: * Get all characters from the first occurance of @a stop to the first "\0"
! 1338: * @param p The pool to allocate memory from
! 1339: * @param line The line to traverse
! 1340: * @param stop The character to start at
! 1341: * @return A copy of all caracters after the first occurance of the specified
! 1342: * character
! 1343: * @note The same as ap_getword_nulls(), except it doesn't use const char **.
! 1344: */
! 1345: AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop);
! 1346:
! 1347: /**
! 1348: * Get the second word in the string paying attention to quoting
! 1349: * @param p The pool to allocate from
! 1350: * @param line The line to traverse
! 1351: * @return A copy of the string
! 1352: */
! 1353: AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line);
! 1354:
! 1355: /**
! 1356: * Get the second word in the string paying attention to quoting
! 1357: * @param p The pool to allocate from
! 1358: * @param line The line to traverse
! 1359: * @return A copy of the string
! 1360: * @note The same as ap_getword_conf(), except it doesn't use const char **.
! 1361: */
! 1362: AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line);
! 1363:
! 1364: /**
! 1365: * Check a string for any ${ENV} environment variable construct and replace
! 1366: * each them by the value of that environment variable, if it exists. If the
! 1367: * environment value does not exist, leave the ${ENV} construct alone; it
! 1368: * means something else.
! 1369: * @param p The pool to allocate from
! 1370: * @param word The string to check
! 1371: * @return The string with the replaced environment variables
! 1372: */
! 1373: AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word);
! 1374:
! 1375: /**
! 1376: * Size an HTTP header field list item, as separated by a comma.
! 1377: * @param field The field to size
! 1378: * @param len The length of the field
! 1379: * @return The return value is a pointer to the beginning of the non-empty
! 1380: * list item within the original string (or NULL if there is none) and the
! 1381: * address of field is shifted to the next non-comma, non-whitespace
! 1382: * character. len is the length of the item excluding any beginning whitespace.
! 1383: */
! 1384: AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len);
! 1385:
! 1386: /**
! 1387: * Retrieve an HTTP header field list item, as separated by a comma,
! 1388: * while stripping insignificant whitespace and lowercasing anything not in
! 1389: * a quoted string or comment.
! 1390: * @param p The pool to allocate from
! 1391: * @param field The field to retrieve
! 1392: * @return The return value is a new string containing the converted list
! 1393: * item (or NULL if none) and the address pointed to by field is
! 1394: * shifted to the next non-comma, non-whitespace.
! 1395: */
! 1396: AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field);
! 1397:
! 1398: /**
! 1399: * Find an item in canonical form (lowercase, no extra spaces) within
! 1400: * an HTTP field value list.
! 1401: * @param p The pool to allocate from
! 1402: * @param line The field value list to search
! 1403: * @param tok The token to search for
! 1404: * @return 1 if found, 0 if not found.
! 1405: */
! 1406: AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok);
! 1407:
! 1408: /**
! 1409: * Retrieve a token, spacing over it and adjusting the pointer to
! 1410: * the first non-white byte afterwards. Note that these tokens
! 1411: * are delimited by semis and commas and can also be delimited
! 1412: * by whitespace at the caller's option.
! 1413: * @param p The pool to allocate from
! 1414: * @param accept_line The line to retrieve the token from (adjusted afterwards)
! 1415: * @param accept_white Is it delimited by whitespace
! 1416: * @return the token
! 1417: */
! 1418: AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white);
! 1419:
! 1420: /**
! 1421: * Find http tokens, see the definition of token from RFC2068
! 1422: * @param p The pool to allocate from
! 1423: * @param line The line to find the token
! 1424: * @param tok The token to find
! 1425: * @return 1 if the token is found, 0 otherwise
! 1426: */
! 1427: AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok);
! 1428:
! 1429: /**
! 1430: * find http tokens from the end of the line
! 1431: * @param p The pool to allocate from
! 1432: * @param line The line to find the token
! 1433: * @param tok The token to find
! 1434: * @return 1 if the token is found, 0 otherwise
! 1435: */
! 1436: AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok);
! 1437:
! 1438: /**
! 1439: * Check for an Absolute URI syntax
! 1440: * @param u The string to check
! 1441: * @return 1 if URI, 0 otherwise
! 1442: */
! 1443: AP_DECLARE(int) ap_is_url(const char *u);
! 1444:
! 1445: /**
! 1446: * Unescape a URL
! 1447: * @param url The url to unescape
! 1448: * @return 0 on success, non-zero otherwise
! 1449: */
! 1450: AP_DECLARE(int) ap_unescape_url(char *url);
! 1451:
! 1452: /**
! 1453: * Unescape a URL, including encoded slashes.
! 1454: * @param url The url to unescape
! 1455: * @return 0 on success, non-zero otherwise
! 1456: */
! 1457: AP_DECLARE(int) ap_unescape_url_keep2f(char *url);
! 1458:
! 1459: /**
! 1460: * Unescape a URL, including encoded slashes.
! 1461: * @param url The url to unescape
! 1462: * @param decode_slashes Whether or not slashes should be decoded or not
! 1463: * @return 0 on success, non-zero otherwise
! 1464: */
! 1465: AP_DECLARE(int) ap_unescape_url_keep2f_ex(char *url, int decode_slashes);
! 1466:
! 1467: /**
! 1468: * Convert all double slashes to single slashes
! 1469: * @param name The string to convert
! 1470: */
! 1471: AP_DECLARE(void) ap_no2slash(char *name);
! 1472:
! 1473: /**
! 1474: * Remove all ./ and xx/../ substrings from a file name. Also remove
! 1475: * any leading ../ or /../ substrings.
! 1476: * @param name the file name to parse
! 1477: */
! 1478: AP_DECLARE(void) ap_getparents(char *name);
! 1479:
! 1480: /**
! 1481: * Escape a path segment, as defined in RFC 1808
! 1482: * @param p The pool to allocate from
! 1483: * @param s The path to convert
! 1484: * @return The converted URL
! 1485: */
! 1486: AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s);
! 1487:
! 1488: /**
! 1489: * convert an OS path to a URL in an OS dependant way.
! 1490: * @param p The pool to allocate from
! 1491: * @param path The path to convert
! 1492: * @param partial if set, assume that the path will be appended to something
! 1493: * with a '/' in it (and thus does not prefix "./")
! 1494: * @return The converted URL
! 1495: */
! 1496: AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial);
! 1497:
! 1498: /** @see ap_os_escape_path */
! 1499: #define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1)
! 1500:
! 1501: /**
! 1502: * Escape an html string
! 1503: * @param p The pool to allocate from
! 1504: * @param s The html to escape
! 1505: * @return The escaped string
! 1506: */
! 1507: AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s);
! 1508: /**
! 1509: * Escape an html string
! 1510: * @param p The pool to allocate from
! 1511: * @param s The html to escape
! 1512: * @param toasc Whether to escape all non-ASCII chars to &#nnn;
! 1513: * @return The escaped string
! 1514: */
! 1515: AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc);
! 1516:
! 1517: /**
! 1518: * Escape a string for logging
! 1519: * @param p The pool to allocate from
! 1520: * @param str The string to escape
! 1521: * @return The escaped string
! 1522: */
! 1523: AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str);
! 1524:
! 1525: /**
! 1526: * Escape a string for logging into the error log (without a pool)
! 1527: * @param dest The buffer to write to
! 1528: * @param source The string to escape
! 1529: * @param buflen The buffer size for the escaped string (including "\0")
! 1530: * @return The len of the escaped string (always < maxlen)
! 1531: */
! 1532: AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source,
! 1533: apr_size_t buflen);
! 1534:
! 1535: /**
! 1536: * Construct a full hostname
! 1537: * @param p The pool to allocate from
! 1538: * @param hostname The hostname of the server
! 1539: * @param port The port the server is running on
! 1540: * @param r The current request
! 1541: * @return The server's hostname
! 1542: */
! 1543: AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname,
! 1544: apr_port_t port, const request_rec *r);
! 1545:
! 1546: /**
! 1547: * Escape a shell command
! 1548: * @param p The pool to allocate from
! 1549: * @param s The command to escape
! 1550: * @return The escaped shell command
! 1551: */
! 1552: AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s);
! 1553:
! 1554: /**
! 1555: * Count the number of directories in a path
! 1556: * @param path The path to count
! 1557: * @return The number of directories
! 1558: */
! 1559: AP_DECLARE(int) ap_count_dirs(const char *path);
! 1560:
! 1561: /**
! 1562: * Copy at most @a n leading directories of @a s into @a d. @a d
! 1563: * should be at least as large as @a s plus 1 extra byte
! 1564: *
! 1565: * @param d The location to copy to
! 1566: * @param s The location to copy from
! 1567: * @param n The number of directories to copy
! 1568: * @return value is the ever useful pointer to the trailing "\0" of d
! 1569: * @note on platforms with drive letters, n = 0 returns the "/" root,
! 1570: * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0
! 1571: * returns the empty string. */
! 1572: AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n);
! 1573:
! 1574: /**
! 1575: * Return the parent directory name (including trailing /) of the file
! 1576: * @a s
! 1577: * @param p The pool to allocate from
! 1578: * @param s The file to get the parent of
! 1579: * @return A copy of the file's parent directory
! 1580: */
! 1581: AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s);
! 1582:
! 1583: /**
! 1584: * Given a directory and filename, create a single path from them. This
! 1585: * function is smart enough to ensure that there is a single '/' between the
! 1586: * directory and file names
! 1587: * @param a The pool to allocate from
! 1588: * @param dir The directory name
! 1589: * @param f The filename
! 1590: * @return A copy of the full path
! 1591: * @note Never consider using this function if you are dealing with filesystem
! 1592: * names that need to remain canonical, unless you are merging an apr_dir_read
! 1593: * path and returned filename. Otherwise, the result is not canonical.
! 1594: */
! 1595: AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f);
! 1596:
! 1597: /**
! 1598: * Test if the given path has an an absolute path.
! 1599: * @param p The pool to allocate from
! 1600: * @param dir The directory name
! 1601: * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have
! 1602: * multiple forms of absolute paths. This only reports if the path is absolute
! 1603: * in a canonical sense.
! 1604: */
! 1605: AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir);
! 1606:
! 1607: /**
! 1608: * Does the provided string contain wildcard characters? This is useful
! 1609: * for determining if the string should be passed to strcmp_match or to strcmp.
! 1610: * The only wildcard characters recognized are '?' and '*'
! 1611: * @param str The string to check
! 1612: * @return 1 if the string has wildcards, 0 otherwise
! 1613: */
! 1614: AP_DECLARE(int) ap_is_matchexp(const char *str);
! 1615:
! 1616: /**
! 1617: * Determine if a string matches a patterm containing the wildcards '?' or '*'
! 1618: * @param str The string to check
! 1619: * @param expected The pattern to match against
! 1620: * @return 1 if the two strings match, 0 otherwise
! 1621: */
! 1622: AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected);
! 1623:
! 1624: /**
! 1625: * Determine if a string matches a patterm containing the wildcards '?' or '*',
! 1626: * ignoring case
! 1627: * @param str The string to check
! 1628: * @param expected The pattern to match against
! 1629: * @return 1 if the two strings match, 0 otherwise
! 1630: */
! 1631: AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected);
! 1632:
! 1633: /**
! 1634: * Find the first occurrence of the substring s2 in s1, regardless of case
! 1635: * @param s1 The string to search
! 1636: * @param s2 The substring to search for
! 1637: * @return A pointer to the beginning of the substring
! 1638: * @remark See apr_strmatch() for a faster alternative
! 1639: */
! 1640: AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2);
! 1641:
! 1642: /**
! 1643: * Return a pointer to the location inside of bigstring immediately after prefix
! 1644: * @param bigstring The input string
! 1645: * @param prefix The prefix to strip away
! 1646: * @return A pointer relative to bigstring after prefix
! 1647: */
! 1648: AP_DECLARE(const char *) ap_stripprefix(const char *bigstring,
! 1649: const char *prefix);
! 1650:
! 1651: /**
! 1652: * Decode a base64 encoded string into memory allocated from a pool
! 1653: * @param p The pool to allocate from
! 1654: * @param bufcoded The encoded string
! 1655: * @return The decoded string
! 1656: */
! 1657: AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded);
! 1658:
! 1659: /**
! 1660: * Encode a string into memory allocated from a pool in base 64 format
! 1661: * @param p The pool to allocate from
! 1662: * @param string The plaintext string
! 1663: * @return The encoded string
! 1664: */
! 1665: AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string);
! 1666:
! 1667: /**
! 1668: * Compile a regular expression to be used later
! 1669: * @param p The pool to allocate from
! 1670: * @param pattern the regular expression to compile
! 1671: * @param cflags The bitwise or of one or more of the following:
! 1672: * @li REG_EXTENDED - Use POSIX extended Regular Expressions
! 1673: * @li REG_ICASE - Ignore case
! 1674: * @li REG_NOSUB - Support for substring addressing of matches
! 1675: * not required
! 1676: * @li REG_NEWLINE - Match-any-character operators don't match new-line
! 1677: * @return The compiled regular expression
! 1678: */
! 1679: AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
! 1680: int cflags);
! 1681:
! 1682: /**
! 1683: * Free the memory associated with a compiled regular expression
! 1684: * @param p The pool the regex was allocated from
! 1685: * @param reg The regular expression to free
! 1686: */
! 1687: AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg);
! 1688:
! 1689: /**
! 1690: * After performing a successful regex match, you may use this function to
! 1691: * perform a series of string substitutions based on subexpressions that were
! 1692: * matched during the call to ap_regexec
! 1693: * @param p The pool to allocate from
! 1694: * @param input An arbitrary string containing $1 through $9. These are
! 1695: * replaced with the corresponding matched sub-expressions
! 1696: * @param source The string that was originally matched to the regex
! 1697: * @param nmatch the nmatch returned from ap_pregex
! 1698: * @param pmatch the pmatch array returned from ap_pregex
! 1699: */
! 1700: AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char *source,
! 1701: size_t nmatch, ap_regmatch_t pmatch[]);
! 1702:
! 1703: /**
! 1704: * After performing a successful regex match, you may use this function to
! 1705: * perform a series of string substitutions based on subexpressions that were
! 1706: * matched during the call to ap_regexec
! 1707: * @param p The pool to allocate from
! 1708: * @param result where to store the result, will be set to NULL on error
! 1709: * @param input An arbitrary string containing $1 through $9. These are
! 1710: * replaced with the corresponding matched sub-expressions
! 1711: * @param source The string that was originally matched to the regex
! 1712: * @param nmatch the nmatch returned from ap_pregex
! 1713: * @param pmatch the pmatch array returned from ap_pregex
! 1714: * @param maxlen the maximum string length to return, 0 for unlimited
! 1715: * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise.
! 1716: */
! 1717: AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result,
! 1718: const char *input, const char *source,
! 1719: apr_size_t nmatch,
! 1720: ap_regmatch_t pmatch[],
! 1721: apr_size_t maxlen);
! 1722:
! 1723: /**
! 1724: * We want to downcase the type/subtype for comparison purposes
! 1725: * but nothing else because ;parameter=foo values are case sensitive.
! 1726: * @param s The content-type to convert to lowercase
! 1727: */
! 1728: AP_DECLARE(void) ap_content_type_tolower(char *s);
! 1729:
! 1730: /**
! 1731: * convert a string to all lowercase
! 1732: * @param s The string to convert to lowercase
! 1733: */
! 1734: AP_DECLARE(void) ap_str_tolower(char *s);
! 1735:
! 1736: /**
! 1737: * Search a string from left to right for the first occurrence of a
! 1738: * specific character
! 1739: * @param str The string to search
! 1740: * @param c The character to search for
! 1741: * @return The index of the first occurrence of c in str
! 1742: */
! 1743: AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */
! 1744:
! 1745: /**
! 1746: * Search a string from right to left for the first occurrence of a
! 1747: * specific character
! 1748: * @param str The string to search
! 1749: * @param c The character to search for
! 1750: * @return The index of the first occurrence of c in str
! 1751: */
! 1752: AP_DECLARE(int) ap_rind(const char *str, char c);
! 1753:
! 1754: /**
! 1755: * Given a string, replace any bare " with \" .
! 1756: * @param p The pool to allocate memory from
! 1757: * @param instring The string to search for "
! 1758: * @return A copy of the string with escaped quotes
! 1759: */
! 1760: AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring);
! 1761:
! 1762: /**
! 1763: * Given a string, append the PID deliminated by delim.
! 1764: * Usually used to create a pid-appended filepath name
! 1765: * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not
! 1766: * a macro, to avoid unistd.h dependency
! 1767: * @param p The pool to allocate memory from
! 1768: * @param string The string to append the PID to
! 1769: * @param delim The string to use to deliminate the string from the PID
! 1770: * @return A copy of the string with the PID appended
! 1771: */
! 1772: AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string,
! 1773: const char *delim);
! 1774:
! 1775: /**
! 1776: * Parse a given timeout parameter string into an apr_interval_time_t value.
! 1777: * The unit of the time interval is given as postfix string to the numeric
! 1778: * string. Currently the following units are understood:
! 1779: *
! 1780: * ms : milliseconds
! 1781: * s : seconds
! 1782: * mi[n] : minutes
! 1783: * h : hours
! 1784: *
! 1785: * If no unit is contained in the given timeout parameter the default_time_unit
! 1786: * will be used instead.
! 1787: * @param timeout_parameter The string containing the timeout parameter.
! 1788: * @param timeout The timeout value to be returned.
! 1789: * @param default_time_unit The default time unit to use if none is specified
! 1790: * in timeout_parameter.
! 1791: * @return Status value indicating whether the parsing was successful or not.
! 1792: */
! 1793: AP_DECLARE(apr_status_t) ap_timeout_parameter_parse(
! 1794: const char *timeout_parameter,
! 1795: apr_interval_time_t *timeout,
! 1796: const char *default_time_unit);
! 1797:
! 1798: /* Misc system hackery */
! 1799: /**
! 1800: * Given the name of an object in the file system determine if it is a directory
! 1801: * @param p The pool to allocate from
! 1802: * @param name The name of the object to check
! 1803: * @return 1 if it is a directory, 0 otherwise
! 1804: */
! 1805: AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name);
! 1806:
! 1807: /**
! 1808: * Given the name of an object in the file system determine if it is a directory - this version is symlink aware
! 1809: * @param p The pool to allocate from
! 1810: * @param name The name of the object to check
! 1811: * @return 1 if it is a directory, 0 otherwise
! 1812: */
! 1813: AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name);
! 1814:
! 1815: #ifdef _OSD_POSIX
! 1816: extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process);
! 1817: #endif /* _OSD_POSIX */
! 1818:
! 1819: /**
! 1820: * Determine the local host name for the current machine
! 1821: * @param p The pool to allocate from
! 1822: * @return A copy of the local host name
! 1823: */
! 1824: char *ap_get_local_host(apr_pool_t *p);
! 1825:
! 1826: /**
! 1827: * Log an assertion to the error log
! 1828: * @param szExp The assertion that failed
! 1829: * @param szFile The file the assertion is in
! 1830: * @param nLine The line the assertion is defined on
! 1831: */
! 1832: AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine)
! 1833: __attribute__((noreturn));
! 1834:
! 1835: /**
! 1836: * @internal Internal Assert function
! 1837: */
! 1838: #define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__))
! 1839:
! 1840: /**
! 1841: * Redefine assert() to something more useful for an Apache...
! 1842: *
! 1843: * Use ap_assert() if the condition should always be checked.
! 1844: * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG
! 1845: * is defined.
! 1846: */
! 1847: #ifdef AP_DEBUG
! 1848: #define AP_DEBUG_ASSERT(exp) ap_assert(exp)
! 1849: #else
! 1850: #define AP_DEBUG_ASSERT(exp) ((void)0)
! 1851: #endif
! 1852:
! 1853: /**
! 1854: * @defgroup stopsignal Flags which indicate places where the sever should stop for debugging.
! 1855: * @{
! 1856: * A set of flags which indicate places where the server should raise(SIGSTOP).
! 1857: * This is useful for debugging, because you can then attach to that process
! 1858: * with gdb and continue. This is important in cases where one_process
! 1859: * debugging isn't possible.
! 1860: */
! 1861: /** stop on a Detach */
! 1862: #define SIGSTOP_DETACH 1
! 1863: /** stop making a child process */
! 1864: #define SIGSTOP_MAKE_CHILD 2
! 1865: /** stop spawning a child process */
! 1866: #define SIGSTOP_SPAWN_CHILD 4
! 1867: /** stop spawning a child process with a piped log */
! 1868: #define SIGSTOP_PIPED_LOG_SPAWN 8
! 1869: /** stop spawning a CGI child process */
! 1870: #define SIGSTOP_CGI_CHILD 16
! 1871:
! 1872: /** Macro to get GDB started */
! 1873: #ifdef DEBUG_SIGSTOP
! 1874: extern int raise_sigstop_flags;
! 1875: #define RAISE_SIGSTOP(x) do { \
! 1876: if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\
! 1877: } while (0)
! 1878: #else
! 1879: #define RAISE_SIGSTOP(x)
! 1880: #endif
! 1881: /** @} */
! 1882: /**
! 1883: * Get HTML describing the address and (optionally) admin of the server.
! 1884: * @param prefix Text which is prepended to the return value
! 1885: * @param r The request_rec
! 1886: * @return HTML describing the server, allocated in @a r's pool.
! 1887: */
! 1888: AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r);
! 1889:
! 1890:
! 1891: /**
! 1892: * Short function to execute a command and return the first line of
! 1893: * output minus \r \n. Useful for "obscuring" passwords via exec calls
! 1894: * @param p the pool to allocate from
! 1895: * @param cmd the command to execute
! 1896: * @param argv the arguments to pass to the cmd
! 1897: * @return ptr to characters or NULL on any error
! 1898: */
! 1899: AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p,
! 1900: const char *cmd,
! 1901: const char * const *argv);
! 1902:
! 1903: /** strtoul does not exist on sunos4. */
! 1904: #ifdef strtoul
! 1905: #undef strtoul
! 1906: #endif
! 1907: #define strtoul strtoul_is_not_a_portable_function_use_strtol_instead
! 1908:
! 1909: /* The C library has functions that allow const to be silently dropped ...
! 1910: these macros detect the drop in maintainer mode, but use the native
! 1911: methods for normal builds
! 1912:
! 1913: Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs
! 1914: to be included before the macros are defined or compilation will fail.
! 1915: */
! 1916: #include <string.h>
! 1917:
! 1918: AP_DECLARE(char *) ap_strchr(char *s, int c);
! 1919: AP_DECLARE(const char *) ap_strchr_c(const char *s, int c);
! 1920: AP_DECLARE(char *) ap_strrchr(char *s, int c);
! 1921: AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c);
! 1922: AP_DECLARE(char *) ap_strstr(char *s, const char *c);
! 1923: AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c);
! 1924:
! 1925: #ifdef AP_DEBUG
! 1926:
! 1927: #undef strchr
! 1928: # define strchr(s, c) ap_strchr(s,c)
! 1929: #undef strrchr
! 1930: # define strrchr(s, c) ap_strrchr(s,c)
! 1931: #undef strstr
! 1932: # define strstr(s, c) ap_strstr(s,c)
! 1933:
! 1934: #else
! 1935:
! 1936: /** use this instead of strchr */
! 1937: # define ap_strchr(s, c) strchr(s, c)
! 1938: /** use this instead of strchr */
! 1939: # define ap_strchr_c(s, c) strchr(s, c)
! 1940: /** use this instead of strrchr */
! 1941: # define ap_strrchr(s, c) strrchr(s, c)
! 1942: /** use this instead of strrchr */
! 1943: # define ap_strrchr_c(s, c) strrchr(s, c)
! 1944: /** use this instead of strrstr*/
! 1945: # define ap_strstr(s, c) strstr(s, c)
! 1946: /** use this instead of strrstr*/
! 1947: # define ap_strstr_c(s, c) strstr(s, c)
! 1948:
! 1949: #endif
! 1950:
! 1951: #define AP_NORESTART APR_OS_START_USEERR + 1
! 1952:
! 1953: #ifdef __cplusplus
! 1954: }
! 1955: #endif
! 1956:
! 1957: #endif /* !APACHE_HTTPD_H */
! 1958:
! 1959: /** @} //APACHE Daemon */
! 1960: /** @} //APACHE Core */
! 1961: /** @} //APACHE super group */
! 1962:
E-mail: