github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_4_58/include/httpd.h (about) 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 HTTP Server 22 * 23 * Top level group of which all other groups are a member 24 * @{ 25 * 26 * @defgroup APACHE_MODS Loadable modules 27 * Top level group for modules 28 * @defgroup APACHE_OS Operating System Specific 29 * @defgroup APACHE_INTERNAL Internal interfaces 30 * @defgroup APACHE_CORE Core routines 31 * @{ 32 * @defgroup APACHE_CORE_DAEMON HTTP Daemon Routine 33 * @{ 34 */ 35 36 #ifndef APACHE_HTTPD_H 37 #define APACHE_HTTPD_H 38 39 /* XXX - We need to push more stuff to other .h files, or even .c files, to 40 * make this file smaller 41 */ 42 43 /* Headers in which EVERYONE has an interest... */ 44 #include "ap_config.h" 45 #include "ap_mmn.h" 46 47 #include "ap_release.h" 48 49 #include "apr.h" 50 #include "apr_version.h" 51 #include "apr_general.h" 52 #include "apr_tables.h" 53 #include "apr_pools.h" 54 #include "apr_time.h" 55 #include "apr_network_io.h" 56 #include "apr_buckets.h" 57 #include "apr_poll.h" 58 #include "apr_thread_proc.h" 59 60 #include "os.h" 61 62 #include "ap_regex.h" 63 64 #if APR_HAVE_STDLIB_H 65 #include <stdlib.h> 66 #endif 67 68 /* Note: apr_uri.h is also included, see below */ 69 70 #ifdef __cplusplus 71 extern "C" { 72 #endif 73 74 /* ----------------------------- config dir ------------------------------ */ 75 76 /** Define this to be the default server home dir. Most things later in this 77 * file with a relative pathname will have this added. 78 */ 79 #ifndef HTTPD_ROOT 80 #ifdef OS2 81 /** Set default for OS/2 file system */ 82 #define HTTPD_ROOT "/os2httpd" 83 #elif defined(WIN32) 84 /** Set default for Windows file system */ 85 #define HTTPD_ROOT "/apache" 86 #elif defined (NETWARE) 87 /** Set the default for NetWare */ 88 #define HTTPD_ROOT "/apache" 89 #else 90 /** Set for all other OSs */ 91 #define HTTPD_ROOT "/usr/local/apache" 92 #endif 93 #endif /* HTTPD_ROOT */ 94 95 /* 96 * --------- You shouldn't have to edit anything below this line ---------- 97 * 98 * Any modifications to any defaults not defined above should be done in the 99 * respective configuration file. 100 * 101 */ 102 103 /** 104 * Default location of documents. Can be overridden by the DocumentRoot 105 * directive. 106 */ 107 #ifndef DOCUMENT_LOCATION 108 #ifdef OS2 109 /* Set default for OS/2 file system */ 110 #define DOCUMENT_LOCATION HTTPD_ROOT "/docs" 111 #else 112 /* Set default for non OS/2 file system */ 113 #define DOCUMENT_LOCATION HTTPD_ROOT "/htdocs" 114 #endif 115 #endif /* DOCUMENT_LOCATION */ 116 117 /** Maximum number of dynamically loaded modules */ 118 #ifndef DYNAMIC_MODULE_LIMIT 119 #define DYNAMIC_MODULE_LIMIT 256 120 #endif 121 122 /** Default administrator's address */ 123 #define DEFAULT_ADMIN "[no address given]" 124 125 /** The name of the log files */ 126 #ifndef DEFAULT_ERRORLOG 127 #if defined(OS2) || defined(WIN32) 128 #define DEFAULT_ERRORLOG "logs/error.log" 129 #else 130 #define DEFAULT_ERRORLOG "logs/error_log" 131 #endif 132 #endif /* DEFAULT_ERRORLOG */ 133 134 /** Define this to be what your per-directory security files are called */ 135 #ifndef DEFAULT_ACCESS_FNAME 136 #ifdef OS2 137 /* Set default for OS/2 file system */ 138 #define DEFAULT_ACCESS_FNAME "htaccess" 139 #else 140 #define DEFAULT_ACCESS_FNAME ".htaccess" 141 #endif 142 #endif /* DEFAULT_ACCESS_FNAME */ 143 144 /** The name of the server config file */ 145 #ifndef SERVER_CONFIG_FILE 146 #define SERVER_CONFIG_FILE "conf/httpd.conf" 147 #endif 148 149 /** The default path for CGI scripts if none is currently set */ 150 #ifndef DEFAULT_PATH 151 #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin" 152 #endif 153 154 /** The path to the suExec wrapper, can be overridden in Configuration */ 155 #ifndef SUEXEC_BIN 156 #define SUEXEC_BIN HTTPD_ROOT "/bin/suexec" 157 #endif 158 159 /** The timeout for waiting for messages */ 160 #ifndef DEFAULT_TIMEOUT 161 #define DEFAULT_TIMEOUT 60 162 #endif 163 164 /** The timeout for waiting for keepalive timeout until next request */ 165 #ifndef DEFAULT_KEEPALIVE_TIMEOUT 166 #define DEFAULT_KEEPALIVE_TIMEOUT 5 167 #endif 168 169 /** The number of requests to entertain per connection */ 170 #ifndef DEFAULT_KEEPALIVE 171 #define DEFAULT_KEEPALIVE 100 172 #endif 173 174 /* 175 * Limits on the size of various request items. These limits primarily 176 * exist to prevent simple denial-of-service attacks on a server based 177 * on misuse of the protocol. The recommended values will depend on the 178 * nature of the server resources -- CGI scripts and database backends 179 * might require large values, but most servers could get by with much 180 * smaller limits than we use below. The request message body size can 181 * be limited by the per-dir config directive LimitRequestBody. 182 * 183 * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE 184 * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190. 185 * These two limits can be lowered or raised by the server config 186 * directives LimitRequestLine and LimitRequestFieldsize, respectively. 187 * 188 * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by 189 * the server config directive LimitRequestFields. 190 */ 191 192 /** default limit on bytes in Request-Line (Method+URI+HTTP-version) */ 193 #ifndef DEFAULT_LIMIT_REQUEST_LINE 194 #define DEFAULT_LIMIT_REQUEST_LINE 8190 195 #endif 196 /** default limit on bytes in any one header field */ 197 #ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE 198 #define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190 199 #endif 200 /** default limit on number of request header fields */ 201 #ifndef DEFAULT_LIMIT_REQUEST_FIELDS 202 #define DEFAULT_LIMIT_REQUEST_FIELDS 100 203 #endif 204 /** default/hard limit on number of leading/trailing empty lines */ 205 #ifndef DEFAULT_LIMIT_BLANK_LINES 206 #define DEFAULT_LIMIT_BLANK_LINES 10 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 /** default HTTP Server protocol */ 216 #define AP_SERVER_PROTOCOL "HTTP/1.1" 217 218 219 /* ------------------ stuff that modules are allowed to look at ----------- */ 220 221 /** Define this to be what your HTML directory content files are called */ 222 #ifndef AP_DEFAULT_INDEX 223 #define AP_DEFAULT_INDEX "index.html" 224 #endif 225 226 /** The name of the MIME types file */ 227 #ifndef AP_TYPES_CONFIG_FILE 228 #define AP_TYPES_CONFIG_FILE "conf/mime.types" 229 #endif 230 231 /* 232 * Define the HTML doctype strings centrally. 233 */ 234 /** HTML 2.0 Doctype */ 235 #define DOCTYPE_HTML_2_0 "<!DOCTYPE HTML PUBLIC \"-//IETF//" \ 236 "DTD HTML 2.0//EN\">\n" 237 /** HTML 3.2 Doctype */ 238 #define DOCTYPE_HTML_3_2 "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ 239 "DTD HTML 3.2 Final//EN\">\n" 240 /** HTML 4.0 Strict Doctype */ 241 #define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ 242 "DTD HTML 4.0//EN\"\n" \ 243 "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" 244 /** HTML 4.0 Transitional Doctype */ 245 #define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ 246 "DTD HTML 4.0 Transitional//EN\"\n" \ 247 "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" 248 /** HTML 4.0 Frameset Doctype */ 249 #define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ 250 "DTD HTML 4.0 Frameset//EN\"\n" \ 251 "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n" 252 /** XHTML 1.0 Strict Doctype */ 253 #define DOCTYPE_XHTML_1_0S "<!DOCTYPE html PUBLIC \"-//W3C//" \ 254 "DTD XHTML 1.0 Strict//EN\"\n" \ 255 "\"http://www.w3.org/TR/xhtml1/DTD/" \ 256 "xhtml1-strict.dtd\">\n" 257 /** XHTML 1.0 Transitional Doctype */ 258 #define DOCTYPE_XHTML_1_0T "<!DOCTYPE html PUBLIC \"-//W3C//" \ 259 "DTD XHTML 1.0 Transitional//EN\"\n" \ 260 "\"http://www.w3.org/TR/xhtml1/DTD/" \ 261 "xhtml1-transitional.dtd\">\n" 262 /** XHTML 1.0 Frameset Doctype */ 263 #define DOCTYPE_XHTML_1_0F "<!DOCTYPE html PUBLIC \"-//W3C//" \ 264 "DTD XHTML 1.0 Frameset//EN\"\n" \ 265 "\"http://www.w3.org/TR/xhtml1/DTD/" \ 266 "xhtml1-frameset.dtd\">" 267 268 /** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */ 269 #define HTTP_VERSION(major,minor) (1000*(major)+(minor)) 270 /** Major part of HTTP protocol */ 271 #define HTTP_VERSION_MAJOR(number) ((number)/1000) 272 /** Minor part of HTTP protocol */ 273 #define HTTP_VERSION_MINOR(number) ((number)%1000) 274 275 /* -------------- Port number for server running standalone --------------- */ 276 277 /** default HTTP Port */ 278 #define DEFAULT_HTTP_PORT 80 279 /** default HTTPS Port */ 280 #define DEFAULT_HTTPS_PORT 443 281 /** 282 * Check whether @a port is the default port for the request @a r. 283 * @param port The port number 284 * @param r The request 285 * @see #ap_default_port 286 */ 287 #define ap_is_default_port(port,r) ((port) == ap_default_port(r)) 288 /** 289 * Get the default port for a request (which depends on the scheme). 290 * @param r The request 291 */ 292 #define ap_default_port(r) ap_run_default_port(r) 293 /** 294 * Get the scheme for a request. 295 * @param r The request 296 */ 297 #define ap_http_scheme(r) ap_run_http_scheme(r) 298 299 /** The default string length */ 300 #define MAX_STRING_LEN HUGE_STRING_LEN 301 302 /** The length of a Huge string */ 303 #define HUGE_STRING_LEN 8192 304 305 /** The size of the server's internal read-write buffers */ 306 #define AP_IOBUFSIZE 8192 307 308 /** The max number of regex captures that can be expanded by ap_pregsub */ 309 #define AP_MAX_REG_MATCH 10 310 311 /** 312 * APR_HAS_LARGE_FILES introduces the problem of splitting sendfile into 313 * multiple buckets, no greater than MAX(apr_size_t), and more granular 314 * than that in case the brigade code/filters attempt to read it directly. 315 * ### 16mb is an invention, no idea if it is reasonable. 316 */ 317 #define AP_MAX_SENDFILE 16777216 /* 2^24 */ 318 319 /** 320 * MPM child process exit status values 321 * The MPM parent process may check the status to see if special 322 * error handling is required. 323 */ 324 /** a normal exit */ 325 #define APEXIT_OK 0x0 326 /** A fatal error arising during the server's init sequence */ 327 #define APEXIT_INIT 0x2 328 /** The child died during its init sequence */ 329 #define APEXIT_CHILDINIT 0x3 330 /** 331 * The child exited due to a resource shortage. 332 * The parent should limit the rate of forking until 333 * the situation is resolved. 334 */ 335 #define APEXIT_CHILDSICK 0x7 336 /** 337 * A fatal error, resulting in the whole server aborting. 338 * If a child exits with this error, the parent process 339 * considers this a server-wide fatal error and aborts. 340 */ 341 #define APEXIT_CHILDFATAL 0xf 342 343 #ifndef AP_DECLARE 344 /** 345 * Stuff marked #AP_DECLARE is part of the API, and intended for use 346 * by modules. Its purpose is to allow us to add attributes that 347 * particular platforms or compilers require to every exported function. 348 */ 349 # define AP_DECLARE(type) type 350 #endif 351 352 #ifndef AP_DECLARE_NONSTD 353 /** 354 * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for 355 * use by modules. The difference between #AP_DECLARE and 356 * #AP_DECLARE_NONSTD is that the latter is required for any functions 357 * which use varargs or are used via indirect function call. This 358 * is to accommodate the two calling conventions in windows dlls. 359 */ 360 # define AP_DECLARE_NONSTD(type) type 361 #endif 362 #ifndef AP_DECLARE_DATA 363 # define AP_DECLARE_DATA 364 #endif 365 366 #ifndef AP_MODULE_DECLARE 367 # define AP_MODULE_DECLARE(type) type 368 #endif 369 #ifndef AP_MODULE_DECLARE_NONSTD 370 # define AP_MODULE_DECLARE_NONSTD(type) type 371 #endif 372 #ifndef AP_MODULE_DECLARE_DATA 373 # define AP_MODULE_DECLARE_DATA 374 #endif 375 376 /** 377 * @internal 378 * modules should not use functions marked AP_CORE_DECLARE 379 */ 380 #ifndef AP_CORE_DECLARE 381 # define AP_CORE_DECLARE AP_DECLARE 382 #endif 383 384 /** 385 * @internal 386 * modules should not use functions marked AP_CORE_DECLARE_NONSTD 387 */ 388 389 #ifndef AP_CORE_DECLARE_NONSTD 390 # define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD 391 #endif 392 393 /** 394 * @defgroup APACHE_APR_STATUS_T HTTPD specific values of apr_status_t 395 * @{ 396 */ 397 #define AP_START_USERERR (APR_OS_START_USERERR + 2000) 398 #define AP_USERERR_LEN 1000 399 400 /** The function declines to handle the request */ 401 #define AP_DECLINED (AP_START_USERERR + 0) 402 403 /** @} */ 404 405 /** 406 * @brief The numeric version information is broken out into fields within this 407 * structure. 408 */ 409 typedef struct { 410 int major; /**< major number */ 411 int minor; /**< minor number */ 412 int patch; /**< patch number */ 413 const char *add_string; /**< additional string like "-dev" */ 414 } ap_version_t; 415 416 /** 417 * Return httpd's version information in a numeric form. 418 * 419 * @param version Pointer to a version structure for returning the version 420 * information. 421 */ 422 AP_DECLARE(void) ap_get_server_revision(ap_version_t *version); 423 424 /** 425 * Get the server banner in a form suitable for sending over the 426 * network, with the level of information controlled by the 427 * ServerTokens directive. 428 * @return The server banner 429 */ 430 AP_DECLARE(const char *) ap_get_server_banner(void); 431 432 /** 433 * Get the server description in a form suitable for local displays, 434 * status reports, or logging. This includes the detailed server 435 * version and information about some modules. It is not affected 436 * by the ServerTokens directive. 437 * @return The server description 438 */ 439 AP_DECLARE(const char *) ap_get_server_description(void); 440 441 /** 442 * Add a component to the server description and banner strings 443 * @param pconf The pool to allocate the component from 444 * @param component The string to add 445 */ 446 AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component); 447 448 /** 449 * Get the date a time that the server was built 450 * @return The server build time string 451 */ 452 AP_DECLARE(const char *) ap_get_server_built(void); 453 454 /* non-HTTP status codes returned by hooks */ 455 456 #define OK 0 /**< Module has handled this stage. */ 457 #define DECLINED -1 /**< Module declines to handle */ 458 #define DONE -2 /**< Module has served the response completely 459 * - it's safe to die() with no more output 460 */ 461 #define SUSPENDED -3 /**< Module will handle the remainder of the request. 462 * The core will never invoke the request again, */ 463 464 /** Returned by the bottom-most filter if no data was written. 465 * @see ap_pass_brigade(). */ 466 #define AP_NOBODY_WROTE -100 467 /** Returned by the bottom-most filter if no data was read. 468 * @see ap_get_brigade(). */ 469 #define AP_NOBODY_READ -101 470 /** Returned by any filter if the filter chain encounters an error 471 * and has already dealt with the error response. 472 */ 473 #define AP_FILTER_ERROR -102 474 475 /** 476 * @defgroup HTTP_Status HTTP Status Codes 477 * @{ 478 */ 479 /** 480 * The size of the static status_lines array in http_protocol.c for 481 * storing all of the potential response status-lines (a sparse table). 482 * When adding a new code here add it to status_lines as well. 483 * A future version should dynamically generate the apr_table_t at startup. 484 */ 485 #define RESPONSE_CODES 103 486 487 #define HTTP_CONTINUE 100 488 #define HTTP_SWITCHING_PROTOCOLS 101 489 #define HTTP_PROCESSING 102 490 #define HTTP_OK 200 491 #define HTTP_CREATED 201 492 #define HTTP_ACCEPTED 202 493 #define HTTP_NON_AUTHORITATIVE 203 494 #define HTTP_NO_CONTENT 204 495 #define HTTP_RESET_CONTENT 205 496 #define HTTP_PARTIAL_CONTENT 206 497 #define HTTP_MULTI_STATUS 207 498 #define HTTP_ALREADY_REPORTED 208 499 #define HTTP_IM_USED 226 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_PERMANENT_REDIRECT 308 508 #define HTTP_BAD_REQUEST 400 509 #define HTTP_UNAUTHORIZED 401 510 #define HTTP_PAYMENT_REQUIRED 402 511 #define HTTP_FORBIDDEN 403 512 #define HTTP_NOT_FOUND 404 513 #define HTTP_METHOD_NOT_ALLOWED 405 514 #define HTTP_NOT_ACCEPTABLE 406 515 #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407 516 #define HTTP_REQUEST_TIME_OUT 408 517 #define HTTP_CONFLICT 409 518 #define HTTP_GONE 410 519 #define HTTP_LENGTH_REQUIRED 411 520 #define HTTP_PRECONDITION_FAILED 412 521 #define HTTP_REQUEST_ENTITY_TOO_LARGE 413 522 #define HTTP_REQUEST_URI_TOO_LARGE 414 523 #define HTTP_UNSUPPORTED_MEDIA_TYPE 415 524 #define HTTP_RANGE_NOT_SATISFIABLE 416 525 #define HTTP_EXPECTATION_FAILED 417 526 #define HTTP_MISDIRECTED_REQUEST 421 527 #define HTTP_UNPROCESSABLE_ENTITY 422 528 #define HTTP_LOCKED 423 529 #define HTTP_FAILED_DEPENDENCY 424 530 #define HTTP_UPGRADE_REQUIRED 426 531 #define HTTP_PRECONDITION_REQUIRED 428 532 #define HTTP_TOO_MANY_REQUESTS 429 533 #define HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 431 534 #define HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451 535 #define HTTP_INTERNAL_SERVER_ERROR 500 536 #define HTTP_NOT_IMPLEMENTED 501 537 #define HTTP_BAD_GATEWAY 502 538 #define HTTP_SERVICE_UNAVAILABLE 503 539 #define HTTP_GATEWAY_TIME_OUT 504 540 #define HTTP_VERSION_NOT_SUPPORTED 505 541 #define HTTP_VARIANT_ALSO_VARIES 506 542 #define HTTP_INSUFFICIENT_STORAGE 507 543 #define HTTP_LOOP_DETECTED 508 544 #define HTTP_NOT_EXTENDED 510 545 #define HTTP_NETWORK_AUTHENTICATION_REQUIRED 511 546 547 /** is the status code informational */ 548 #define ap_is_HTTP_INFO(x) (((x) >= 100)&&((x) < 200)) 549 /** is the status code OK ?*/ 550 #define ap_is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300)) 551 /** is the status code a redirect */ 552 #define ap_is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 400)) 553 /** is the status code a error (client or server) */ 554 #define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600)) 555 /** is the status code a client error */ 556 #define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500)) 557 /** is the status code a server error */ 558 #define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600)) 559 /** is the status code a (potentially) valid response code? */ 560 #define ap_is_HTTP_VALID_RESPONSE(x) (((x) >= 100)&&((x) < 600)) 561 562 /** should the status code drop the connection */ 563 #define ap_status_drops_connection(x) \ 564 (((x) == HTTP_BAD_REQUEST) || \ 565 ((x) == HTTP_REQUEST_TIME_OUT) || \ 566 ((x) == HTTP_LENGTH_REQUIRED) || \ 567 ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \ 568 ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \ 569 ((x) == HTTP_INTERNAL_SERVER_ERROR) || \ 570 ((x) == HTTP_SERVICE_UNAVAILABLE) || \ 571 ((x) == HTTP_NOT_IMPLEMENTED)) 572 573 /** does the status imply header only response (i.e. never w/ a body)? */ 574 #define AP_STATUS_IS_HEADER_ONLY(x) ((x) == HTTP_NO_CONTENT || \ 575 (x) == HTTP_NOT_MODIFIED) 576 /** @} */ 577 578 /** 579 * @defgroup Methods List of Methods recognized by the server 580 * @ingroup APACHE_CORE_DAEMON 581 * @{ 582 * 583 * @brief Methods recognized (but not necessarily handled) by the server. 584 * 585 * These constants are used in bit shifting masks of size int, so it is 586 * unsafe to have more methods than bits in an int. HEAD == M_GET. 587 * This list must be tracked by the list in http_protocol.c in routine 588 * ap_method_name_of(). 589 * 590 */ 591 592 #define M_GET 0 /** RFC 2616: HTTP */ 593 #define M_PUT 1 /* : */ 594 #define M_POST 2 595 #define M_DELETE 3 596 #define M_CONNECT 4 597 #define M_OPTIONS 5 598 #define M_TRACE 6 /** RFC 2616: HTTP */ 599 #define M_PATCH 7 /** RFC 5789: PATCH Method for HTTP */ 600 #define M_PROPFIND 8 /** RFC 2518: WebDAV */ 601 #define M_PROPPATCH 9 /* : */ 602 #define M_MKCOL 10 603 #define M_COPY 11 604 #define M_MOVE 12 605 #define M_LOCK 13 606 #define M_UNLOCK 14 /** RFC 2518: WebDAV */ 607 #define M_VERSION_CONTROL 15 /** RFC 3253: WebDAV Versioning */ 608 #define M_CHECKOUT 16 /* : */ 609 #define M_UNCHECKOUT 17 610 #define M_CHECKIN 18 611 #define M_UPDATE 19 612 #define M_LABEL 20 613 #define M_REPORT 21 614 #define M_MKWORKSPACE 22 615 #define M_MKACTIVITY 23 616 #define M_BASELINE_CONTROL 24 617 #define M_MERGE 25 618 #define M_INVALID 26 /** no valid method */ 619 620 /** 621 * METHODS needs to be equal to the number of bits 622 * we are using for limit masks. 623 */ 624 #define METHODS 64 625 626 /** 627 * The method mask bit to shift for anding with a bitmask. 628 */ 629 #define AP_METHOD_BIT ((apr_int64_t)1) 630 /** @} */ 631 632 633 /** @see ap_method_list_t */ 634 typedef struct ap_method_list_t ap_method_list_t; 635 636 /** 637 * @struct ap_method_list_t 638 * @brief Structure for handling HTTP methods. 639 * 640 * Methods known to the server are accessed via a bitmask shortcut; 641 * extension methods are handled by an array. 642 */ 643 struct ap_method_list_t { 644 /** The bitmask used for known methods */ 645 apr_int64_t method_mask; 646 /** the array used for extension methods */ 647 apr_array_header_t *method_list; 648 }; 649 /** @} */ 650 651 /** 652 * @defgroup bnotes Binary notes recognized by the server 653 * @ingroup APACHE_CORE_DAEMON 654 * @{ 655 * 656 * @brief Binary notes recognized by the server. 657 */ 658 659 /** 660 * The type used for request binary notes. 661 */ 662 typedef apr_uint64_t ap_request_bnotes_t; 663 664 /** 665 * These constants represent bitmasks for notes associated with this 666 * request. There are space for 64 bits in the apr_uint64_t. 667 * 668 */ 669 #define AP_REQUEST_STRONG_ETAG 1 >> 0 670 671 /** 672 * This is a convenience macro to ease with getting specific request 673 * binary notes. 674 */ 675 #define AP_REQUEST_GET_BNOTE(r, mask) \ 676 ((mask) & ((r)->bnotes)) 677 678 /** 679 * This is a convenience macro to ease with setting specific request 680 * binary notes. 681 */ 682 #define AP_REQUEST_SET_BNOTE(r, mask, val) \ 683 (r)->bnotes = (((r)->bnotes & ~(mask)) | (val)) 684 685 /** 686 * Returns true if the strong etag flag is set for this request. 687 */ 688 #define AP_REQUEST_IS_STRONG_ETAG(r) \ 689 AP_REQUEST_GET_BNOTE((r), AP_REQUEST_STRONG_ETAG) 690 /** @} */ 691 692 693 /** 694 * @defgroup module_magic Module Magic mime types 695 * @{ 696 */ 697 /** Magic for mod_cgi[d] */ 698 #define CGI_MAGIC_TYPE "application/x-httpd-cgi" 699 /** Magic for mod_include */ 700 #define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html" 701 /** Magic for mod_include */ 702 #define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3" 703 /** Magic for mod_dir */ 704 #define DIR_MAGIC_TYPE "httpd/unix-directory" 705 /** Default for r->handler if no content-type set by type_checker */ 706 #define AP_DEFAULT_HANDLER_NAME "" 707 #define AP_IS_DEFAULT_HANDLER_NAME(x) (*x == '\0') 708 709 /** @} */ 710 /* Just in case your linefeed isn't the one the other end is expecting. */ 711 #if !APR_CHARSET_EBCDIC 712 /** linefeed */ 713 #define LF 10 714 /** carriage return */ 715 #define CR 13 716 /** carriage return /Line Feed Combo */ 717 #define CRLF "\015\012" 718 #else /* APR_CHARSET_EBCDIC */ 719 /* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done 720 * in the buff package (bread/bputs/bwrite). Everywhere else, we use 721 * "native EBCDIC" CR and NL characters. These are therefore 722 * defined as 723 * '\r' and '\n'. 724 */ 725 #define CR '\r' 726 #define LF '\n' 727 #define CRLF "\r\n" 728 #endif /* APR_CHARSET_EBCDIC */ 729 /** Useful for common code with either platform charset. */ 730 #define CRLF_ASCII "\015\012" 731 732 /** 733 * @defgroup values_request_rec_body Possible values for request_rec.read_body 734 * @{ 735 * Possible values for request_rec.read_body (set by handling module): 736 */ 737 738 /** Send 413 error if message has any body */ 739 #define REQUEST_NO_BODY 0 740 /** Send 411 error if body without Content-Length */ 741 #define REQUEST_CHUNKED_ERROR 1 742 /** If chunked, remove the chunks for me. */ 743 #define REQUEST_CHUNKED_DECHUNK 2 744 /** @} // values_request_rec_body */ 745 746 /** 747 * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info 748 * @ingroup APACHE_CORE_DAEMON 749 * @{ 750 * Possible values for request_rec.used_path_info: 751 */ 752 753 /** Accept the path_info from the request */ 754 #define AP_REQ_ACCEPT_PATH_INFO 0 755 /** Return a 404 error if path_info was given */ 756 #define AP_REQ_REJECT_PATH_INFO 1 757 /** Module may chose to use the given path_info */ 758 #define AP_REQ_DEFAULT_PATH_INFO 2 759 760 /** @} // values_request_rec_used_path_info */ 761 762 763 /* 764 * Things which may vary per file-lookup WITHIN a request --- 765 * e.g., state of MIME config. Basically, the name of an object, info 766 * about the object, and any other info we may have which may need to 767 * change as we go poking around looking for it (e.g., overridden by 768 * .htaccess files). 769 * 770 * Note how the default state of almost all these things is properly 771 * zero, so that allocating it with pcalloc does the right thing without 772 * a whole lot of hairy initialization... so long as we are willing to 773 * make the (fairly) portable assumption that the bit pattern of a NULL 774 * pointer is, in fact, zero. 775 */ 776 777 /** 778 * @brief This represents the result of calling htaccess; these are cached for 779 * each request. 780 */ 781 struct htaccess_result { 782 /** the directory to which this applies */ 783 const char *dir; 784 /** the overrides allowed for the .htaccess file */ 785 int override; 786 /** the override options allowed for the .htaccess file */ 787 int override_opts; 788 /** Table of allowed directives for override */ 789 apr_table_t *override_list; 790 /** the configuration directives */ 791 struct ap_conf_vector_t *htaccess; 792 /** the next one, or NULL if no more; N.B. never change this */ 793 const struct htaccess_result *next; 794 }; 795 796 /* The following four types define a hierarchy of activities, so that 797 * given a request_rec r you can write r->connection->server->process 798 * to get to the process_rec. While this reduces substantially the 799 * number of arguments that various hooks require beware that in 800 * threaded versions of the server you must consider multiplexing 801 * issues. */ 802 803 804 /** A structure that represents one process */ 805 typedef struct process_rec process_rec; 806 /** A structure that represents a virtual server */ 807 typedef struct server_rec server_rec; 808 /** A structure that represents one connection */ 809 typedef struct conn_rec conn_rec; 810 /** A structure that represents the current request */ 811 typedef struct request_rec request_rec; 812 /** A structure that represents the status of the current connection */ 813 typedef struct conn_state_t conn_state_t; 814 815 /* ### would be nice to not include this from httpd.h ... */ 816 /* This comes after we have defined the request_rec type */ 817 #include "apr_uri.h" 818 819 /** 820 * @brief A structure that represents one process 821 */ 822 struct process_rec { 823 /** Global pool. Cleared upon normal exit */ 824 apr_pool_t *pool; 825 /** Configuration pool. Cleared upon restart */ 826 apr_pool_t *pconf; 827 /** The program name used to execute the program */ 828 const char *short_name; 829 /** The command line arguments */ 830 const char * const *argv; 831 /** Number of command line arguments passed to the program */ 832 int argc; 833 }; 834 835 /** 836 * @brief A structure that represents the current request 837 */ 838 struct request_rec { 839 /** The pool associated with the request */ 840 apr_pool_t *pool; 841 /** The connection to the client */ 842 conn_rec *connection; 843 /** The virtual host for this request */ 844 server_rec *server; 845 846 /** Pointer to the redirected request if this is an external redirect */ 847 request_rec *next; 848 /** Pointer to the previous request if this is an internal redirect */ 849 request_rec *prev; 850 851 /** Pointer to the main request if this is a sub-request 852 * (see http_request.h) */ 853 request_rec *main; 854 855 /* Info about the request itself... we begin with stuff that only 856 * protocol.c should ever touch... 857 */ 858 /** First line of request */ 859 char *the_request; 860 /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */ 861 int assbackwards; 862 /** A proxy request (calculated during post_read_request/translate_name) 863 * possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE, 864 * PROXYREQ_RESPONSE 865 */ 866 int proxyreq; 867 /** HEAD request, as opposed to GET */ 868 int header_only; 869 /** Protocol version number of protocol; 1.1 = 1001 */ 870 int proto_num; 871 /** Protocol string, as given to us, or HTTP/0.9 */ 872 char *protocol; 873 /** Host, as set by full URI or Host: header. 874 * For literal IPv6 addresses, this does NOT include the surrounding [ ] 875 */ 876 const char *hostname; 877 878 /** Time when the request started */ 879 apr_time_t request_time; 880 881 /** Status line, if set by script */ 882 const char *status_line; 883 /** Status line */ 884 int status; 885 886 /* Request method, two ways; also, protocol, etc.. Outside of protocol.c, 887 * look, but don't touch. 888 */ 889 890 /** M_GET, M_POST, etc. */ 891 int method_number; 892 /** Request method (eg. GET, HEAD, POST, etc.) */ 893 const char *method; 894 895 /** 896 * 'allowed' is a bitvector of the allowed methods. 897 * 898 * A handler must ensure that the request method is one that 899 * it is capable of handling. Generally modules should DECLINE 900 * any request methods they do not handle. Prior to aborting the 901 * handler like this the handler should set r->allowed to the list 902 * of methods that it is willing to handle. This bitvector is used 903 * to construct the "Allow:" header required for OPTIONS requests, 904 * and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes. 905 * 906 * Since the default_handler deals with OPTIONS, all modules can 907 * usually decline to deal with OPTIONS. TRACE is always allowed, 908 * modules don't need to set it explicitly. 909 * 910 * Since the default_handler will always handle a GET, a 911 * module which does *not* implement GET should probably return 912 * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET 913 * handler can't be installed by mod_actions. 914 */ 915 apr_int64_t allowed; 916 /** Array of extension methods */ 917 apr_array_header_t *allowed_xmethods; 918 /** List of allowed methods */ 919 ap_method_list_t *allowed_methods; 920 921 /** byte count in stream is for body */ 922 apr_off_t sent_bodyct; 923 /** body byte count, for easy access */ 924 apr_off_t bytes_sent; 925 /** Last modified time of the requested resource */ 926 apr_time_t mtime; 927 928 /* HTTP/1.1 connection-level features */ 929 930 /** The Range: header */ 931 const char *range; 932 /** The "real" content length */ 933 apr_off_t clength; 934 /** sending chunked transfer-coding */ 935 int chunked; 936 937 /** Method for reading the request body 938 * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY, 939 * REQUEST_CHUNKED_DECHUNK, etc...) */ 940 int read_body; 941 /** reading chunked transfer-coding */ 942 int read_chunked; 943 /** is client waiting for a 100 response? */ 944 unsigned expecting_100; 945 /** The optional kept body of the request. */ 946 apr_bucket_brigade *kept_body; 947 /** For ap_body_to_table(): parsed body */ 948 /* XXX: ap_body_to_table has been removed. Remove body_table too or 949 * XXX: keep it to reintroduce ap_body_to_table without major bump? */ 950 apr_table_t *body_table; 951 /** Remaining bytes left to read from the request body */ 952 apr_off_t remaining; 953 /** Number of bytes that have been read from the request body */ 954 apr_off_t read_length; 955 956 /* MIME header environments, in and out. Also, an array containing 957 * environment variables to be passed to subprocesses, so people can 958 * write modules to add to that environment. 959 * 960 * The difference between headers_out and err_headers_out is that the 961 * latter are printed even on error, and persist across internal redirects 962 * (so the headers printed for ErrorDocument handlers will have them). 963 * 964 * The 'notes' apr_table_t is for notes from one module to another, with no 965 * other set purpose in mind... 966 */ 967 968 /** MIME header environment from the request */ 969 apr_table_t *headers_in; 970 /** MIME header environment for the response */ 971 apr_table_t *headers_out; 972 /** MIME header environment for the response, printed even on errors and 973 * persist across internal redirects */ 974 apr_table_t *err_headers_out; 975 /** Array of environment variables to be used for sub processes */ 976 apr_table_t *subprocess_env; 977 /** Notes from one module to another */ 978 apr_table_t *notes; 979 980 /* content_type, handler, content_encoding, and all content_languages 981 * MUST be lowercased strings. They may be pointers to static strings; 982 * they should not be modified in place. 983 */ 984 /** The content-type for the current request */ 985 const char *content_type; /* Break these out --- we dispatch on 'em */ 986 /** The handler string that we use to call a handler function */ 987 const char *handler; /* What we *really* dispatch on */ 988 989 /** How to encode the data */ 990 const char *content_encoding; 991 /** Array of strings representing the content languages */ 992 apr_array_header_t *content_languages; 993 994 /** variant list validator (if negotiated) */ 995 char *vlist_validator; 996 997 /** If an authentication check was made, this gets set to the user name. */ 998 char *user; 999 /** If an authentication check was made, this gets set to the auth type. */ 1000 char *ap_auth_type; 1001 1002 /* What object is being requested (either directly, or via include 1003 * or content-negotiation mapping). 1004 */ 1005 1006 /** The URI without any parsing performed */ 1007 char *unparsed_uri; 1008 /** The path portion of the URI, or "/" if no path provided */ 1009 char *uri; 1010 /** The filename on disk corresponding to this response */ 1011 char *filename; 1012 /** The true filename stored in the filesystem, as in the true alpha case 1013 * and alias correction, e.g. "Image.jpeg" not "IMAGE$1.JPE" on Windows. 1014 * The core map_to_storage canonicalizes r->filename when they mismatch */ 1015 char *canonical_filename; 1016 /** The PATH_INFO extracted from this request */ 1017 char *path_info; 1018 /** The QUERY_ARGS extracted from this request */ 1019 char *args; 1020 1021 /** 1022 * Flag for the handler to accept or reject path_info on 1023 * the current request. All modules should respect the 1024 * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO 1025 * values, while AP_REQ_DEFAULT_PATH_INFO indicates they 1026 * may follow existing conventions. This is set to the 1027 * user's preference upon HOOK_VERY_FIRST of the fixups. 1028 */ 1029 int used_path_info; 1030 1031 /** A flag to determine if the eos bucket has been sent yet */ 1032 int eos_sent; 1033 1034 /* Various other config info which may change with .htaccess files 1035 * These are config vectors, with one void* pointer for each module 1036 * (the thing pointed to being the module's business). 1037 */ 1038 1039 /** Options set in config files, etc. */ 1040 struct ap_conf_vector_t *per_dir_config; 1041 /** Notes on *this* request */ 1042 struct ap_conf_vector_t *request_config; 1043 1044 /** Optional request log level configuration. Will usually point 1045 * to a server or per_dir config, i.e. must be copied before 1046 * modifying */ 1047 const struct ap_logconf *log; 1048 1049 /** Id to identify request in access and error log. Set when the first 1050 * error log entry for this request is generated. 1051 */ 1052 const char *log_id; 1053 1054 /** 1055 * A linked list of the .htaccess configuration directives 1056 * accessed by this request. 1057 * N.B. always add to the head of the list, _never_ to the end. 1058 * that way, a sub request's list can (temporarily) point to a parent's list 1059 */ 1060 const struct htaccess_result *htaccess; 1061 1062 /** A list of output filters to be used for this request */ 1063 struct ap_filter_t *output_filters; 1064 /** A list of input filters to be used for this request */ 1065 struct ap_filter_t *input_filters; 1066 1067 /** A list of protocol level output filters to be used for this 1068 * request */ 1069 struct ap_filter_t *proto_output_filters; 1070 /** A list of protocol level input filters to be used for this 1071 * request */ 1072 struct ap_filter_t *proto_input_filters; 1073 1074 /** This response can not be cached */ 1075 int no_cache; 1076 /** There is no local copy of this response */ 1077 int no_local_copy; 1078 1079 /** Mutex protect callbacks registered with ap_mpm_register_timed_callback 1080 * from being run before the original handler finishes running 1081 */ 1082 apr_thread_mutex_t *invoke_mtx; 1083 1084 /** A struct containing the components of URI */ 1085 apr_uri_t parsed_uri; 1086 /** finfo.protection (st_mode) set to zero if no such file */ 1087 apr_finfo_t finfo; 1088 1089 /** remote address information from conn_rec, can be overridden if 1090 * necessary by a module. 1091 * This is the address that originated the request. 1092 */ 1093 apr_sockaddr_t *useragent_addr; 1094 char *useragent_ip; 1095 1096 /** MIME trailer environment from the request */ 1097 apr_table_t *trailers_in; 1098 /** MIME trailer environment from the response */ 1099 apr_table_t *trailers_out; 1100 1101 /** Originator's DNS name, if known. NULL if DNS hasn't been checked, 1102 * "" if it has and no address was found. N.B. Only access this though 1103 * ap_get_useragent_host() */ 1104 char *useragent_host; 1105 /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, 1106 * 1 yes/success 1107 */ 1108 int double_reverse; 1109 /** Request flags associated with this request. Use 1110 * AP_REQUEST_GET_FLAGS() and AP_REQUEST_SET_FLAGS() to access 1111 * the elements of this field. 1112 */ 1113 ap_request_bnotes_t bnotes; 1114 }; 1115 1116 /** 1117 * @defgroup ProxyReq Proxy request types 1118 * 1119 * Possible values of request_rec->proxyreq. A request could be normal, 1120 * proxied or reverse proxied. Normally proxied and reverse proxied are 1121 * grouped together as just "proxied", but sometimes it's necessary to 1122 * tell the difference between the two, such as for authentication. 1123 * @{ 1124 */ 1125 1126 #define PROXYREQ_NONE 0 /**< No proxy */ 1127 #define PROXYREQ_PROXY 1 /**< Standard proxy */ 1128 #define PROXYREQ_REVERSE 2 /**< Reverse proxy */ 1129 #define PROXYREQ_RESPONSE 3 /**< Origin response */ 1130 1131 /* @} */ 1132 1133 /** 1134 * @brief Enumeration of connection keepalive options 1135 */ 1136 typedef enum { 1137 AP_CONN_UNKNOWN, 1138 AP_CONN_CLOSE, 1139 AP_CONN_KEEPALIVE 1140 } ap_conn_keepalive_e; 1141 1142 /** 1143 * @brief Structure to store things which are per connection 1144 */ 1145 struct conn_rec { 1146 /** Pool associated with this connection */ 1147 apr_pool_t *pool; 1148 /** Physical vhost this conn came in on */ 1149 server_rec *base_server; 1150 /** used by http_vhost.c */ 1151 void *vhost_lookup_data; 1152 1153 /* Information about the connection itself */ 1154 /** local address */ 1155 apr_sockaddr_t *local_addr; 1156 /** remote address; this is the end-point of the next hop, for the address 1157 * of the request creator, see useragent_addr in request_rec 1158 */ 1159 apr_sockaddr_t *client_addr; 1160 1161 /** Client's IP address; this is the end-point of the next hop, for the 1162 * IP of the request creator, see useragent_ip in request_rec 1163 */ 1164 char *client_ip; 1165 /** Client's DNS name, if known. NULL if DNS hasn't been checked, 1166 * "" if it has and no address was found. N.B. Only access this though 1167 * get_remote_host() */ 1168 char *remote_host; 1169 /** Only ever set if doing rfc1413 lookups. N.B. Only access this through 1170 * get_remote_logname() */ 1171 char *remote_logname; 1172 1173 /** server IP address */ 1174 char *local_ip; 1175 /** used for ap_get_server_name when UseCanonicalName is set to DNS 1176 * (ignores setting of HostnameLookups) */ 1177 char *local_host; 1178 1179 /** ID of this connection; unique at any point in time */ 1180 long id; 1181 /** Config vector containing pointers to connections per-server 1182 * config structures. */ 1183 struct ap_conf_vector_t *conn_config; 1184 /** Notes on *this* connection: send note from one module to 1185 * another. must remain valid for all requests on this conn */ 1186 apr_table_t *notes; 1187 /** A list of input filters to be used for this connection */ 1188 struct ap_filter_t *input_filters; 1189 /** A list of output filters to be used for this connection */ 1190 struct ap_filter_t *output_filters; 1191 /** handle to scoreboard information for this connection */ 1192 void *sbh; 1193 /** The bucket allocator to use for all bucket/brigade creations */ 1194 struct apr_bucket_alloc_t *bucket_alloc; 1195 /** The current state of this connection; may be NULL if not used by MPM */ 1196 conn_state_t *cs; 1197 /** Is there data pending in the input filters? */ 1198 int data_in_input_filters; 1199 /** Is there data pending in the output filters? */ 1200 int data_in_output_filters; 1201 1202 /** Are there any filters that clogg/buffer the input stream, breaking 1203 * the event mpm. 1204 */ 1205 unsigned int clogging_input_filters:1; 1206 1207 /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, 1208 * 1 yes/success */ 1209 signed int double_reverse:2; 1210 1211 /** Are we still talking? */ 1212 unsigned aborted; 1213 1214 /** Are we going to keep the connection alive for another request? 1215 * @see ap_conn_keepalive_e */ 1216 ap_conn_keepalive_e keepalive; 1217 1218 /** How many times have we used it? */ 1219 int keepalives; 1220 1221 /** Optional connection log level configuration. May point to a server or 1222 * per_dir config, i.e. must be copied before modifying */ 1223 const struct ap_logconf *log; 1224 1225 /** Id to identify this connection in error log. Set when the first 1226 * error log entry for this connection is generated. 1227 */ 1228 const char *log_id; 1229 1230 1231 /** This points to the current thread being used to process this request, 1232 * over the lifetime of a request, the value may change. Users of the connection 1233 * record should not rely upon it staying the same between calls that involve 1234 * the MPM. 1235 */ 1236 #if APR_HAS_THREADS 1237 apr_thread_t *current_thread; 1238 #endif 1239 1240 /** The "real" master connection. NULL if I am the master. */ 1241 conn_rec *master; 1242 1243 int outgoing; 1244 }; 1245 1246 /** 1247 * Enumeration of connection states 1248 * The two states CONN_STATE_LINGER_NORMAL and CONN_STATE_LINGER_SHORT may 1249 * only be set by the MPM. Use CONN_STATE_LINGER outside of the MPM. 1250 */ 1251 typedef enum { 1252 CONN_STATE_CHECK_REQUEST_LINE_READABLE, 1253 CONN_STATE_READ_REQUEST_LINE, 1254 CONN_STATE_HANDLER, 1255 CONN_STATE_WRITE_COMPLETION, 1256 CONN_STATE_SUSPENDED, 1257 CONN_STATE_LINGER, /* connection may be closed with lingering */ 1258 CONN_STATE_LINGER_NORMAL, /* MPM has started lingering close with normal timeout */ 1259 CONN_STATE_LINGER_SHORT, /* MPM has started lingering close with short timeout */ 1260 1261 CONN_STATE_NUM /* Number of states (keep/kept last) */ 1262 } conn_state_e; 1263 1264 typedef enum { 1265 CONN_SENSE_DEFAULT, 1266 CONN_SENSE_WANT_READ, /* next event must be read */ 1267 CONN_SENSE_WANT_WRITE /* next event must be write */ 1268 } conn_sense_e; 1269 1270 /** 1271 * @brief A structure to contain connection state information 1272 */ 1273 struct conn_state_t { 1274 /** Current state of the connection */ 1275 conn_state_e state; 1276 /** Whether to read instead of write, or write instead of read */ 1277 conn_sense_e sense; 1278 }; 1279 1280 /* Per-vhost config... */ 1281 1282 /** 1283 * The address 255.255.255.255, when used as a virtualhost address, 1284 * will become the "default" server when the ip doesn't match other vhosts. 1285 */ 1286 #define DEFAULT_VHOST_ADDR 0xfffffffful 1287 1288 1289 /** 1290 * @struct server_addr_rec 1291 * @brief A structure to be used for Per-vhost config 1292 */ 1293 typedef struct server_addr_rec server_addr_rec; 1294 struct server_addr_rec { 1295 /** The next server in the list */ 1296 server_addr_rec *next; 1297 /** The name given in "<VirtualHost>" */ 1298 char *virthost; 1299 /** The bound address, for this server */ 1300 apr_sockaddr_t *host_addr; 1301 /** The bound port, for this server */ 1302 apr_port_t host_port; 1303 }; 1304 1305 struct ap_logconf { 1306 /** The per-module log levels */ 1307 signed char *module_levels; 1308 1309 /** The log level for this server */ 1310 int level; 1311 }; 1312 /** 1313 * @brief A structure to store information for each virtual server 1314 */ 1315 struct server_rec { 1316 /** The process this server is running in */ 1317 process_rec *process; 1318 /** The next server in the list */ 1319 server_rec *next; 1320 1321 /* Log files --- note that transfer log is now in the modules... */ 1322 1323 /** The name of the error log */ 1324 char *error_fname; 1325 /** A file descriptor that references the error log */ 1326 apr_file_t *error_log; 1327 /** The log level configuration */ 1328 struct ap_logconf log; 1329 1330 /* Module-specific configuration for server, and defaults... */ 1331 1332 /** Config vector containing pointers to modules' per-server config 1333 * structures. */ 1334 struct ap_conf_vector_t *module_config; 1335 /** MIME type info, etc., before we start checking per-directory info */ 1336 struct ap_conf_vector_t *lookup_defaults; 1337 1338 /** The path to the config file that the server was defined in */ 1339 const char *defn_name; 1340 /** The line of the config file that the server was defined on */ 1341 unsigned defn_line_number; 1342 /** true if this is the virtual server */ 1343 char is_virtual; 1344 1345 1346 /* Information for redirects */ 1347 1348 /** for redirects, etc. */ 1349 apr_port_t port; 1350 /** The server request scheme for redirect responses */ 1351 const char *server_scheme; 1352 1353 /* Contact information */ 1354 1355 /** The admin's contact information */ 1356 char *server_admin; 1357 /** The server hostname */ 1358 char *server_hostname; 1359 1360 /* Transaction handling */ 1361 1362 /** I haven't got a clue */ 1363 server_addr_rec *addrs; 1364 /** Timeout, as an apr interval, before we give up */ 1365 apr_interval_time_t timeout; 1366 /** The apr interval we will wait for another request */ 1367 apr_interval_time_t keep_alive_timeout; 1368 /** Maximum requests per connection */ 1369 int keep_alive_max; 1370 /** Use persistent connections? */ 1371 int keep_alive; 1372 1373 /** Normal names for ServerAlias servers */ 1374 apr_array_header_t *names; 1375 /** Wildcarded names for ServerAlias servers */ 1376 apr_array_header_t *wild_names; 1377 1378 /** Pathname for ServerPath */ 1379 const char *path; 1380 /** Length of path */ 1381 int pathlen; 1382 1383 /** limit on size of the HTTP request line */ 1384 int limit_req_line; 1385 /** limit on size of any request header field */ 1386 int limit_req_fieldsize; 1387 /** limit on number of request header fields */ 1388 int limit_req_fields; 1389 1390 /** Opaque storage location */ 1391 void *context; 1392 1393 /** Whether the keepalive timeout is explicit (1) or 1394 * inherited (0) from the base server (either first 1395 * server on the same IP:port or main server) */ 1396 unsigned int keep_alive_timeout_set:1; 1397 }; 1398 1399 /** 1400 * @struct ap_sload_t 1401 * @brief A structure to hold server load params 1402 */ 1403 typedef struct ap_sload_t ap_sload_t; 1404 struct ap_sload_t { 1405 /* percentage of process/threads ready/idle (0->100)*/ 1406 int idle; 1407 /* percentage of process/threads busy (0->100) */ 1408 int busy; 1409 /* total bytes served */ 1410 apr_off_t bytes_served; 1411 /* total access count */ 1412 unsigned long access_count; 1413 }; 1414 1415 /** 1416 * @struct ap_loadavg_t 1417 * @brief A structure to hold various server loadavg 1418 */ 1419 typedef struct ap_loadavg_t ap_loadavg_t; 1420 struct ap_loadavg_t { 1421 /* current loadavg, ala getloadavg() */ 1422 float loadavg; 1423 /* 5 min loadavg */ 1424 float loadavg5; 1425 /* 15 min loadavg */ 1426 float loadavg15; 1427 }; 1428 1429 /** 1430 * Get the context_document_root for a request. This is a generalization of 1431 * the document root, which is too limited in the presence of mappers like 1432 * mod_userdir and mod_alias. The context_document_root is the directory 1433 * on disk that maps to the context_prefix URI prefix. 1434 * @param r The request 1435 * @note For resources that do not map to the file system or for very complex 1436 * mappings, this information may still be wrong. 1437 */ 1438 AP_DECLARE(const char *) ap_context_document_root(request_rec *r); 1439 1440 /** 1441 * Get the context_prefix for a request. The context_prefix URI prefix 1442 * maps to the context_document_root on disk. 1443 * @param r The request 1444 */ 1445 AP_DECLARE(const char *) ap_context_prefix(request_rec *r); 1446 1447 /** Set context_prefix and context_document_root for a request. 1448 * @param r The request 1449 * @param prefix the URI prefix, without trailing slash 1450 * @param document_root the corresponding directory on disk, without trailing 1451 * slash 1452 * @note If one of prefix of document_root is NULL, the corrsponding 1453 * property will not be changed. 1454 */ 1455 AP_DECLARE(void) ap_set_context_info(request_rec *r, const char *prefix, 1456 const char *document_root); 1457 1458 /** Set per-request document root. This is for mass virtual hosting modules 1459 * that want to provide the correct DOCUMENT_ROOT value to scripts. 1460 * @param r The request 1461 * @param document_root the document root for the request. 1462 */ 1463 AP_DECLARE(void) ap_set_document_root(request_rec *r, const char *document_root); 1464 1465 /** 1466 * Examine a field value (such as a media-/content-type) string and return 1467 * it sans any parameters; e.g., strip off any ';charset=foo' and the like. 1468 * @param p Pool to allocate memory from 1469 * @param intype The field to examine 1470 * @return A copy of the field minus any parameters 1471 */ 1472 AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype); 1473 1474 /** 1475 * Convert a time from an integer into a string in a specified format 1476 * @param p The pool to allocate memory from 1477 * @param t The time to convert 1478 * @param fmt The format to use for the conversion 1479 * @param gmt Convert the time for GMT? 1480 * @return The string that represents the specified time 1481 */ 1482 AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt); 1483 1484 /* String handling. The *_nc variants allow you to use non-const char **s as 1485 arguments (unfortunately C won't automatically convert a char ** to a const 1486 char **) */ 1487 1488 /** 1489 * Get the characters until the first occurrence of a specified character 1490 * @param p The pool to allocate memory from 1491 * @param line The string to get the characters from 1492 * @param stop The character to stop at 1493 * @return A copy of the characters up to the first stop character 1494 */ 1495 AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop); 1496 1497 /** 1498 * Get the characters until the first occurrence of a specified character 1499 * @param p The pool to allocate memory from 1500 * @param line The string to get the characters from 1501 * @param stop The character to stop at 1502 * @return A copy of the characters up to the first stop character 1503 * @note This is the same as ap_getword(), except it doesn't use const char **. 1504 */ 1505 AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop); 1506 1507 /** 1508 * Get the first word from a given string. A word is defined as all characters 1509 * up to the first whitespace. 1510 * @param p The pool to allocate memory from 1511 * @param line The string to traverse 1512 * @return The first word in the line 1513 */ 1514 AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line); 1515 1516 /** 1517 * Get the first word from a given string. A word is defined as all characters 1518 * up to the first whitespace. 1519 * @param p The pool to allocate memory from 1520 * @param line The string to traverse 1521 * @return The first word in the line 1522 * @note The same as ap_getword_white(), except it doesn't use const char** 1523 */ 1524 AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line); 1525 1526 /** 1527 * Get all characters from the first occurrence of @a stop to the first "\0" 1528 * @param p The pool to allocate memory from 1529 * @param line The line to traverse 1530 * @param stop The character to start at 1531 * @return A copy of all characters after the first occurrence of the specified 1532 * character 1533 */ 1534 AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line, 1535 char stop); 1536 1537 /** 1538 * Get all characters from the first occurrence of @a stop to the first "\0" 1539 * @param p The pool to allocate memory from 1540 * @param line The line to traverse 1541 * @param stop The character to start at 1542 * @return A copy of all characters after the first occurrence of the specified 1543 * character 1544 * @note The same as ap_getword_nulls(), except it doesn't use const char **. 1545 */ 1546 AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop); 1547 1548 /** 1549 * Get the second word in the string paying attention to quoting 1550 * @param p The pool to allocate from 1551 * @param line The line to traverse 1552 * @return A copy of the string 1553 */ 1554 AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line); 1555 1556 /** 1557 * Get the second word in the string paying attention to quoting 1558 * @param p The pool to allocate from 1559 * @param line The line to traverse 1560 * @return A copy of the string 1561 * @note The same as ap_getword_conf(), except it doesn't use const char **. 1562 */ 1563 AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line); 1564 1565 /** 1566 * Get the second word in the string paying attention to quoting, 1567 * with {...} supported as well as "..." and '...' 1568 * @param p The pool to allocate from 1569 * @param line The line to traverse 1570 * @return A copy of the string 1571 */ 1572 AP_DECLARE(char *) ap_getword_conf2(apr_pool_t *p, const char **line); 1573 1574 /** 1575 * Get the second word in the string paying attention to quoting, 1576 * with {...} supported as well as "..." and '...' 1577 * @param p The pool to allocate from 1578 * @param line The line to traverse 1579 * @return A copy of the string 1580 * @note The same as ap_getword_conf2(), except it doesn't use const char **. 1581 */ 1582 AP_DECLARE(char *) ap_getword_conf2_nc(apr_pool_t *p, char **line); 1583 1584 /** 1585 * Check a string for any config define or environment variable construct 1586 * and replace each of them by the value of that variable, if it exists. 1587 * The default syntax of the constructs is ${ENV} but can be changed by 1588 * setting the define::* config defines. If the variable does not exist, 1589 * leave the ${ENV} construct alone but print a warning. 1590 * @param p The pool to allocate from 1591 * @param word The string to check 1592 * @return The string with the replaced environment variables 1593 */ 1594 AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word); 1595 1596 /** 1597 * Size an HTTP header field list item, as separated by a comma. 1598 * @param field The field to size 1599 * @param len The length of the field 1600 * @return The return value is a pointer to the beginning of the non-empty 1601 * list item within the original string (or NULL if there is none) and the 1602 * address of field is shifted to the next non-comma, non-whitespace 1603 * character. len is the length of the item excluding any beginning whitespace. 1604 */ 1605 AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len); 1606 1607 /** 1608 * Retrieve an HTTP header field list item, as separated by a comma, 1609 * while stripping insignificant whitespace and lowercasing anything not in 1610 * a quoted string or comment. 1611 * @param p The pool to allocate from 1612 * @param field The field to retrieve 1613 * @return The return value is a new string containing the converted list 1614 * item (or NULL if none) and the address pointed to by field is 1615 * shifted to the next non-comma, non-whitespace. 1616 */ 1617 AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field); 1618 1619 /** 1620 * Find an item in canonical form (lowercase, no extra spaces) within 1621 * an HTTP field value list. 1622 * @param p The pool to allocate from 1623 * @param line The field value list to search 1624 * @param tok The token to search for 1625 * @return 1 if found, 0 if not found. 1626 */ 1627 AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok); 1628 1629 /** 1630 * Do a weak ETag comparison within an HTTP field value list. 1631 * @param p The pool to allocate from 1632 * @param line The field value list to search 1633 * @param tok The token to search for 1634 * @return 1 if found, 0 if not found. 1635 */ 1636 AP_DECLARE(int) ap_find_etag_weak(apr_pool_t *p, const char *line, const char *tok); 1637 1638 /** 1639 * Do a strong ETag comparison within an HTTP field value list. 1640 * @param p The pool to allocate from 1641 * @param line The field value list to search 1642 * @param tok The token to search for 1643 * @return 1 if found, 0 if not found. 1644 */ 1645 AP_DECLARE(int) ap_find_etag_strong(apr_pool_t *p, const char *line, const char *tok); 1646 1647 /* Scan a string for field content chars, as defined by RFC7230 section 3.2 1648 * including VCHAR/obs-text, as well as HT and SP 1649 * @param ptr The string to scan 1650 * @return A pointer to the first (non-HT) ASCII ctrl character. 1651 * @note lws and trailing whitespace are scanned, the caller is responsible 1652 * for trimming leading and trailing whitespace 1653 */ 1654 AP_DECLARE(const char *) ap_scan_http_field_content(const char *ptr); 1655 1656 /* Scan a string for token characters, as defined by RFC7230 section 3.2.6 1657 * @param ptr The string to scan 1658 * @return A pointer to the first non-token character. 1659 */ 1660 AP_DECLARE(const char *) ap_scan_http_token(const char *ptr); 1661 1662 /* Scan a string for visible ASCII (0x21-0x7E) or obstext (0x80+) 1663 * and return a pointer to the first SP/CTL/NUL character encountered. 1664 * @param ptr The string to scan 1665 * @return A pointer to the first SP/CTL character. 1666 */ 1667 AP_DECLARE(const char *) ap_scan_vchar_obstext(const char *ptr); 1668 1669 /** 1670 * Retrieve an array of tokens in the format "1#token" defined in RFC2616. Only 1671 * accepts ',' as a delimiter, does not accept quoted strings, and errors on 1672 * any separator. 1673 * @param p The pool to allocate from 1674 * @param tok The line to read tokens from 1675 * @param tokens Pointer to an array of tokens. If not NULL, must be an array 1676 * of char*, otherwise it will be allocated on @a p when a token is found 1677 * @param skip_invalid If true, when an invalid separator is encountered, it 1678 * will be ignored. 1679 * @return NULL on success, an error string otherwise. 1680 * @remark *tokens may be NULL on output if NULL in input and no token is found 1681 */ 1682 AP_DECLARE(const char *) ap_parse_token_list_strict(apr_pool_t *p, const char *tok, 1683 apr_array_header_t **tokens, 1684 int skip_invalid); 1685 1686 /** 1687 * Retrieve a token, spacing over it and adjusting the pointer to 1688 * the first non-white byte afterwards. Note that these tokens 1689 * are delimited by semis and commas and can also be delimited 1690 * by whitespace at the caller's option. 1691 * @param p The pool to allocate from 1692 * @param accept_line The line to retrieve the token from (adjusted afterwards) 1693 * @param accept_white Is it delimited by whitespace 1694 * @return the token 1695 */ 1696 AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white); 1697 1698 /** 1699 * Find http tokens, see the definition of token from RFC2068 1700 * @param p The pool to allocate from 1701 * @param line The line to find the token 1702 * @param tok The token to find 1703 * @return 1 if the token is found, 0 otherwise 1704 */ 1705 AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok); 1706 1707 /** 1708 * find http tokens from the end of the line 1709 * @param p The pool to allocate from 1710 * @param line The line to find the token 1711 * @param tok The token to find 1712 * @return 1 if the token is found, 0 otherwise 1713 */ 1714 AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok); 1715 1716 /** 1717 * Check for an Absolute URI syntax 1718 * @param u The string to check 1719 * @return 1 if URI, 0 otherwise 1720 */ 1721 AP_DECLARE(int) ap_is_url(const char *u); 1722 1723 /** 1724 * Unescape a string 1725 * @param url The string to unescape 1726 * @return 0 on success, non-zero otherwise 1727 */ 1728 AP_DECLARE(int) ap_unescape_all(char *url); 1729 1730 /** 1731 * Unescape a URL 1732 * @param url The url to unescape 1733 * @return 0 on success, non-zero otherwise 1734 */ 1735 AP_DECLARE(int) ap_unescape_url(char *url); 1736 1737 /** 1738 * Unescape a URL, but leaving %2f (slashes) escaped 1739 * @param url The url to unescape 1740 * @param decode_slashes Whether or not slashes should be decoded 1741 * @return 0 on success, non-zero otherwise 1742 */ 1743 AP_DECLARE(int) ap_unescape_url_keep2f(char *url, int decode_slashes); 1744 1745 #define AP_UNESCAPE_URL_KEEP_UNRESERVED (1u << 0) 1746 #define AP_UNESCAPE_URL_FORBID_SLASHES (1u << 1) 1747 #define AP_UNESCAPE_URL_KEEP_SLASHES (1u << 2) 1748 1749 /** 1750 * Unescape a URL, with options 1751 * @param url The url to unescape 1752 * @param flags Bitmask of AP_UNESCAPE_URL_* flags 1753 * @return 0 on success, non-zero otherwise 1754 */ 1755 AP_DECLARE(int) ap_unescape_url_ex(char *url, unsigned int flags); 1756 1757 /** 1758 * Unescape an application/x-www-form-urlencoded string 1759 * @param query The query to unescape 1760 * @return 0 on success, non-zero otherwise 1761 */ 1762 AP_DECLARE(int) ap_unescape_urlencoded(char *query); 1763 1764 /** 1765 * Convert all double slashes to single slashes, except where significant 1766 * to the filesystem on the current platform. 1767 * @param name The string to convert, assumed to be a filesystem path 1768 */ 1769 AP_DECLARE(void) ap_no2slash(char *name); 1770 1771 /** 1772 * Convert all double slashes to single slashes, except where significant 1773 * to the filesystem on the current platform. 1774 * @param name The string to convert 1775 * @param is_fs_path if set to 0, the significance of any double-slashes is 1776 * ignored. 1777 */ 1778 AP_DECLARE(void) ap_no2slash_ex(char *name, int is_fs_path); 1779 1780 #define AP_NORMALIZE_ALLOW_RELATIVE (1u << 0) 1781 #define AP_NORMALIZE_NOT_ABOVE_ROOT (1u << 1) 1782 #define AP_NORMALIZE_DECODE_UNRESERVED (1u << 2) 1783 #define AP_NORMALIZE_MERGE_SLASHES (1u << 3) 1784 #define AP_NORMALIZE_DROP_PARAMETERS (0) /* deprecated */ 1785 1786 /** 1787 * Remove all ////, /./ and /xx/../ substrings from a path, and more 1788 * depending on passed in flags. 1789 * @param path The path to normalize 1790 * @param flags bitmask of AP_NORMALIZE_* flags 1791 * @return non-zero on success 1792 */ 1793 AP_DECLARE(int) ap_normalize_path(char *path, unsigned int flags); 1794 1795 /** 1796 * Remove all ./ and xx/../ substrings from a file name. Also remove 1797 * any leading ../ or /../ substrings. 1798 * @param name the file name to parse 1799 */ 1800 AP_DECLARE(void) ap_getparents(char *name); 1801 1802 /** 1803 * Escape a path segment, as defined in RFC 1808 1804 * @param p The pool to allocate from 1805 * @param s The path to convert 1806 * @return The converted URL 1807 */ 1808 AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s); 1809 1810 /** 1811 * Escape a path segment, as defined in RFC 1808, to a preallocated buffer. 1812 * @param c The preallocated buffer to write to 1813 * @param s The path to convert 1814 * @return The converted URL (c) 1815 */ 1816 AP_DECLARE(char *) ap_escape_path_segment_buffer(char *c, const char *s); 1817 1818 /** 1819 * convert an OS path to a URL in an OS dependent way. 1820 * @param p The pool to allocate from 1821 * @param path The path to convert 1822 * @param partial if set, assume that the path will be appended to something 1823 * with a '/' in it (and thus does not prefix "./") 1824 * @return The converted URL 1825 */ 1826 AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial); 1827 1828 /** @see ap_os_escape_path */ 1829 #define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1) 1830 1831 /** 1832 * Escape a string as application/x-www-form-urlencoded 1833 * @param p The pool to allocate from 1834 * @param s The path to convert 1835 * @return The converted URL 1836 */ 1837 AP_DECLARE(char *) ap_escape_urlencoded(apr_pool_t *p, const char *s); 1838 1839 /** 1840 * Escape a string as application/x-www-form-urlencoded, to a preallocated buffer 1841 * @param c The preallocated buffer to write to 1842 * @param s The path to convert 1843 * @return The converted URL (c) 1844 */ 1845 AP_DECLARE(char *) ap_escape_urlencoded_buffer(char *c, const char *s); 1846 1847 /** 1848 * Escape an html string 1849 * @param p The pool to allocate from 1850 * @param s The html to escape 1851 * @return The escaped string 1852 */ 1853 #define ap_escape_html(p,s) ap_escape_html2(p,s,0) 1854 /** 1855 * Escape an html string 1856 * @param p The pool to allocate from 1857 * @param s The html to escape 1858 * @param toasc Whether to escape all non-ASCII chars to \&\#nnn; 1859 * @return The escaped string 1860 */ 1861 AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc); 1862 1863 /** 1864 * Escape a string for logging 1865 * @param p The pool to allocate from 1866 * @param str The string to escape 1867 * @return The escaped string 1868 */ 1869 AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str); 1870 1871 /** 1872 * Escape a string for logging into the error log (without a pool) 1873 * @param dest The buffer to write to 1874 * @param source The string to escape 1875 * @param buflen The buffer size for the escaped string (including "\0") 1876 * @return The len of the escaped string (always < maxlen) 1877 */ 1878 AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source, 1879 apr_size_t buflen); 1880 1881 /** 1882 * Construct a full hostname 1883 * @param p The pool to allocate from 1884 * @param hostname The hostname of the server 1885 * @param port The port the server is running on 1886 * @param r The current request 1887 * @return The server's hostname 1888 */ 1889 AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname, 1890 apr_port_t port, const request_rec *r); 1891 1892 /** 1893 * Escape a shell command 1894 * @param p The pool to allocate from 1895 * @param s The command to escape 1896 * @return The escaped shell command 1897 */ 1898 AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s); 1899 1900 /** 1901 * Count the number of directories in a path 1902 * @param path The path to count 1903 * @return The number of directories 1904 */ 1905 AP_DECLARE(int) ap_count_dirs(const char *path); 1906 1907 /** 1908 * Copy at most @a n leading directories of @a s into @a d. @a d 1909 * should be at least as large as @a s plus 1 extra byte 1910 * 1911 * @param d The location to copy to 1912 * @param s The location to copy from 1913 * @param n The number of directories to copy 1914 * @return value is the ever useful pointer to the trailing "\0" of d 1915 * @note on platforms with drive letters, n = 0 returns the "/" root, 1916 * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0 1917 * returns the empty string. */ 1918 AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n); 1919 1920 /** 1921 * Return the parent directory name (including trailing /) of the file 1922 * @a s 1923 * @param p The pool to allocate from 1924 * @param s The file to get the parent of 1925 * @return A copy of the file's parent directory 1926 */ 1927 AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s); 1928 1929 /** 1930 * Given a directory and filename, create a single path from them. This 1931 * function is smart enough to ensure that there is a single '/' between the 1932 * directory and file names 1933 * @param a The pool to allocate from 1934 * @param dir The directory name 1935 * @param f The filename 1936 * @return A copy of the full path 1937 * @note Never consider using this function if you are dealing with filesystem 1938 * names that need to remain canonical, unless you are merging an apr_dir_read 1939 * path and returned filename. Otherwise, the result is not canonical. 1940 */ 1941 AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f); 1942 1943 /** 1944 * Test if the given path has an absolute path. 1945 * @param p The pool to allocate from 1946 * @param dir The directory name 1947 * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have 1948 * multiple forms of absolute paths. This only reports if the path is absolute 1949 * in a canonical sense. 1950 */ 1951 AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir); 1952 1953 /** 1954 * Does the provided string contain wildcard characters? This is useful 1955 * for determining if the string should be passed to strcmp_match or to strcmp. 1956 * The only wildcard characters recognized are '?' and '*' 1957 * @param str The string to check 1958 * @return 1 if the string has wildcards, 0 otherwise 1959 */ 1960 AP_DECLARE(int) ap_is_matchexp(const char *str); 1961 1962 /** 1963 * Determine if a string matches a pattern containing the wildcards '?' or '*' 1964 * @param str The string to check 1965 * @param expected The pattern to match against 1966 * @return 0 if the two strings match, 1 otherwise 1967 */ 1968 AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected); 1969 1970 /** 1971 * Determine if a string matches a pattern containing the wildcards '?' or '*', 1972 * ignoring case 1973 * @param str The string to check 1974 * @param expected The pattern to match against 1975 * @return 0 if the two strings match, 1 otherwise 1976 */ 1977 AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected); 1978 1979 /** 1980 * Find the first occurrence of the substring s2 in s1, regardless of case 1981 * @param s1 The string to search 1982 * @param s2 The substring to search for 1983 * @return A pointer to the beginning of the substring 1984 * @remark See apr_strmatch() for a faster alternative 1985 */ 1986 AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2); 1987 1988 /** 1989 * Return a pointer to the location inside of bigstring immediately after prefix 1990 * @param bigstring The input string 1991 * @param prefix The prefix to strip away 1992 * @return A pointer relative to bigstring after prefix 1993 */ 1994 AP_DECLARE(const char *) ap_stripprefix(const char *bigstring, 1995 const char *prefix); 1996 1997 /** 1998 * Decode a base64 encoded string into memory allocated from a pool 1999 * @param p The pool to allocate from 2000 * @param bufcoded The encoded string 2001 * @return The decoded string 2002 */ 2003 AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded); 2004 2005 /** 2006 * Encode a string into memory allocated from a pool in base 64 format 2007 * @param p The pool to allocate from 2008 * @param string The plaintext string 2009 * @return The encoded string 2010 */ 2011 AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string); 2012 2013 /** 2014 * Compile a regular expression to be used later. The regex is freed when 2015 * the pool is destroyed. 2016 * @param p The pool to allocate from 2017 * @param pattern the regular expression to compile 2018 * @param cflags The bitwise or of one or more of the following: 2019 * @li REG_EXTENDED - Use POSIX extended Regular Expressions 2020 * @li REG_ICASE - Ignore case 2021 * @li REG_NOSUB - Support for substring addressing of matches 2022 * not required 2023 * @li REG_NEWLINE - Match-any-character operators don't match new-line 2024 * @return The compiled regular expression 2025 */ 2026 AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, 2027 int cflags); 2028 2029 /** 2030 * Free the memory associated with a compiled regular expression 2031 * @param p The pool the regex was allocated from 2032 * @param reg The regular expression to free 2033 * @note This function is only necessary if the regex should be cleaned 2034 * up before the pool 2035 */ 2036 AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg); 2037 2038 /** 2039 * After performing a successful regex match, you may use this function to 2040 * perform a series of string substitutions based on subexpressions that were 2041 * matched during the call to ap_regexec. This function is limited to 2042 * result strings of 64K. Consider using ap_pregsub_ex() instead. 2043 * @param p The pool to allocate from 2044 * @param input An arbitrary string containing $1 through $9. These are 2045 * replaced with the corresponding matched sub-expressions 2046 * @param source The string that was originally matched to the regex 2047 * @param nmatch the nmatch returned from ap_pregex 2048 * @param pmatch the pmatch array returned from ap_pregex 2049 * @return The substituted string, or NULL on error 2050 */ 2051 AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, 2052 const char *source, apr_size_t nmatch, 2053 ap_regmatch_t pmatch[]); 2054 2055 /** 2056 * After performing a successful regex match, you may use this function to 2057 * perform a series of string substitutions based on subexpressions that were 2058 * matched during the call to ap_regexec 2059 * @param p The pool to allocate from 2060 * @param result where to store the result, will be set to NULL on error 2061 * @param input An arbitrary string containing $1 through $9. These are 2062 * replaced with the corresponding matched sub-expressions 2063 * @param source The string that was originally matched to the regex 2064 * @param nmatch the nmatch returned from ap_pregex 2065 * @param pmatch the pmatch array returned from ap_pregex 2066 * @param maxlen the maximum string length to return, 0 for unlimited 2067 * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise. 2068 */ 2069 AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result, 2070 const char *input, const char *source, 2071 apr_size_t nmatch, 2072 ap_regmatch_t pmatch[], 2073 apr_size_t maxlen); 2074 2075 /** 2076 * We want to downcase the type/subtype for comparison purposes 2077 * but nothing else because ;parameter=foo values are case sensitive. 2078 * @param s The content-type to convert to lowercase 2079 */ 2080 AP_DECLARE(void) ap_content_type_tolower(char *s); 2081 2082 /** 2083 * convert a string to all lowercase 2084 * @param s The string to convert to lowercase 2085 */ 2086 AP_DECLARE(void) ap_str_tolower(char *s); 2087 2088 /** 2089 * convert a string to all uppercase 2090 * @param s The string to convert to uppercase 2091 */ 2092 AP_DECLARE(void) ap_str_toupper(char *s); 2093 2094 /** 2095 * Search a string from left to right for the first occurrence of a 2096 * specific character 2097 * @param str The string to search 2098 * @param c The character to search for 2099 * @return The index of the first occurrence of c in str 2100 */ 2101 AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */ 2102 2103 /** 2104 * Search a string from right to left for the first occurrence of a 2105 * specific character 2106 * @param str The string to search 2107 * @param c The character to search for 2108 * @return The index of the first occurrence of c in str 2109 */ 2110 AP_DECLARE(int) ap_rind(const char *str, char c); 2111 2112 /** 2113 * Given a string, replace any bare " with \\" . 2114 * @param p The pool to allocate memory from 2115 * @param instring The string to search for " 2116 * @return A copy of the string with escaped quotes 2117 */ 2118 AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring); 2119 2120 /** 2121 * Given a string, append the PID deliminated by delim. 2122 * Usually used to create a pid-appended filepath name 2123 * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not 2124 * a macro, to avoid unistd.h dependency 2125 * @param p The pool to allocate memory from 2126 * @param string The string to append the PID to 2127 * @param delim The string to use to deliminate the string from the PID 2128 * @return A copy of the string with the PID appended 2129 */ 2130 AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string, 2131 const char *delim); 2132 2133 /** 2134 * Parse a length string with decimal characters only, no leading sign nor 2135 * trailing character, like Content-Length or (Content-)Range headers. 2136 * @param len The parsed length (apr_off_t) 2137 * @param str The string to parse 2138 * @return 1 (success), 0 (failure) 2139 */ 2140 AP_DECLARE(int) ap_parse_strict_length(apr_off_t *len, const char *str); 2141 2142 /** 2143 * Parse a given timeout parameter string into an apr_interval_time_t value. 2144 * The unit of the time interval is given as postfix string to the numeric 2145 * string. Currently the following units are understood: 2146 * 2147 * ms : milliseconds 2148 * s : seconds 2149 * mi[n] : minutes 2150 * h : hours 2151 * 2152 * If no unit is contained in the given timeout parameter the default_time_unit 2153 * will be used instead. 2154 * @param timeout_parameter The string containing the timeout parameter. 2155 * @param timeout The timeout value to be returned. 2156 * @param default_time_unit The default time unit to use if none is specified 2157 * in timeout_parameter. 2158 * @return Status value indicating whether the parsing was successful or not. 2159 */ 2160 AP_DECLARE(apr_status_t) ap_timeout_parameter_parse( 2161 const char *timeout_parameter, 2162 apr_interval_time_t *timeout, 2163 const char *default_time_unit); 2164 2165 /** 2166 * Determine if a request has a request body or not. 2167 * 2168 * @param r the request_rec of the request 2169 * @return truth value 2170 */ 2171 AP_DECLARE(int) ap_request_has_body(request_rec *r); 2172 2173 /** 2174 * Cleanup a string (mainly to be filesystem safe) 2175 * We only allow '_' and alphanumeric chars. Non-printable 2176 * map to 'x' and all others map to '_' 2177 * 2178 * @param p pool to use to allocate dest 2179 * @param src string to clean up 2180 * @param dest cleaned up, allocated string 2181 * @return Status value indicating whether the cleaning was successful or not. 2182 */ 2183 AP_DECLARE(apr_status_t) ap_pstr2_alnum(apr_pool_t *p, const char *src, 2184 const char **dest); 2185 2186 /** 2187 * Cleanup a string (mainly to be filesystem safe) 2188 * We only allow '_' and alphanumeric chars. Non-printable 2189 * map to 'x' and all others map to '_' 2190 * 2191 * @param src string to clean up 2192 * @param dest cleaned up, pre-allocated string 2193 * @return Status value indicating whether the cleaning was successful or not. 2194 */ 2195 AP_DECLARE(apr_status_t) ap_str2_alnum(const char *src, char *dest); 2196 2197 /** 2198 * Structure to store the contents of an HTTP form of the type 2199 * application/x-www-form-urlencoded. 2200 * 2201 * Currently it contains the name as a char* of maximum length 2202 * HUGE_STRING_LEN, and a value in the form of a bucket brigade 2203 * of arbitrary length. 2204 */ 2205 typedef struct { 2206 const char *name; 2207 apr_bucket_brigade *value; 2208 } ap_form_pair_t; 2209 2210 /** 2211 * Read the body and parse any form found, which must be of the 2212 * type application/x-www-form-urlencoded. 2213 * @param r request containing POSTed form data 2214 * @param f filter 2215 * @param ptr returned array of ap_form_pair_t 2216 * @param num max num of params or -1 for unlimited 2217 * @param size max size allowed for parsed data 2218 * @return OK or HTTP error 2219 */ 2220 AP_DECLARE(int) ap_parse_form_data(request_rec *r, struct ap_filter_t *f, 2221 apr_array_header_t **ptr, 2222 apr_size_t num, apr_size_t size); 2223 2224 /* Misc system hackery */ 2225 /** 2226 * Given the name of an object in the file system determine if it is a directory 2227 * @param p The pool to allocate from 2228 * @param name The name of the object to check 2229 * @return 1 if it is a directory, 0 otherwise 2230 */ 2231 AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name); 2232 2233 /** 2234 * Given the name of an object in the file system determine if it is a directory - this version is symlink aware 2235 * @param p The pool to allocate from 2236 * @param name The name of the object to check 2237 * @return 1 if it is a directory, 0 otherwise 2238 */ 2239 AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name); 2240 2241 #ifdef _OSD_POSIX 2242 extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process); 2243 #endif /* _OSD_POSIX */ 2244 2245 /** 2246 * Determine the local host name for the current machine 2247 * @param p The pool to allocate from 2248 * @return A copy of the local host name 2249 */ 2250 char *ap_get_local_host(apr_pool_t *p); 2251 2252 /** 2253 * Log an assertion to the error log 2254 * @param szExp The assertion that failed 2255 * @param szFile The file the assertion is in 2256 * @param nLine The line the assertion is defined on 2257 */ 2258 AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine) 2259 __attribute__((noreturn)); 2260 2261 /** 2262 * @internal Internal Assert function 2263 */ 2264 #define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__)) 2265 2266 /** 2267 * Redefine assert() to something more useful for an Apache... 2268 * 2269 * Use ap_assert() if the condition should always be checked. 2270 * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG 2271 * is defined. 2272 */ 2273 #ifdef AP_DEBUG 2274 #define AP_DEBUG_ASSERT(exp) ap_assert(exp) 2275 #else 2276 #define AP_DEBUG_ASSERT(exp) ((void)0) 2277 #endif 2278 2279 /** 2280 * @defgroup stopsignal Flags which indicate places where the server should stop for debugging. 2281 * @{ 2282 * A set of flags which indicate places where the server should raise(SIGSTOP). 2283 * This is useful for debugging, because you can then attach to that process 2284 * with gdb and continue. This is important in cases where one_process 2285 * debugging isn't possible. 2286 */ 2287 /** stop on a Detach */ 2288 #define SIGSTOP_DETACH 1 2289 /** stop making a child process */ 2290 #define SIGSTOP_MAKE_CHILD 2 2291 /** stop spawning a child process */ 2292 #define SIGSTOP_SPAWN_CHILD 4 2293 /** stop spawning a child process with a piped log */ 2294 #define SIGSTOP_PIPED_LOG_SPAWN 8 2295 /** stop spawning a CGI child process */ 2296 #define SIGSTOP_CGI_CHILD 16 2297 2298 /** Macro to get GDB started */ 2299 #ifdef DEBUG_SIGSTOP 2300 extern int raise_sigstop_flags; 2301 #define RAISE_SIGSTOP(x) do { \ 2302 if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\ 2303 } while (0) 2304 #else 2305 #define RAISE_SIGSTOP(x) 2306 #endif 2307 /** @} */ 2308 /** 2309 * Get HTML describing the address and (optionally) admin of the server. 2310 * @param prefix Text which is prepended to the return value 2311 * @param r The request_rec 2312 * @return HTML describing the server, allocated in @a r's pool. 2313 */ 2314 AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r); 2315 2316 /* The C library has functions that allow const to be silently dropped ... 2317 these macros detect the drop in maintainer mode, but use the native 2318 methods for normal builds 2319 2320 Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs 2321 to be included before the macros are defined or compilation will fail. 2322 */ 2323 #include <string.h> 2324 2325 AP_DECLARE(char *) ap_strchr(char *s, int c); 2326 AP_DECLARE(const char *) ap_strchr_c(const char *s, int c); 2327 AP_DECLARE(char *) ap_strrchr(char *s, int c); 2328 AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c); 2329 AP_DECLARE(char *) ap_strstr(char *s, const char *c); 2330 AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c); 2331 2332 #ifdef AP_DEBUG 2333 2334 #undef strchr 2335 # define strchr(s, c) ap_strchr(s,c) 2336 #undef strrchr 2337 # define strrchr(s, c) ap_strrchr(s,c) 2338 #undef strstr 2339 # define strstr(s, c) ap_strstr(s,c) 2340 2341 #else 2342 2343 /** use this instead of strchr */ 2344 # define ap_strchr(s, c) strchr(s, c) 2345 /** use this instead of strchr */ 2346 # define ap_strchr_c(s, c) strchr(s, c) 2347 /** use this instead of strrchr */ 2348 # define ap_strrchr(s, c) strrchr(s, c) 2349 /** use this instead of strrchr */ 2350 # define ap_strrchr_c(s, c) strrchr(s, c) 2351 /** use this instead of strrstr*/ 2352 # define ap_strstr(s, c) strstr(s, c) 2353 /** use this instead of strrstr*/ 2354 # define ap_strstr_c(s, c) strstr(s, c) 2355 2356 #endif 2357 2358 /** 2359 * Generate pseudo random bytes. 2360 * This is a convenience interface to apr_random. It is cheaper but less 2361 * secure than apr_generate_random_bytes(). 2362 * @param buf where to store the bytes 2363 * @param size number of bytes to generate 2364 * @note ap_random_insecure_bytes() is thread-safe, it uses a mutex on 2365 * threaded MPMs. 2366 */ 2367 AP_DECLARE(void) ap_random_insecure_bytes(void *buf, apr_size_t size); 2368 2369 /** 2370 * Get a pseudo random number in a range. 2371 * @param min low end of range 2372 * @param max high end of range 2373 * @return a number in the range 2374 */ 2375 AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max); 2376 2377 /** 2378 * Abort with a error message signifying out of memory 2379 */ 2380 AP_DECLARE(void) ap_abort_on_oom(void) __attribute__((noreturn)); 2381 2382 /** 2383 * Wrapper for malloc() that calls ap_abort_on_oom() if out of memory 2384 * @param size size of the memory block 2385 * @return pointer to the allocated memory 2386 * @note ap_malloc may be implemented as a macro 2387 */ 2388 AP_DECLARE(void *) ap_malloc(size_t size) 2389 __attribute__((malloc)) 2390 AP_FN_ATTR_ALLOC_SIZE(1); 2391 2392 /** 2393 * Wrapper for calloc() that calls ap_abort_on_oom() if out of memory 2394 * @param nelem number of elements to allocate memory for 2395 * @param size size of a single element 2396 * @return pointer to the allocated memory 2397 * @note ap_calloc may be implemented as a macro 2398 */ 2399 AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size) 2400 __attribute__((malloc)) 2401 AP_FN_ATTR_ALLOC_SIZE2(1,2); 2402 2403 /** 2404 * Wrapper for realloc() that calls ap_abort_on_oom() if out of memory 2405 * @param ptr pointer to the old memory block (or NULL) 2406 * @param size new size of the memory block 2407 * @return pointer to the reallocated memory 2408 * @note ap_realloc may be implemented as a macro 2409 */ 2410 AP_DECLARE(void *) ap_realloc(void *ptr, size_t size) 2411 AP_FN_ATTR_WARN_UNUSED_RESULT 2412 AP_FN_ATTR_ALLOC_SIZE(2); 2413 2414 #if APR_HAS_THREADS 2415 2416 #if APR_VERSION_AT_LEAST(1,8,0) && !defined(AP_NO_THREAD_LOCAL) 2417 2418 /** 2419 * APR 1.8+ implement those already. 2420 */ 2421 #if APR_HAS_THREAD_LOCAL 2422 #define AP_HAS_THREAD_LOCAL 1 2423 #define AP_THREAD_LOCAL APR_THREAD_LOCAL 2424 #else 2425 #define AP_HAS_THREAD_LOCAL 0 2426 #endif 2427 #define ap_thread_create apr_thread_create 2428 #define ap_thread_current apr_thread_current 2429 #define ap_thread_current_create apr_thread_current_create 2430 #define ap_thread_current_after_fork apr_thread_current_after_fork 2431 2432 #else /* APR_VERSION_AT_LEAST(1,8,0) && !defined(AP_NO_THREAD_LOCAL) */ 2433 2434 #ifndef AP_NO_THREAD_LOCAL 2435 /** 2436 * AP_THREAD_LOCAL keyword mapping the compiler's. 2437 */ 2438 #if defined(__cplusplus) && __cplusplus >= 201103L 2439 #define AP_THREAD_LOCAL thread_local 2440 #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 && \ 2441 (!defined(__GNUC__) || \ 2442 __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) 2443 #define AP_THREAD_LOCAL _Thread_local 2444 #elif defined(__GNUC__) /* works for clang too */ 2445 #define AP_THREAD_LOCAL __thread 2446 #elif defined(WIN32) && defined(_MSC_VER) 2447 #define AP_THREAD_LOCAL __declspec(thread) 2448 #endif 2449 #endif /* ndef AP_NO_THREAD_LOCAL */ 2450 2451 #ifndef AP_THREAD_LOCAL 2452 #define AP_HAS_THREAD_LOCAL 0 2453 #define ap_thread_create apr_thread_create 2454 #else /* AP_THREAD_LOCAL */ 2455 #define AP_HAS_THREAD_LOCAL 1 2456 AP_DECLARE(apr_status_t) ap_thread_create(apr_thread_t **thread, 2457 apr_threadattr_t *attr, 2458 apr_thread_start_t func, 2459 void *data, apr_pool_t *pool); 2460 #endif /* AP_THREAD_LOCAL */ 2461 2462 AP_DECLARE(apr_status_t) ap_thread_current_create(apr_thread_t **current, 2463 apr_threadattr_t *attr, 2464 apr_pool_t *pool); 2465 AP_DECLARE(void) ap_thread_current_after_fork(void); 2466 AP_DECLARE(apr_thread_t *) ap_thread_current(void); 2467 2468 #endif /* APR_VERSION_AT_LEAST(1,8,0) && !defined(AP_NO_THREAD_LOCAL) */ 2469 2470 AP_DECLARE(apr_status_t) ap_thread_main_create(apr_thread_t **thread, 2471 apr_pool_t *pool); 2472 2473 #else /* APR_HAS_THREADS */ 2474 2475 #define AP_HAS_THREAD_LOCAL 0 2476 2477 #endif /* APR_HAS_THREADS */ 2478 2479 /** 2480 * Get server load params 2481 * @param ld struct to populate: -1 in fields means error 2482 */ 2483 AP_DECLARE(void) ap_get_sload(ap_sload_t *ld); 2484 2485 /** 2486 * Get server load averages (ala getloadavg) 2487 * @param ld struct to populate: -1 in fields means error 2488 */ 2489 AP_DECLARE(void) ap_get_loadavg(ap_loadavg_t *ld); 2490 2491 /** 2492 * Convert binary data into a hex string 2493 * @param src pointer to the data 2494 * @param srclen length of the data 2495 * @param dest pointer to buffer of length (2 * srclen + 1). The resulting 2496 * string will be NUL-terminated. 2497 */ 2498 AP_DECLARE(void) ap_bin2hex(const void *src, apr_size_t srclen, char *dest); 2499 2500 /** 2501 * Short function to execute a command and return the first line of 2502 * output minus \\r \\n. Useful for "obscuring" passwords via exec calls 2503 * @param p the pool to allocate from 2504 * @param cmd the command to execute 2505 * @param argv the arguments to pass to the cmd 2506 * @return ptr to characters or NULL on any error 2507 */ 2508 AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p, 2509 const char *cmd, 2510 const char * const *argv); 2511 2512 #define AP_NORESTART APR_OS_START_USEERR + 1 2513 2514 /** 2515 * Get the first index of the string in the array or -1 if not found. Start 2516 * searching a start. 2517 * @param array The array the check 2518 * @param s The string to find 2519 * @param start Start index for search. If start is out of bounds (negative or 2520 equal to array length or greater), -1 will be returned. 2521 * @return index of string in array or -1 2522 */ 2523 AP_DECLARE(int) ap_array_str_index(const apr_array_header_t *array, 2524 const char *s, 2525 int start); 2526 2527 /** 2528 * Check if the string is member of the given array by strcmp. 2529 * @param array The array the check 2530 * @param s The string to find 2531 * @return !=0 iff string is member of array (via strcmp) 2532 */ 2533 AP_DECLARE(int) ap_array_str_contains(const apr_array_header_t *array, 2534 const char *s); 2535 2536 /** 2537 * Perform a case-insensitive comparison of two strings @a str1 and @a str2, 2538 * treating upper and lower case values of the 26 standard C/POSIX alphabetic 2539 * characters as equivalent. Extended latin characters outside of this set 2540 * are treated as unique octets, irrespective of the current locale. 2541 * 2542 * Returns in integer greater than, equal to, or less than 0, 2543 * according to whether @a str1 is considered greater than, equal to, 2544 * or less than @a str2. 2545 * 2546 * @note Same code as apr_cstr_casecmp, which arrives in APR 1.6 2547 */ 2548 AP_DECLARE(int) ap_cstr_casecmp(const char *s1, const char *s2); 2549 2550 /** 2551 * Perform a case-insensitive comparison of two strings @a str1 and @a str2, 2552 * treating upper and lower case values of the 26 standard C/POSIX alphabetic 2553 * characters as equivalent. Extended latin characters outside of this set 2554 * are treated as unique octets, irrespective of the current locale. 2555 * 2556 * Returns in integer greater than, equal to, or less than 0, 2557 * according to whether @a str1 is considered greater than, equal to, 2558 * or less than @a str2. 2559 * 2560 * @note Same code as apr_cstr_casecmpn, which arrives in APR 1.6 2561 */ 2562 AP_DECLARE(int) ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n); 2563 2564 /** 2565 * Default flags for ap_dir_*fnmatch(). 2566 */ 2567 #define AP_DIR_FLAG_NONE 0 2568 2569 /** 2570 * If set, wildcards that match no files or directories will be ignored, otherwise 2571 * an error is triggered. 2572 */ 2573 #define AP_DIR_FLAG_OPTIONAL 1 2574 2575 /** 2576 * If set, and the wildcard resolves to a directory, recursively find all files 2577 * below that directory, otherwise return the directory. 2578 */ 2579 #define AP_DIR_FLAG_RECURSIVE 2 2580 2581 /** 2582 * Structure to provide the state of a directory match. 2583 */ 2584 typedef struct ap_dir_match_t ap_dir_match_t; 2585 2586 /** 2587 * Concrete structure to provide the state of a directory match. 2588 */ 2589 struct ap_dir_match_t { 2590 /** Pool to use for allocating the result */ 2591 apr_pool_t *p; 2592 /** Temporary pool used for directory traversal */ 2593 apr_pool_t *ptemp; 2594 /** Prefix for log messages */ 2595 const char *prefix; 2596 /** Callback for each file found that matches the wildcard. Return NULL on success, an error string on error. */ 2597 const char *(*cb)(ap_dir_match_t *w, const char *fname); 2598 /** Context for the callback */ 2599 void *ctx; 2600 /** Flags to indicate whether optional or recursive */ 2601 int flags; 2602 /** Recursion depth safety check */ 2603 unsigned int depth; 2604 }; 2605 2606 /** 2607 * Search for files given a non wildcard filename with non native separators. 2608 * 2609 * If the provided filename points at a file, the callback within ap_dir_match_t is 2610 * triggered for that file, and this function returns the result of the callback. 2611 * 2612 * If the provided filename points at a directory, and recursive within ap_dir_match_t 2613 * is true, the callback will be triggered for every file found recursively beneath 2614 * that directory, otherwise the callback is triggered once for the directory itself. 2615 * This function returns the result of the callback. 2616 * 2617 * If the provided path points to neither a file nor a directory, and optional within 2618 * ap_dir_match_t is true, this function returns NULL. If optional within ap_dir_match_t 2619 * is false, this function will return an error string indicating that the path does not 2620 * exist. 2621 * 2622 * @param w Directory match structure containing callback and context. 2623 * @param fname The name of the file or directory, with non native separators. 2624 * @return NULL on success, or a string describing the error. 2625 */ 2626 AP_DECLARE(const char *)ap_dir_nofnmatch(ap_dir_match_t *w, const char *fname) 2627 __attribute__((nonnull(1,2))); 2628 2629 /** 2630 * Search for files given a wildcard filename with non native separators. 2631 * 2632 * If the filename contains a wildcard, all files and directories that match the wildcard 2633 * will be returned. 2634 * 2635 * ap_dir_nofnmatch() is called for each directory and file found, and the callback 2636 * within ap_dir_match_t triggered as described above. 2637 * 2638 * Wildcards may appear in both directory and file components in the path, and 2639 * wildcards may appear more than once. 2640 * 2641 * @param w Directory match structure containing callback and context. 2642 * @param path Path prefix for search, with non native separators and no wildcards. 2643 * @param fname The name of the file or directory, with non native separators and 2644 * optional wildcards. 2645 * @return NULL on success, or a string describing the error. 2646 */ 2647 AP_DECLARE(const char *)ap_dir_fnmatch(ap_dir_match_t *w, const char *path, 2648 const char *fname) __attribute__((nonnull(1,3))); 2649 2650 /** 2651 * Determine if the final Transfer-Encoding is "chunked". 2652 * 2653 * @param p The pool to allocate from 2654 * @param line the header field-value to scan 2655 * @return 1 if the last Transfer-Encoding is "chunked", else 0 2656 */ 2657 AP_DECLARE(int) ap_is_chunked(apr_pool_t *p, const char *line); 2658 2659 #ifdef __cplusplus 2660 } 2661 #endif 2662 2663 #endif /* !APACHE_HTTPD_H */ 2664 2665 /** @} //APACHE Daemon */ 2666 /** @} //APACHE Core */ 2667 /** @} //APACHE super group */ 2668