12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507 |
- /* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /**
- * @file httpd.h
- * @brief HTTP Daemon routines
- *
- * @defgroup APACHE Apache HTTP Server
- *
- * Top level group of which all other groups are a member
- * @{
- *
- * @defgroup APACHE_MODS Loadable modules
- * Top level group for modules
- * @defgroup APACHE_OS Operating System Specific
- * @defgroup APACHE_INTERNAL Internal interfaces
- * @defgroup APACHE_CORE Core routines
- * @{
- * @defgroup APACHE_CORE_DAEMON HTTP Daemon Routine
- * @{
- */
- #ifndef APACHE_HTTPD_H
- #define APACHE_HTTPD_H
- /* XXX - We need to push more stuff to other .h files, or even .c files, to
- * make this file smaller
- */
- /* Headers in which EVERYONE has an interest... */
- #include "ap_config.h"
- #include "ap_mmn.h"
- #include "ap_release.h"
- #include "apr.h"
- #include "apr_general.h"
- #include "apr_tables.h"
- #include "apr_pools.h"
- #include "apr_time.h"
- #include "apr_network_io.h"
- #include "apr_buckets.h"
- #include "apr_poll.h"
- #include "apr_thread_proc.h"
- #include "os.h"
- #include "ap_regex.h"
- #if APR_HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- /* Note: apr_uri.h is also included, see below */
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* ----------------------------- config dir ------------------------------ */
- /** Define this to be the default server home dir. Most things later in this
- * file with a relative pathname will have this added.
- */
- #ifndef HTTPD_ROOT
- #ifdef OS2
- /** Set default for OS/2 file system */
- #define HTTPD_ROOT "/os2httpd"
- #elif defined(WIN32)
- /** Set default for Windows file system */
- #define HTTPD_ROOT "/apache"
- #elif defined (NETWARE)
- /** Set the default for NetWare */
- #define HTTPD_ROOT "/apache"
- #else
- /** Set for all other OSs */
- #define HTTPD_ROOT "/usr/local/apache"
- #endif
- #endif /* HTTPD_ROOT */
- /*
- * --------- You shouldn't have to edit anything below this line ----------
- *
- * Any modifications to any defaults not defined above should be done in the
- * respective configuration file.
- *
- */
- /**
- * Default location of documents. Can be overridden by the DocumentRoot
- * directive.
- */
- #ifndef DOCUMENT_LOCATION
- #ifdef OS2
- /* Set default for OS/2 file system */
- #define DOCUMENT_LOCATION HTTPD_ROOT "/docs"
- #else
- /* Set default for non OS/2 file system */
- #define DOCUMENT_LOCATION HTTPD_ROOT "/htdocs"
- #endif
- #endif /* DOCUMENT_LOCATION */
- /** Maximum number of dynamically loaded modules */
- #ifndef DYNAMIC_MODULE_LIMIT
- #define DYNAMIC_MODULE_LIMIT 256
- #endif
- /** Default administrator's address */
- #define DEFAULT_ADMIN "[no address given]"
- /** The name of the log files */
- #ifndef DEFAULT_ERRORLOG
- #if defined(OS2) || defined(WIN32)
- #define DEFAULT_ERRORLOG "logs/error.log"
- #else
- #define DEFAULT_ERRORLOG "logs/error_log"
- #endif
- #endif /* DEFAULT_ERRORLOG */
- /** Define this to be what your per-directory security files are called */
- #ifndef DEFAULT_ACCESS_FNAME
- #ifdef OS2
- /* Set default for OS/2 file system */
- #define DEFAULT_ACCESS_FNAME "htaccess"
- #else
- #define DEFAULT_ACCESS_FNAME ".htaccess"
- #endif
- #endif /* DEFAULT_ACCESS_FNAME */
- /** The name of the server config file */
- #ifndef SERVER_CONFIG_FILE
- #define SERVER_CONFIG_FILE "conf/httpd.conf"
- #endif
- /** The default path for CGI scripts if none is currently set */
- #ifndef DEFAULT_PATH
- #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
- #endif
- /** The path to the suExec wrapper, can be overridden in Configuration */
- #ifndef SUEXEC_BIN
- #define SUEXEC_BIN HTTPD_ROOT "/bin/suexec"
- #endif
- /** The timeout for waiting for messages */
- #ifndef DEFAULT_TIMEOUT
- #define DEFAULT_TIMEOUT 60
- #endif
- /** The timeout for waiting for keepalive timeout until next request */
- #ifndef DEFAULT_KEEPALIVE_TIMEOUT
- #define DEFAULT_KEEPALIVE_TIMEOUT 5
- #endif
- /** The number of requests to entertain per connection */
- #ifndef DEFAULT_KEEPALIVE
- #define DEFAULT_KEEPALIVE 100
- #endif
- /*
- * Limits on the size of various request items. These limits primarily
- * exist to prevent simple denial-of-service attacks on a server based
- * on misuse of the protocol. The recommended values will depend on the
- * nature of the server resources -- CGI scripts and database backends
- * might require large values, but most servers could get by with much
- * smaller limits than we use below. The request message body size can
- * be limited by the per-dir config directive LimitRequestBody.
- *
- * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE
- * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190.
- * These two limits can be lowered or raised by the server config
- * directives LimitRequestLine and LimitRequestFieldsize, respectively.
- *
- * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by
- * the server config directive LimitRequestFields.
- */
- /** default limit on bytes in Request-Line (Method+URI+HTTP-version) */
- #ifndef DEFAULT_LIMIT_REQUEST_LINE
- #define DEFAULT_LIMIT_REQUEST_LINE 8190
- #endif
- /** default limit on bytes in any one header field */
- #ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE
- #define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190
- #endif
- /** default limit on number of request header fields */
- #ifndef DEFAULT_LIMIT_REQUEST_FIELDS
- #define DEFAULT_LIMIT_REQUEST_FIELDS 100
- #endif
- /** default/hard limit on number of leading/trailing empty lines */
- #ifndef DEFAULT_LIMIT_BLANK_LINES
- #define DEFAULT_LIMIT_BLANK_LINES 10
- #endif
- /**
- * The default default character set name to add if AddDefaultCharset is
- * enabled. Overridden with AddDefaultCharsetName.
- */
- #define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1"
- /** default HTTP Server protocol */
- #define AP_SERVER_PROTOCOL "HTTP/1.1"
- /* ------------------ stuff that modules are allowed to look at ----------- */
- /** Define this to be what your HTML directory content files are called */
- #ifndef AP_DEFAULT_INDEX
- #define AP_DEFAULT_INDEX "index.html"
- #endif
- /** The name of the MIME types file */
- #ifndef AP_TYPES_CONFIG_FILE
- #define AP_TYPES_CONFIG_FILE "conf/mime.types"
- #endif
- /*
- * Define the HTML doctype strings centrally.
- */
- /** HTML 2.0 Doctype */
- #define DOCTYPE_HTML_2_0 "<!DOCTYPE HTML PUBLIC \"-//IETF//" \
- "DTD HTML 2.0//EN\">\n"
- /** HTML 3.2 Doctype */
- #define DOCTYPE_HTML_3_2 "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
- "DTD HTML 3.2 Final//EN\">\n"
- /** HTML 4.0 Strict Doctype */
- #define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
- "DTD HTML 4.0//EN\"\n" \
- "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
- /** HTML 4.0 Transitional Doctype */
- #define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
- "DTD HTML 4.0 Transitional//EN\"\n" \
- "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n"
- /** HTML 4.0 Frameset Doctype */
- #define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
- "DTD HTML 4.0 Frameset//EN\"\n" \
- "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n"
- /** XHTML 1.0 Strict Doctype */
- #define DOCTYPE_XHTML_1_0S "<!DOCTYPE html PUBLIC \"-//W3C//" \
- "DTD XHTML 1.0 Strict//EN\"\n" \
- "\"http://www.w3.org/TR/xhtml1/DTD/" \
- "xhtml1-strict.dtd\">\n"
- /** XHTML 1.0 Transitional Doctype */
- #define DOCTYPE_XHTML_1_0T "<!DOCTYPE html PUBLIC \"-//W3C//" \
- "DTD XHTML 1.0 Transitional//EN\"\n" \
- "\"http://www.w3.org/TR/xhtml1/DTD/" \
- "xhtml1-transitional.dtd\">\n"
- /** XHTML 1.0 Frameset Doctype */
- #define DOCTYPE_XHTML_1_0F "<!DOCTYPE html PUBLIC \"-//W3C//" \
- "DTD XHTML 1.0 Frameset//EN\"\n" \
- "\"http://www.w3.org/TR/xhtml1/DTD/" \
- "xhtml1-frameset.dtd\">"
- /** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */
- #define HTTP_VERSION(major,minor) (1000*(major)+(minor))
- /** Major part of HTTP protocol */
- #define HTTP_VERSION_MAJOR(number) ((number)/1000)
- /** Minor part of HTTP protocol */
- #define HTTP_VERSION_MINOR(number) ((number)%1000)
- /* -------------- Port number for server running standalone --------------- */
- /** default HTTP Port */
- #define DEFAULT_HTTP_PORT 80
- /** default HTTPS Port */
- #define DEFAULT_HTTPS_PORT 443
- /**
- * Check whether @a port is the default port for the request @a r.
- * @param port The port number
- * @param r The request
- * @see #ap_default_port
- */
- #define ap_is_default_port(port,r) ((port) == ap_default_port(r))
- /**
- * Get the default port for a request (which depends on the scheme).
- * @param r The request
- */
- #define ap_default_port(r) ap_run_default_port(r)
- /**
- * Get the scheme for a request.
- * @param r The request
- */
- #define ap_http_scheme(r) ap_run_http_scheme(r)
- /** The default string length */
- #define MAX_STRING_LEN HUGE_STRING_LEN
- /** The length of a Huge string */
- #define HUGE_STRING_LEN 8192
- /** The size of the server's internal read-write buffers */
- #define AP_IOBUFSIZE 8192
- /** The max number of regex captures that can be expanded by ap_pregsub */
- #define AP_MAX_REG_MATCH 10
- /**
- * APR_HAS_LARGE_FILES introduces the problem of spliting sendfile into
- * multiple buckets, no greater than MAX(apr_size_t), and more granular
- * than that in case the brigade code/filters attempt to read it directly.
- * ### 16mb is an invention, no idea if it is reasonable.
- */
- #define AP_MAX_SENDFILE 16777216 /* 2^24 */
- /**
- * MPM child process exit status values
- * The MPM parent process may check the status to see if special
- * error handling is required.
- */
- /** a normal exit */
- #define APEXIT_OK 0x0
- /** A fatal error arising during the server's init sequence */
- #define APEXIT_INIT 0x2
- /** The child died during its init sequence */
- #define APEXIT_CHILDINIT 0x3
- /**
- * The child exited due to a resource shortage.
- * The parent should limit the rate of forking until
- * the situation is resolved.
- */
- #define APEXIT_CHILDSICK 0x7
- /**
- * A fatal error, resulting in the whole server aborting.
- * If a child exits with this error, the parent process
- * considers this a server-wide fatal error and aborts.
- */
- #define APEXIT_CHILDFATAL 0xf
- #ifndef AP_DECLARE
- /**
- * Stuff marked #AP_DECLARE is part of the API, and intended for use
- * by modules. Its purpose is to allow us to add attributes that
- * particular platforms or compilers require to every exported function.
- */
- # define AP_DECLARE(type) type
- #endif
- #ifndef AP_DECLARE_NONSTD
- /**
- * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for
- * use by modules. The difference between #AP_DECLARE and
- * #AP_DECLARE_NONSTD is that the latter is required for any functions
- * which use varargs or are used via indirect function call. This
- * is to accommodate the two calling conventions in windows dlls.
- */
- # define AP_DECLARE_NONSTD(type) type
- #endif
- #ifndef AP_DECLARE_DATA
- # define AP_DECLARE_DATA
- #endif
- #ifndef AP_MODULE_DECLARE
- # define AP_MODULE_DECLARE(type) type
- #endif
- #ifndef AP_MODULE_DECLARE_NONSTD
- # define AP_MODULE_DECLARE_NONSTD(type) type
- #endif
- #ifndef AP_MODULE_DECLARE_DATA
- # define AP_MODULE_DECLARE_DATA
- #endif
- /**
- * @internal
- * modules should not use functions marked AP_CORE_DECLARE
- */
- #ifndef AP_CORE_DECLARE
- # define AP_CORE_DECLARE AP_DECLARE
- #endif
- /**
- * @internal
- * modules should not use functions marked AP_CORE_DECLARE_NONSTD
- */
- #ifndef AP_CORE_DECLARE_NONSTD
- # define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD
- #endif
- /**
- * @defgroup APACHE_APR_STATUS_T HTTPD specific values of apr_status_t
- * @{
- */
- #define AP_START_USERERR (APR_OS_START_USERERR + 2000)
- #define AP_USERERR_LEN 1000
- /** The function declines to handle the request */
- #define AP_DECLINED (AP_START_USERERR + 0)
- /** @} */
- /**
- * @brief The numeric version information is broken out into fields within this
- * structure.
- */
- typedef struct {
- int major; /**< major number */
- int minor; /**< minor number */
- int patch; /**< patch number */
- const char *add_string; /**< additional string like "-dev" */
- } ap_version_t;
- /**
- * Return httpd's version information in a numeric form.
- *
- * @param version Pointer to a version structure for returning the version
- * information.
- */
- AP_DECLARE(void) ap_get_server_revision(ap_version_t *version);
- /**
- * Get the server banner in a form suitable for sending over the
- * network, with the level of information controlled by the
- * ServerTokens directive.
- * @return The server banner
- */
- AP_DECLARE(const char *) ap_get_server_banner(void);
- /**
- * Get the server description in a form suitable for local displays,
- * status reports, or logging. This includes the detailed server
- * version and information about some modules. It is not affected
- * by the ServerTokens directive.
- * @return The server description
- */
- AP_DECLARE(const char *) ap_get_server_description(void);
- /**
- * Add a component to the server description and banner strings
- * @param pconf The pool to allocate the component from
- * @param component The string to add
- */
- AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component);
- /**
- * Get the date a time that the server was built
- * @return The server build time string
- */
- AP_DECLARE(const char *) ap_get_server_built(void);
- /* non-HTTP status codes returned by hooks */
- #define OK 0 /**< Module has handled this stage. */
- #define DECLINED -1 /**< Module declines to handle */
- #define DONE -2 /**< Module has served the response completely
- * - it's safe to die() with no more output
- */
- #define SUSPENDED -3 /**< Module will handle the remainder of the request.
- * The core will never invoke the request again, */
- /** Returned by the bottom-most filter if no data was written.
- * @see ap_pass_brigade(). */
- #define AP_NOBODY_WROTE -100
- /** Returned by the bottom-most filter if no data was read.
- * @see ap_get_brigade(). */
- #define AP_NOBODY_READ -101
- /** Returned by any filter if the filter chain encounters an error
- * and has already dealt with the error response.
- */
- #define AP_FILTER_ERROR -102
- /**
- * @defgroup HTTP_Status HTTP Status Codes
- * @{
- */
- /**
- * The size of the static status_lines array in http_protocol.c for
- * storing all of the potential response status-lines (a sparse table).
- * When adding a new code here add it to status_lines as well.
- * A future version should dynamically generate the apr_table_t at startup.
- */
- #define RESPONSE_CODES 103
- #define HTTP_CONTINUE 100
- #define HTTP_SWITCHING_PROTOCOLS 101
- #define HTTP_PROCESSING 102
- #define HTTP_OK 200
- #define HTTP_CREATED 201
- #define HTTP_ACCEPTED 202
- #define HTTP_NON_AUTHORITATIVE 203
- #define HTTP_NO_CONTENT 204
- #define HTTP_RESET_CONTENT 205
- #define HTTP_PARTIAL_CONTENT 206
- #define HTTP_MULTI_STATUS 207
- #define HTTP_ALREADY_REPORTED 208
- #define HTTP_IM_USED 226
- #define HTTP_MULTIPLE_CHOICES 300
- #define HTTP_MOVED_PERMANENTLY 301
- #define HTTP_MOVED_TEMPORARILY 302
- #define HTTP_SEE_OTHER 303
- #define HTTP_NOT_MODIFIED 304
- #define HTTP_USE_PROXY 305
- #define HTTP_TEMPORARY_REDIRECT 307
- #define HTTP_PERMANENT_REDIRECT 308
- #define HTTP_BAD_REQUEST 400
- #define HTTP_UNAUTHORIZED 401
- #define HTTP_PAYMENT_REQUIRED 402
- #define HTTP_FORBIDDEN 403
- #define HTTP_NOT_FOUND 404
- #define HTTP_METHOD_NOT_ALLOWED 405
- #define HTTP_NOT_ACCEPTABLE 406
- #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407
- #define HTTP_REQUEST_TIME_OUT 408
- #define HTTP_CONFLICT 409
- #define HTTP_GONE 410
- #define HTTP_LENGTH_REQUIRED 411
- #define HTTP_PRECONDITION_FAILED 412
- #define HTTP_REQUEST_ENTITY_TOO_LARGE 413
- #define HTTP_REQUEST_URI_TOO_LARGE 414
- #define HTTP_UNSUPPORTED_MEDIA_TYPE 415
- #define HTTP_RANGE_NOT_SATISFIABLE 416
- #define HTTP_EXPECTATION_FAILED 417
- #define HTTP_MISDIRECTED_REQUEST 421
- #define HTTP_UNPROCESSABLE_ENTITY 422
- #define HTTP_LOCKED 423
- #define HTTP_FAILED_DEPENDENCY 424
- #define HTTP_UPGRADE_REQUIRED 426
- #define HTTP_PRECONDITION_REQUIRED 428
- #define HTTP_TOO_MANY_REQUESTS 429
- #define HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 431
- #define HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 451
- #define HTTP_INTERNAL_SERVER_ERROR 500
- #define HTTP_NOT_IMPLEMENTED 501
- #define HTTP_BAD_GATEWAY 502
- #define HTTP_SERVICE_UNAVAILABLE 503
- #define HTTP_GATEWAY_TIME_OUT 504
- #define HTTP_VERSION_NOT_SUPPORTED 505
- #define HTTP_VARIANT_ALSO_VARIES 506
- #define HTTP_INSUFFICIENT_STORAGE 507
- #define HTTP_LOOP_DETECTED 508
- #define HTTP_NOT_EXTENDED 510
- #define HTTP_NETWORK_AUTHENTICATION_REQUIRED 511
- /** is the status code informational */
- #define ap_is_HTTP_INFO(x) (((x) >= 100)&&((x) < 200))
- /** is the status code OK ?*/
- #define ap_is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300))
- /** is the status code a redirect */
- #define ap_is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 400))
- /** is the status code a error (client or server) */
- #define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600))
- /** is the status code a client error */
- #define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500))
- /** is the status code a server error */
- #define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600))
- /** is the status code a (potentially) valid response code? */
- #define ap_is_HTTP_VALID_RESPONSE(x) (((x) >= 100)&&((x) < 600))
- /** should the status code drop the connection */
- #define ap_status_drops_connection(x) \
- (((x) == HTTP_BAD_REQUEST) || \
- ((x) == HTTP_REQUEST_TIME_OUT) || \
- ((x) == HTTP_LENGTH_REQUIRED) || \
- ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \
- ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \
- ((x) == HTTP_INTERNAL_SERVER_ERROR) || \
- ((x) == HTTP_SERVICE_UNAVAILABLE) || \
- ((x) == HTTP_NOT_IMPLEMENTED))
- /** does the status imply header only response (i.e. never w/ a body)? */
- #define AP_STATUS_IS_HEADER_ONLY(x) ((x) == HTTP_NO_CONTENT || \
- (x) == HTTP_NOT_MODIFIED)
- /** @} */
- /**
- * @defgroup Methods List of Methods recognized by the server
- * @ingroup APACHE_CORE_DAEMON
- * @{
- *
- * @brief Methods recognized (but not necessarily handled) by the server.
- *
- * These constants are used in bit shifting masks of size int, so it is
- * unsafe to have more methods than bits in an int. HEAD == M_GET.
- * This list must be tracked by the list in http_protocol.c in routine
- * ap_method_name_of().
- *
- */
- #define M_GET 0 /** RFC 2616: HTTP */
- #define M_PUT 1 /* : */
- #define M_POST 2
- #define M_DELETE 3
- #define M_CONNECT 4
- #define M_OPTIONS 5
- #define M_TRACE 6 /** RFC 2616: HTTP */
- #define M_PATCH 7 /** RFC 5789: PATCH Method for HTTP */
- #define M_PROPFIND 8 /** RFC 2518: WebDAV */
- #define M_PROPPATCH 9 /* : */
- #define M_MKCOL 10
- #define M_COPY 11
- #define M_MOVE 12
- #define M_LOCK 13
- #define M_UNLOCK 14 /** RFC 2518: WebDAV */
- #define M_VERSION_CONTROL 15 /** RFC 3253: WebDAV Versioning */
- #define M_CHECKOUT 16 /* : */
- #define M_UNCHECKOUT 17
- #define M_CHECKIN 18
- #define M_UPDATE 19
- #define M_LABEL 20
- #define M_REPORT 21
- #define M_MKWORKSPACE 22
- #define M_MKACTIVITY 23
- #define M_BASELINE_CONTROL 24
- #define M_MERGE 25
- #define M_INVALID 26 /** no valid method */
- /**
- * METHODS needs to be equal to the number of bits
- * we are using for limit masks.
- */
- #define METHODS 64
- /**
- * The method mask bit to shift for anding with a bitmask.
- */
- #define AP_METHOD_BIT ((apr_int64_t)1)
- /** @} */
- /** @see ap_method_list_t */
- typedef struct ap_method_list_t ap_method_list_t;
- /**
- * @struct ap_method_list_t
- * @brief Structure for handling HTTP methods.
- *
- * Methods known to the server are accessed via a bitmask shortcut;
- * extension methods are handled by an array.
- */
- struct ap_method_list_t {
- /** The bitmask used for known methods */
- apr_int64_t method_mask;
- /** the array used for extension methods */
- apr_array_header_t *method_list;
- };
- /**
- * @defgroup module_magic Module Magic mime types
- * @{
- */
- /** Magic for mod_cgi[d] */
- #define CGI_MAGIC_TYPE "application/x-httpd-cgi"
- /** Magic for mod_include */
- #define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html"
- /** Magic for mod_include */
- #define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3"
- /** Magic for mod_dir */
- #define DIR_MAGIC_TYPE "httpd/unix-directory"
- /** Default for r->handler if no content-type set by type_checker */
- #define AP_DEFAULT_HANDLER_NAME ""
- #define AP_IS_DEFAULT_HANDLER_NAME(x) (*x == '\0')
- /** @} */
- /* Just in case your linefeed isn't the one the other end is expecting. */
- #if !APR_CHARSET_EBCDIC
- /** linefeed */
- #define LF 10
- /** carrige return */
- #define CR 13
- /** carrige return /Line Feed Combo */
- #define CRLF "\015\012"
- #else /* APR_CHARSET_EBCDIC */
- /* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done
- * in the buff package (bread/bputs/bwrite). Everywhere else, we use
- * "native EBCDIC" CR and NL characters. These are therefore
- * defined as
- * '\r' and '\n'.
- */
- #define CR '\r'
- #define LF '\n'
- #define CRLF "\r\n"
- #endif /* APR_CHARSET_EBCDIC */
- /** Useful for common code with either platform charset. */
- #define CRLF_ASCII "\015\012"
- /**
- * @defgroup values_request_rec_body Possible values for request_rec.read_body
- * @{
- * Possible values for request_rec.read_body (set by handling module):
- */
- /** Send 413 error if message has any body */
- #define REQUEST_NO_BODY 0
- /** Send 411 error if body without Content-Length */
- #define REQUEST_CHUNKED_ERROR 1
- /** If chunked, remove the chunks for me. */
- #define REQUEST_CHUNKED_DECHUNK 2
- /** @} // values_request_rec_body */
- /**
- * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info
- * @ingroup APACHE_CORE_DAEMON
- * @{
- * Possible values for request_rec.used_path_info:
- */
- /** Accept the path_info from the request */
- #define AP_REQ_ACCEPT_PATH_INFO 0
- /** Return a 404 error if path_info was given */
- #define AP_REQ_REJECT_PATH_INFO 1
- /** Module may chose to use the given path_info */
- #define AP_REQ_DEFAULT_PATH_INFO 2
- /** @} // values_request_rec_used_path_info */
- /*
- * Things which may vary per file-lookup WITHIN a request ---
- * e.g., state of MIME config. Basically, the name of an object, info
- * about the object, and any other info we may ahve which may need to
- * change as we go poking around looking for it (e.g., overridden by
- * .htaccess files).
- *
- * Note how the default state of almost all these things is properly
- * zero, so that allocating it with pcalloc does the right thing without
- * a whole lot of hairy initialization... so long as we are willing to
- * make the (fairly) portable assumption that the bit pattern of a NULL
- * pointer is, in fact, zero.
- */
- /**
- * @brief This represents the result of calling htaccess; these are cached for
- * each request.
- */
- struct htaccess_result {
- /** the directory to which this applies */
- const char *dir;
- /** the overrides allowed for the .htaccess file */
- int override;
- /** the override options allowed for the .htaccess file */
- int override_opts;
- /** Table of allowed directives for override */
- apr_table_t *override_list;
- /** the configuration directives */
- struct ap_conf_vector_t *htaccess;
- /** the next one, or NULL if no more; N.B. never change this */
- const struct htaccess_result *next;
- };
- /* The following four types define a hierarchy of activities, so that
- * given a request_rec r you can write r->connection->server->process
- * to get to the process_rec. While this reduces substantially the
- * number of arguments that various hooks require beware that in
- * threaded versions of the server you must consider multiplexing
- * issues. */
- /** A structure that represents one process */
- typedef struct process_rec process_rec;
- /** A structure that represents a virtual server */
- typedef struct server_rec server_rec;
- /** A structure that represents one connection */
- typedef struct conn_rec conn_rec;
- /** A structure that represents the current request */
- typedef struct request_rec request_rec;
- /** A structure that represents the status of the current connection */
- typedef struct conn_state_t conn_state_t;
- /* ### would be nice to not include this from httpd.h ... */
- /* This comes after we have defined the request_rec type */
- #include "apr_uri.h"
- /**
- * @brief A structure that represents one process
- */
- struct process_rec {
- /** Global pool. Cleared upon normal exit */
- apr_pool_t *pool;
- /** Configuration pool. Cleared upon restart */
- apr_pool_t *pconf;
- /** The program name used to execute the program */
- const char *short_name;
- /** The command line arguments */
- const char * const *argv;
- /** Number of command line arguments passed to the program */
- int argc;
- };
- /**
- * @brief A structure that represents the current request
- */
- struct request_rec {
- /** The pool associated with the request */
- apr_pool_t *pool;
- /** The connection to the client */
- conn_rec *connection;
- /** The virtual host for this request */
- server_rec *server;
- /** Pointer to the redirected request if this is an external redirect */
- request_rec *next;
- /** Pointer to the previous request if this is an internal redirect */
- request_rec *prev;
- /** Pointer to the main request if this is a sub-request
- * (see http_request.h) */
- request_rec *main;
- /* Info about the request itself... we begin with stuff that only
- * protocol.c should ever touch...
- */
- /** First line of request */
- char *the_request;
- /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */
- int assbackwards;
- /** A proxy request (calculated during post_read_request/translate_name)
- * possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE,
- * PROXYREQ_RESPONSE
- */
- int proxyreq;
- /** HEAD request, as opposed to GET */
- int header_only;
- /** Protocol version number of protocol; 1.1 = 1001 */
- int proto_num;
- /** Protocol string, as given to us, or HTTP/0.9 */
- char *protocol;
- /** Host, as set by full URI or Host: header.
- * For literal IPv6 addresses, this does NOT include the surrounding [ ]
- */
- const char *hostname;
- /** Time when the request started */
- apr_time_t request_time;
- /** Status line, if set by script */
- const char *status_line;
- /** Status line */
- int status;
- /* Request method, two ways; also, protocol, etc.. Outside of protocol.c,
- * look, but don't touch.
- */
- /** M_GET, M_POST, etc. */
- int method_number;
- /** Request method (eg. GET, HEAD, POST, etc.) */
- const char *method;
- /**
- * 'allowed' is a bitvector of the allowed methods.
- *
- * A handler must ensure that the request method is one that
- * it is capable of handling. Generally modules should DECLINE
- * any request methods they do not handle. Prior to aborting the
- * handler like this the handler should set r->allowed to the list
- * of methods that it is willing to handle. This bitvector is used
- * to construct the "Allow:" header required for OPTIONS requests,
- * and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes.
- *
- * Since the default_handler deals with OPTIONS, all modules can
- * usually decline to deal with OPTIONS. TRACE is always allowed,
- * modules don't need to set it explicitly.
- *
- * Since the default_handler will always handle a GET, a
- * module which does *not* implement GET should probably return
- * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET
- * handler can't be installed by mod_actions.
- */
- apr_int64_t allowed;
- /** Array of extension methods */
- apr_array_header_t *allowed_xmethods;
- /** List of allowed methods */
- ap_method_list_t *allowed_methods;
- /** byte count in stream is for body */
- apr_off_t sent_bodyct;
- /** body byte count, for easy access */
- apr_off_t bytes_sent;
- /** Last modified time of the requested resource */
- apr_time_t mtime;
- /* HTTP/1.1 connection-level features */
- /** The Range: header */
- const char *range;
- /** The "real" content length */
- apr_off_t clength;
- /** sending chunked transfer-coding */
- int chunked;
- /** Method for reading the request body
- * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY,
- * REQUEST_CHUNKED_DECHUNK, etc...) */
- int read_body;
- /** reading chunked transfer-coding */
- int read_chunked;
- /** is client waiting for a 100 response? */
- unsigned expecting_100;
- /** The optional kept body of the request. */
- apr_bucket_brigade *kept_body;
- /** For ap_body_to_table(): parsed body */
- /* XXX: ap_body_to_table has been removed. Remove body_table too or
- * XXX: keep it to reintroduce ap_body_to_table without major bump? */
- apr_table_t *body_table;
- /** Remaining bytes left to read from the request body */
- apr_off_t remaining;
- /** Number of bytes that have been read from the request body */
- apr_off_t read_length;
- /* MIME header environments, in and out. Also, an array containing
- * environment variables to be passed to subprocesses, so people can
- * write modules to add to that environment.
- *
- * The difference between headers_out and err_headers_out is that the
- * latter are printed even on error, and persist across internal redirects
- * (so the headers printed for ErrorDocument handlers will have them).
- *
- * The 'notes' apr_table_t is for notes from one module to another, with no
- * other set purpose in mind...
- */
- /** MIME header environment from the request */
- apr_table_t *headers_in;
- /** MIME header environment for the response */
- apr_table_t *headers_out;
- /** MIME header environment for the response, printed even on errors and
- * persist across internal redirects */
- apr_table_t *err_headers_out;
- /** Array of environment variables to be used for sub processes */
- apr_table_t *subprocess_env;
- /** Notes from one module to another */
- apr_table_t *notes;
- /* content_type, handler, content_encoding, and all content_languages
- * MUST be lowercased strings. They may be pointers to static strings;
- * they should not be modified in place.
- */
- /** The content-type for the current request */
- const char *content_type; /* Break these out --- we dispatch on 'em */
- /** The handler string that we use to call a handler function */
- const char *handler; /* What we *really* dispatch on */
- /** How to encode the data */
- const char *content_encoding;
- /** Array of strings representing the content languages */
- apr_array_header_t *content_languages;
- /** variant list validator (if negotiated) */
- char *vlist_validator;
- /** If an authentication check was made, this gets set to the user name. */
- char *user;
- /** If an authentication check was made, this gets set to the auth type. */
- char *ap_auth_type;
- /* What object is being requested (either directly, or via include
- * or content-negotiation mapping).
- */
- /** The URI without any parsing performed */
- char *unparsed_uri;
- /** The path portion of the URI, or "/" if no path provided */
- char *uri;
- /** The filename on disk corresponding to this response */
- char *filename;
- /** The true filename stored in the filesystem, as in the true alpha case
- * and alias correction, e.g. "Image.jpeg" not "IMAGE$1.JPE" on Windows.
- * The core map_to_storage canonicalizes r->filename when they mismatch */
- char *canonical_filename;
- /** The PATH_INFO extracted from this request */
- char *path_info;
- /** The QUERY_ARGS extracted from this request */
- char *args;
- /**
- * Flag for the handler to accept or reject path_info on
- * the current request. All modules should respect the
- * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO
- * values, while AP_REQ_DEFAULT_PATH_INFO indicates they
- * may follow existing conventions. This is set to the
- * user's preference upon HOOK_VERY_FIRST of the fixups.
- */
- int used_path_info;
- /** A flag to determine if the eos bucket has been sent yet */
- int eos_sent;
- /* Various other config info which may change with .htaccess files
- * These are config vectors, with one void* pointer for each module
- * (the thing pointed to being the module's business).
- */
- /** Options set in config files, etc. */
- struct ap_conf_vector_t *per_dir_config;
- /** Notes on *this* request */
- struct ap_conf_vector_t *request_config;
- /** Optional request log level configuration. Will usually point
- * to a server or per_dir config, i.e. must be copied before
- * modifying */
- const struct ap_logconf *log;
- /** Id to identify request in access and error log. Set when the first
- * error log entry for this request is generated.
- */
- const char *log_id;
- /**
- * A linked list of the .htaccess configuration directives
- * accessed by this request.
- * N.B. always add to the head of the list, _never_ to the end.
- * that way, a sub request's list can (temporarily) point to a parent's list
- */
- const struct htaccess_result *htaccess;
- /** A list of output filters to be used for this request */
- struct ap_filter_t *output_filters;
- /** A list of input filters to be used for this request */
- struct ap_filter_t *input_filters;
- /** A list of protocol level output filters to be used for this
- * request */
- struct ap_filter_t *proto_output_filters;
- /** A list of protocol level input filters to be used for this
- * request */
- struct ap_filter_t *proto_input_filters;
- /** This response can not be cached */
- int no_cache;
- /** There is no local copy of this response */
- int no_local_copy;
- /** Mutex protect callbacks registered with ap_mpm_register_timed_callback
- * from being run before the original handler finishes running
- */
- apr_thread_mutex_t *invoke_mtx;
- /** A struct containing the components of URI */
- apr_uri_t parsed_uri;
- /** finfo.protection (st_mode) set to zero if no such file */
- apr_finfo_t finfo;
- /** remote address information from conn_rec, can be overridden if
- * necessary by a module.
- * This is the address that originated the request.
- */
- apr_sockaddr_t *useragent_addr;
- char *useragent_ip;
- /** MIME trailer environment from the request */
- apr_table_t *trailers_in;
- /** MIME trailer environment from the response */
- apr_table_t *trailers_out;
- /** Originator's DNS name, if known. NULL if DNS hasn't been checked,
- * "" if it has and no address was found. N.B. Only access this though
- * ap_get_useragent_host() */
- char *useragent_host;
- /** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
- * 1 yes/success
- */
- int double_reverse;
- };
- /**
- * @defgroup ProxyReq Proxy request types
- *
- * Possible values of request_rec->proxyreq. A request could be normal,
- * proxied or reverse proxied. Normally proxied and reverse proxied are
- * grouped together as just "proxied", but sometimes it's necessary to
- * tell the difference between the two, such as for authentication.
- * @{
- */
- #define PROXYREQ_NONE 0 /**< No proxy */
- #define PROXYREQ_PROXY 1 /**< Standard proxy */
- #define PROXYREQ_REVERSE 2 /**< Reverse proxy */
- #define PROXYREQ_RESPONSE 3 /**< Origin response */
- /* @} */
- /**
- * @brief Enumeration of connection keepalive options
- */
- typedef enum {
- AP_CONN_UNKNOWN,
- AP_CONN_CLOSE,
- AP_CONN_KEEPALIVE
- } ap_conn_keepalive_e;
- /**
- * @brief Structure to store things which are per connection
- */
- struct conn_rec {
- /** Pool associated with this connection */
- apr_pool_t *pool;
- /** Physical vhost this conn came in on */
- server_rec *base_server;
- /** used by http_vhost.c */
- void *vhost_lookup_data;
- /* Information about the connection itself */
- /** local address */
- apr_sockaddr_t *local_addr;
- /** remote address; this is the end-point of the next hop, for the address
- * of the request creator, see useragent_addr in request_rec
- */
- apr_sockaddr_t *client_addr;
- /** Client's IP address; this is the end-point of the next hop, for the
- * IP of the request creator, see useragent_ip in request_rec
- */
- char *client_ip;
- /** Client's DNS name, if known. NULL if DNS hasn't been checked,
- * "" if it has and no address was found. N.B. Only access this though
- * get_remote_host() */
- char *remote_host;
- /** Only ever set if doing rfc1413 lookups. N.B. Only access this through
- * get_remote_logname() */
- char *remote_logname;
- /** server IP address */
- char *local_ip;
- /** used for ap_get_server_name when UseCanonicalName is set to DNS
- * (ignores setting of HostnameLookups) */
- char *local_host;
- /** ID of this connection; unique at any point in time */
- long id;
- /** Config vector containing pointers to connections per-server
- * config structures. */
- struct ap_conf_vector_t *conn_config;
- /** Notes on *this* connection: send note from one module to
- * another. must remain valid for all requests on this conn */
- apr_table_t *notes;
- /** A list of input filters to be used for this connection */
- struct ap_filter_t *input_filters;
- /** A list of output filters to be used for this connection */
- struct ap_filter_t *output_filters;
- /** handle to scoreboard information for this connection */
- void *sbh;
- /** The bucket allocator to use for all bucket/brigade creations */
- struct apr_bucket_alloc_t *bucket_alloc;
- /** The current state of this connection; may be NULL if not used by MPM */
- conn_state_t *cs;
- /** Is there data pending in the input filters? */
- int data_in_input_filters;
- /** Is there data pending in the output filters? */
- int data_in_output_filters;
- /** Are there any filters that clogg/buffer the input stream, breaking
- * the event mpm.
- */
- unsigned int clogging_input_filters:1;
- /** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
- * 1 yes/success */
- signed int double_reverse:2;
- /** Are we still talking? */
- unsigned aborted;
- /** Are we going to keep the connection alive for another request?
- * @see ap_conn_keepalive_e */
- ap_conn_keepalive_e keepalive;
- /** How many times have we used it? */
- int keepalives;
- /** Optional connection log level configuration. May point to a server or
- * per_dir config, i.e. must be copied before modifying */
- const struct ap_logconf *log;
- /** Id to identify this connection in error log. Set when the first
- * error log entry for this connection is generated.
- */
- const char *log_id;
- /** This points to the current thread being used to process this request,
- * over the lifetime of a request, the value may change. Users of the connection
- * record should not rely upon it staying the same between calls that involve
- * the MPM.
- */
- #if APR_HAS_THREADS
- apr_thread_t *current_thread;
- #endif
- /** The "real" master connection. NULL if I am the master. */
- conn_rec *master;
- };
- /**
- * Enumeration of connection states
- * The two states CONN_STATE_LINGER_NORMAL and CONN_STATE_LINGER_SHORT may
- * only be set by the MPM. Use CONN_STATE_LINGER outside of the MPM.
- */
- typedef enum {
- CONN_STATE_CHECK_REQUEST_LINE_READABLE,
- CONN_STATE_READ_REQUEST_LINE,
- CONN_STATE_HANDLER,
- CONN_STATE_WRITE_COMPLETION,
- CONN_STATE_SUSPENDED,
- CONN_STATE_LINGER, /* connection may be closed with lingering */
- CONN_STATE_LINGER_NORMAL, /* MPM has started lingering close with normal timeout */
- CONN_STATE_LINGER_SHORT, /* MPM has started lingering close with short timeout */
- CONN_STATE_NUM /* Number of states (keep/kept last) */
- } conn_state_e;
- typedef enum {
- CONN_SENSE_DEFAULT,
- CONN_SENSE_WANT_READ, /* next event must be read */
- CONN_SENSE_WANT_WRITE /* next event must be write */
- } conn_sense_e;
- /**
- * @brief A structure to contain connection state information
- */
- struct conn_state_t {
- /** Current state of the connection */
- conn_state_e state;
- /** Whether to read instead of write, or write instead of read */
- conn_sense_e sense;
- };
- /* Per-vhost config... */
- /**
- * The address 255.255.255.255, when used as a virtualhost address,
- * will become the "default" server when the ip doesn't match other vhosts.
- */
- #define DEFAULT_VHOST_ADDR 0xfffffffful
- /**
- * @struct server_addr_rec
- * @brief A structure to be used for Per-vhost config
- */
- typedef struct server_addr_rec server_addr_rec;
- struct server_addr_rec {
- /** The next server in the list */
- server_addr_rec *next;
- /** The name given in "<VirtualHost>" */
- char *virthost;
- /** The bound address, for this server */
- apr_sockaddr_t *host_addr;
- /** The bound port, for this server */
- apr_port_t host_port;
- };
- struct ap_logconf {
- /** The per-module log levels */
- signed char *module_levels;
- /** The log level for this server */
- int level;
- };
- /**
- * @brief A structure to store information for each virtual server
- */
- struct server_rec {
- /** The process this server is running in */
- process_rec *process;
- /** The next server in the list */
- server_rec *next;
- /* Log files --- note that transfer log is now in the modules... */
- /** The name of the error log */
- char *error_fname;
- /** A file descriptor that references the error log */
- apr_file_t *error_log;
- /** The log level configuration */
- struct ap_logconf log;
- /* Module-specific configuration for server, and defaults... */
- /** Config vector containing pointers to modules' per-server config
- * structures. */
- struct ap_conf_vector_t *module_config;
- /** MIME type info, etc., before we start checking per-directory info */
- struct ap_conf_vector_t *lookup_defaults;
- /** The name of the server */
- const char *defn_name;
- /** The line of the config file that the server was defined on */
- unsigned defn_line_number;
- /** true if this is the virtual server */
- char is_virtual;
- /* Information for redirects */
- /** for redirects, etc. */
- apr_port_t port;
- /** The server request scheme for redirect responses */
- const char *server_scheme;
- /* Contact information */
- /** The admin's contact information */
- char *server_admin;
- /** The server hostname */
- char *server_hostname;
- /* Transaction handling */
- /** I haven't got a clue */
- server_addr_rec *addrs;
- /** Timeout, as an apr interval, before we give up */
- apr_interval_time_t timeout;
- /** The apr interval we will wait for another request */
- apr_interval_time_t keep_alive_timeout;
- /** Maximum requests per connection */
- int keep_alive_max;
- /** Use persistent connections? */
- int keep_alive;
- /** Normal names for ServerAlias servers */
- apr_array_header_t *names;
- /** Wildcarded names for ServerAlias servers */
- apr_array_header_t *wild_names;
- /** Pathname for ServerPath */
- const char *path;
- /** Length of path */
- int pathlen;
- /** limit on size of the HTTP request line */
- int limit_req_line;
- /** limit on size of any request header field */
- int limit_req_fieldsize;
- /** limit on number of request header fields */
- int limit_req_fields;
- /** Opaque storage location */
- void *context;
- /** Whether the keepalive timeout is explicit (1) or
- * inherited (0) from the base server (either first
- * server on the same IP:port or main server) */
- unsigned int keep_alive_timeout_set:1;
- };
- /**
- * @struct ap_sload_t
- * @brief A structure to hold server load params
- */
- typedef struct ap_sload_t ap_sload_t;
- struct ap_sload_t {
- /* percentage of process/threads ready/idle (0->100)*/
- int idle;
- /* percentage of process/threads busy (0->100) */
- int busy;
- /* total bytes served */
- apr_off_t bytes_served;
- /* total access count */
- unsigned long access_count;
- };
- /**
- * @struct ap_loadavg_t
- * @brief A structure to hold various server loadavg
- */
- typedef struct ap_loadavg_t ap_loadavg_t;
- struct ap_loadavg_t {
- /* current loadavg, ala getloadavg() */
- float loadavg;
- /* 5 min loadavg */
- float loadavg5;
- /* 15 min loadavg */
- float loadavg15;
- };
- /**
- * Get the context_document_root for a request. This is a generalization of
- * the document root, which is too limited in the presence of mappers like
- * mod_userdir and mod_alias. The context_document_root is the directory
- * on disk that maps to the context_prefix URI prefix.
- * @param r The request
- * @note For resources that do not map to the file system or for very complex
- * mappings, this information may still be wrong.
- */
- AP_DECLARE(const char *) ap_context_document_root(request_rec *r);
- /**
- * Get the context_prefix for a request. The context_prefix URI prefix
- * maps to the context_document_root on disk.
- * @param r The request
- */
- AP_DECLARE(const char *) ap_context_prefix(request_rec *r);
- /** Set context_prefix and context_document_root for a request.
- * @param r The request
- * @param prefix the URI prefix, without trailing slash
- * @param document_root the corresponding directory on disk, without trailing
- * slash
- * @note If one of prefix of document_root is NULL, the corrsponding
- * property will not be changed.
- */
- AP_DECLARE(void) ap_set_context_info(request_rec *r, const char *prefix,
- const char *document_root);
- /** Set per-request document root. This is for mass virtual hosting modules
- * that want to provide the correct DOCUMENT_ROOT value to scripts.
- * @param r The request
- * @param document_root the document root for the request.
- */
- AP_DECLARE(void) ap_set_document_root(request_rec *r, const char *document_root);
- /**
- * Examine a field value (such as a media-/content-type) string and return
- * it sans any parameters; e.g., strip off any ';charset=foo' and the like.
- * @param p Pool to allocate memory from
- * @param intype The field to examine
- * @return A copy of the field minus any parameters
- */
- AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype);
- /**
- * Convert a time from an integer into a string in a specified format
- * @param p The pool to allocate memory from
- * @param t The time to convert
- * @param fmt The format to use for the conversion
- * @param gmt Convert the time for GMT?
- * @return The string that represents the specified time
- */
- AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt);
- /* String handling. The *_nc variants allow you to use non-const char **s as
- arguments (unfortunately C won't automatically convert a char ** to a const
- char **) */
- /**
- * Get the characters until the first occurrence of a specified character
- * @param p The pool to allocate memory from
- * @param line The string to get the characters from
- * @param stop The character to stop at
- * @return A copy of the characters up to the first stop character
- */
- AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop);
- /**
- * Get the characters until the first occurrence of a specified character
- * @param p The pool to allocate memory from
- * @param line The string to get the characters from
- * @param stop The character to stop at
- * @return A copy of the characters up to the first stop character
- * @note This is the same as ap_getword(), except it doesn't use const char **.
- */
- AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop);
- /**
- * Get the first word from a given string. A word is defined as all characters
- * up to the first whitespace.
- * @param p The pool to allocate memory from
- * @param line The string to traverse
- * @return The first word in the line
- */
- AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line);
- /**
- * Get the first word from a given string. A word is defined as all characters
- * up to the first whitespace.
- * @param p The pool to allocate memory from
- * @param line The string to traverse
- * @return The first word in the line
- * @note The same as ap_getword_white(), except it doesn't use const char**
- */
- AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line);
- /**
- * Get all characters from the first occurrence of @a stop to the first "\0"
- * @param p The pool to allocate memory from
- * @param line The line to traverse
- * @param stop The character to start at
- * @return A copy of all characters after the first occurrence of the specified
- * character
- */
- AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line,
- char stop);
- /**
- * Get all characters from the first occurrence of @a stop to the first "\0"
- * @param p The pool to allocate memory from
- * @param line The line to traverse
- * @param stop The character to start at
- * @return A copy of all characters after the first occurrence of the specified
- * character
- * @note The same as ap_getword_nulls(), except it doesn't use const char **.
- */
- AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop);
- /**
- * Get the second word in the string paying attention to quoting
- * @param p The pool to allocate from
- * @param line The line to traverse
- * @return A copy of the string
- */
- AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line);
- /**
- * Get the second word in the string paying attention to quoting
- * @param p The pool to allocate from
- * @param line The line to traverse
- * @return A copy of the string
- * @note The same as ap_getword_conf(), except it doesn't use const char **.
- */
- AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line);
- /**
- * Get the second word in the string paying attention to quoting,
- * with {...} supported as well as "..." and '...'
- * @param p The pool to allocate from
- * @param line The line to traverse
- * @return A copy of the string
- */
- AP_DECLARE(char *) ap_getword_conf2(apr_pool_t *p, const char **line);
- /**
- * Get the second word in the string paying attention to quoting,
- * with {...} supported as well as "..." and '...'
- * @param p The pool to allocate from
- * @param line The line to traverse
- * @return A copy of the string
- * @note The same as ap_getword_conf2(), except it doesn't use const char **.
- */
- AP_DECLARE(char *) ap_getword_conf2_nc(apr_pool_t *p, char **line);
- /**
- * Check a string for any config define or environment variable construct
- * and replace each of them by the value of that variable, if it exists.
- * The default syntax of the constructs is ${ENV} but can be changed by
- * setting the define::* config defines. If the variable does not exist,
- * leave the ${ENV} construct alone but print a warning.
- * @param p The pool to allocate from
- * @param word The string to check
- * @return The string with the replaced environment variables
- */
- AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word);
- /**
- * Size an HTTP header field list item, as separated by a comma.
- * @param field The field to size
- * @param len The length of the field
- * @return The return value is a pointer to the beginning of the non-empty
- * list item within the original string (or NULL if there is none) and the
- * address of field is shifted to the next non-comma, non-whitespace
- * character. len is the length of the item excluding any beginning whitespace.
- */
- AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len);
- /**
- * Retrieve an HTTP header field list item, as separated by a comma,
- * while stripping insignificant whitespace and lowercasing anything not in
- * a quoted string or comment.
- * @param p The pool to allocate from
- * @param field The field to retrieve
- * @return The return value is a new string containing the converted list
- * item (or NULL if none) and the address pointed to by field is
- * shifted to the next non-comma, non-whitespace.
- */
- AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field);
- /**
- * Find an item in canonical form (lowercase, no extra spaces) within
- * an HTTP field value list.
- * @param p The pool to allocate from
- * @param line The field value list to search
- * @param tok The token to search for
- * @return 1 if found, 0 if not found.
- */
- AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok);
- /**
- * Do a weak ETag comparison within an HTTP field value list.
- * @param p The pool to allocate from
- * @param line The field value list to search
- * @param tok The token to search for
- * @return 1 if found, 0 if not found.
- */
- AP_DECLARE(int) ap_find_etag_weak(apr_pool_t *p, const char *line, const char *tok);
- /**
- * Do a strong ETag comparison within an HTTP field value list.
- * @param p The pool to allocate from
- * @param line The field value list to search
- * @param tok The token to search for
- * @return 1 if found, 0 if not found.
- */
- AP_DECLARE(int) ap_find_etag_strong(apr_pool_t *p, const char *line, const char *tok);
- /* Scan a string for field content chars, as defined by RFC7230 section 3.2
- * including VCHAR/obs-text, as well as HT and SP
- * @param ptr The string to scan
- * @return A pointer to the first (non-HT) ASCII ctrl character.
- * @note lws and trailing whitespace are scanned, the caller is responsible
- * for trimming leading and trailing whitespace
- */
- AP_DECLARE(const char *) ap_scan_http_field_content(const char *ptr);
- /* Scan a string for token characters, as defined by RFC7230 section 3.2.6
- * @param ptr The string to scan
- * @return A pointer to the first non-token character.
- */
- AP_DECLARE(const char *) ap_scan_http_token(const char *ptr);
- /* Scan a string for visible ASCII (0x21-0x7E) or obstext (0x80+)
- * and return a pointer to the first SP/CTL/NUL character encountered.
- * @param ptr The string to scan
- * @return A pointer to the first SP/CTL character.
- */
- AP_DECLARE(const char *) ap_scan_vchar_obstext(const char *ptr);
- /**
- * Retrieve an array of tokens in the format "1#token" defined in RFC2616. Only
- * accepts ',' as a delimiter, does not accept quoted strings, and errors on
- * any separator.
- * @param p The pool to allocate from
- * @param tok The line to read tokens from
- * @param tokens Pointer to an array of tokens. If not NULL, must be an array
- * of char*, otherwise it will be allocated on @a p when a token is found
- * @param skip_invalid If true, when an invalid separator is encountered, it
- * will be ignored.
- * @return NULL on success, an error string otherwise.
- * @remark *tokens may be NULL on output if NULL in input and no token is found
- */
- AP_DECLARE(const char *) ap_parse_token_list_strict(apr_pool_t *p, const char *tok,
- apr_array_header_t **tokens,
- int skip_invalid);
- /**
- * Retrieve a token, spacing over it and adjusting the pointer to
- * the first non-white byte afterwards. Note that these tokens
- * are delimited by semis and commas and can also be delimited
- * by whitespace at the caller's option.
- * @param p The pool to allocate from
- * @param accept_line The line to retrieve the token from (adjusted afterwards)
- * @param accept_white Is it delimited by whitespace
- * @return the token
- */
- AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white);
- /**
- * Find http tokens, see the definition of token from RFC2068
- * @param p The pool to allocate from
- * @param line The line to find the token
- * @param tok The token to find
- * @return 1 if the token is found, 0 otherwise
- */
- AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok);
- /**
- * find http tokens from the end of the line
- * @param p The pool to allocate from
- * @param line The line to find the token
- * @param tok The token to find
- * @return 1 if the token is found, 0 otherwise
- */
- AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok);
- /**
- * Check for an Absolute URI syntax
- * @param u The string to check
- * @return 1 if URI, 0 otherwise
- */
- AP_DECLARE(int) ap_is_url(const char *u);
- /**
- * Unescape a string
- * @param url The string to unescape
- * @return 0 on success, non-zero otherwise
- */
- AP_DECLARE(int) ap_unescape_all(char *url);
- /**
- * Unescape a URL
- * @param url The url to unescape
- * @return 0 on success, non-zero otherwise
- */
- AP_DECLARE(int) ap_unescape_url(char *url);
- /**
- * Unescape a URL, but leaving %2f (slashes) escaped
- * @param url The url to unescape
- * @param decode_slashes Whether or not slashes should be decoded
- * @return 0 on success, non-zero otherwise
- */
- AP_DECLARE(int) ap_unescape_url_keep2f(char *url, int decode_slashes);
- /**
- * Unescape an application/x-www-form-urlencoded string
- * @param query The query to unescape
- * @return 0 on success, non-zero otherwise
- */
- AP_DECLARE(int) ap_unescape_urlencoded(char *query);
- /**
- * Convert all double slashes to single slashes, except where significant
- * to the filesystem on the current platform.
- * @param name The string to convert, assumed to be a filesystem path
- */
- AP_DECLARE(void) ap_no2slash(char *name);
- /**
- * Convert all double slashes to single slashes, except where significant
- * to the filesystem on the current platform.
- * @param name The string to convert
- * @param is_fs_path if set to 0, the significance of any double-slashes is
- * ignored.
- */
- AP_DECLARE(void) ap_no2slash_ex(char *name, int is_fs_path);
- /**
- * Remove all ./ and xx/../ substrings from a file name. Also remove
- * any leading ../ or /../ substrings.
- * @param name the file name to parse
- */
- AP_DECLARE(void) ap_getparents(char *name);
- /**
- * Escape a path segment, as defined in RFC 1808
- * @param p The pool to allocate from
- * @param s The path to convert
- * @return The converted URL
- */
- AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s);
- /**
- * Escape a path segment, as defined in RFC 1808, to a preallocated buffer.
- * @param c The preallocated buffer to write to
- * @param s The path to convert
- * @return The converted URL (c)
- */
- AP_DECLARE(char *) ap_escape_path_segment_buffer(char *c, const char *s);
- /**
- * convert an OS path to a URL in an OS dependent way.
- * @param p The pool to allocate from
- * @param path The path to convert
- * @param partial if set, assume that the path will be appended to something
- * with a '/' in it (and thus does not prefix "./")
- * @return The converted URL
- */
- AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial);
- /** @see ap_os_escape_path */
- #define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1)
- /**
- * Escape a string as application/x-www-form-urlencoded
- * @param p The pool to allocate from
- * @param s The path to convert
- * @return The converted URL
- */
- AP_DECLARE(char *) ap_escape_urlencoded(apr_pool_t *p, const char *s);
- /**
- * Escape a string as application/x-www-form-urlencoded, to a preallocated buffer
- * @param c The preallocated buffer to write to
- * @param s The path to convert
- * @return The converted URL (c)
- */
- AP_DECLARE(char *) ap_escape_urlencoded_buffer(char *c, const char *s);
- /**
- * Escape an html string
- * @param p The pool to allocate from
- * @param s The html to escape
- * @return The escaped string
- */
- #define ap_escape_html(p,s) ap_escape_html2(p,s,0)
- /**
- * Escape an html string
- * @param p The pool to allocate from
- * @param s The html to escape
- * @param toasc Whether to escape all non-ASCII chars to \&\#nnn;
- * @return The escaped string
- */
- AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc);
- /**
- * Escape a string for logging
- * @param p The pool to allocate from
- * @param str The string to escape
- * @return The escaped string
- */
- AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str);
- /**
- * Escape a string for logging into the error log (without a pool)
- * @param dest The buffer to write to
- * @param source The string to escape
- * @param buflen The buffer size for the escaped string (including "\0")
- * @return The len of the escaped string (always < maxlen)
- */
- AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source,
- apr_size_t buflen);
- /**
- * Construct a full hostname
- * @param p The pool to allocate from
- * @param hostname The hostname of the server
- * @param port The port the server is running on
- * @param r The current request
- * @return The server's hostname
- */
- AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname,
- apr_port_t port, const request_rec *r);
- /**
- * Escape a shell command
- * @param p The pool to allocate from
- * @param s The command to escape
- * @return The escaped shell command
- */
- AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s);
- /**
- * Count the number of directories in a path
- * @param path The path to count
- * @return The number of directories
- */
- AP_DECLARE(int) ap_count_dirs(const char *path);
- /**
- * Copy at most @a n leading directories of @a s into @a d. @a d
- * should be at least as large as @a s plus 1 extra byte
- *
- * @param d The location to copy to
- * @param s The location to copy from
- * @param n The number of directories to copy
- * @return value is the ever useful pointer to the trailing "\0" of d
- * @note on platforms with drive letters, n = 0 returns the "/" root,
- * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0
- * returns the empty string. */
- AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n);
- /**
- * Return the parent directory name (including trailing /) of the file
- * @a s
- * @param p The pool to allocate from
- * @param s The file to get the parent of
- * @return A copy of the file's parent directory
- */
- AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s);
- /**
- * Given a directory and filename, create a single path from them. This
- * function is smart enough to ensure that there is a single '/' between the
- * directory and file names
- * @param a The pool to allocate from
- * @param dir The directory name
- * @param f The filename
- * @return A copy of the full path
- * @note Never consider using this function if you are dealing with filesystem
- * names that need to remain canonical, unless you are merging an apr_dir_read
- * path and returned filename. Otherwise, the result is not canonical.
- */
- AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f);
- /**
- * Test if the given path has an absolute path.
- * @param p The pool to allocate from
- * @param dir The directory name
- * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have
- * multiple forms of absolute paths. This only reports if the path is absolute
- * in a canonical sense.
- */
- AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir);
- /**
- * Does the provided string contain wildcard characters? This is useful
- * for determining if the string should be passed to strcmp_match or to strcmp.
- * The only wildcard characters recognized are '?' and '*'
- * @param str The string to check
- * @return 1 if the string has wildcards, 0 otherwise
- */
- AP_DECLARE(int) ap_is_matchexp(const char *str);
- /**
- * Determine if a string matches a pattern containing the wildcards '?' or '*'
- * @param str The string to check
- * @param expected The pattern to match against
- * @return 0 if the two strings match, 1 otherwise
- */
- AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected);
- /**
- * Determine if a string matches a pattern containing the wildcards '?' or '*',
- * ignoring case
- * @param str The string to check
- * @param expected The pattern to match against
- * @return 0 if the two strings match, 1 otherwise
- */
- AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected);
- /**
- * Find the first occurrence of the substring s2 in s1, regardless of case
- * @param s1 The string to search
- * @param s2 The substring to search for
- * @return A pointer to the beginning of the substring
- * @remark See apr_strmatch() for a faster alternative
- */
- AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2);
- /**
- * Return a pointer to the location inside of bigstring immediately after prefix
- * @param bigstring The input string
- * @param prefix The prefix to strip away
- * @return A pointer relative to bigstring after prefix
- */
- AP_DECLARE(const char *) ap_stripprefix(const char *bigstring,
- const char *prefix);
- /**
- * Decode a base64 encoded string into memory allocated from a pool
- * @param p The pool to allocate from
- * @param bufcoded The encoded string
- * @return The decoded string
- */
- AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded);
- /**
- * Encode a string into memory allocated from a pool in base 64 format
- * @param p The pool to allocate from
- * @param string The plaintext string
- * @return The encoded string
- */
- AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string);
- /**
- * Compile a regular expression to be used later. The regex is freed when
- * the pool is destroyed.
- * @param p The pool to allocate from
- * @param pattern the regular expression to compile
- * @param cflags The bitwise or of one or more of the following:
- * @li REG_EXTENDED - Use POSIX extended Regular Expressions
- * @li REG_ICASE - Ignore case
- * @li REG_NOSUB - Support for substring addressing of matches
- * not required
- * @li REG_NEWLINE - Match-any-character operators don't match new-line
- * @return The compiled regular expression
- */
- AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
- int cflags);
- /**
- * Free the memory associated with a compiled regular expression
- * @param p The pool the regex was allocated from
- * @param reg The regular expression to free
- * @note This function is only necessary if the regex should be cleaned
- * up before the pool
- */
- AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg);
- /**
- * After performing a successful regex match, you may use this function to
- * perform a series of string substitutions based on subexpressions that were
- * matched during the call to ap_regexec. This function is limited to
- * result strings of 64K. Consider using ap_pregsub_ex() instead.
- * @param p The pool to allocate from
- * @param input An arbitrary string containing $1 through $9. These are
- * replaced with the corresponding matched sub-expressions
- * @param source The string that was originally matched to the regex
- * @param nmatch the nmatch returned from ap_pregex
- * @param pmatch the pmatch array returned from ap_pregex
- * @return The substituted string, or NULL on error
- */
- AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input,
- const char *source, apr_size_t nmatch,
- ap_regmatch_t pmatch[]);
- /**
- * After performing a successful regex match, you may use this function to
- * perform a series of string substitutions based on subexpressions that were
- * matched during the call to ap_regexec
- * @param p The pool to allocate from
- * @param result where to store the result, will be set to NULL on error
- * @param input An arbitrary string containing $1 through $9. These are
- * replaced with the corresponding matched sub-expressions
- * @param source The string that was originally matched to the regex
- * @param nmatch the nmatch returned from ap_pregex
- * @param pmatch the pmatch array returned from ap_pregex
- * @param maxlen the maximum string length to return, 0 for unlimited
- * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise.
- */
- AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result,
- const char *input, const char *source,
- apr_size_t nmatch,
- ap_regmatch_t pmatch[],
- apr_size_t maxlen);
- /**
- * We want to downcase the type/subtype for comparison purposes
- * but nothing else because ;parameter=foo values are case sensitive.
- * @param s The content-type to convert to lowercase
- */
- AP_DECLARE(void) ap_content_type_tolower(char *s);
- /**
- * convert a string to all lowercase
- * @param s The string to convert to lowercase
- */
- AP_DECLARE(void) ap_str_tolower(char *s);
- /**
- * convert a string to all uppercase
- * @param s The string to convert to uppercase
- */
- AP_DECLARE(void) ap_str_toupper(char *s);
- /**
- * Search a string from left to right for the first occurrence of a
- * specific character
- * @param str The string to search
- * @param c The character to search for
- * @return The index of the first occurrence of c in str
- */
- AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */
- /**
- * Search a string from right to left for the first occurrence of a
- * specific character
- * @param str The string to search
- * @param c The character to search for
- * @return The index of the first occurrence of c in str
- */
- AP_DECLARE(int) ap_rind(const char *str, char c);
- /**
- * Given a string, replace any bare " with \\" .
- * @param p The pool to allocate memory from
- * @param instring The string to search for "
- * @return A copy of the string with escaped quotes
- */
- AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring);
- /**
- * Given a string, append the PID deliminated by delim.
- * Usually used to create a pid-appended filepath name
- * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not
- * a macro, to avoid unistd.h dependency
- * @param p The pool to allocate memory from
- * @param string The string to append the PID to
- * @param delim The string to use to deliminate the string from the PID
- * @return A copy of the string with the PID appended
- */
- AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string,
- const char *delim);
- /**
- * Parse a given timeout parameter string into an apr_interval_time_t value.
- * The unit of the time interval is given as postfix string to the numeric
- * string. Currently the following units are understood:
- *
- * ms : milliseconds
- * s : seconds
- * mi[n] : minutes
- * h : hours
- *
- * If no unit is contained in the given timeout parameter the default_time_unit
- * will be used instead.
- * @param timeout_parameter The string containing the timeout parameter.
- * @param timeout The timeout value to be returned.
- * @param default_time_unit The default time unit to use if none is specified
- * in timeout_parameter.
- * @return Status value indicating whether the parsing was successful or not.
- */
- AP_DECLARE(apr_status_t) ap_timeout_parameter_parse(
- const char *timeout_parameter,
- apr_interval_time_t *timeout,
- const char *default_time_unit);
- /**
- * Determine if a request has a request body or not.
- *
- * @param r the request_rec of the request
- * @return truth value
- */
- AP_DECLARE(int) ap_request_has_body(request_rec *r);
- /**
- * Cleanup a string (mainly to be filesystem safe)
- * We only allow '_' and alphanumeric chars. Non-printable
- * map to 'x' and all others map to '_'
- *
- * @param p pool to use to allocate dest
- * @param src string to clean up
- * @param dest cleaned up, allocated string
- * @return Status value indicating whether the cleaning was successful or not.
- */
- AP_DECLARE(apr_status_t) ap_pstr2_alnum(apr_pool_t *p, const char *src,
- const char **dest);
- /**
- * Cleanup a string (mainly to be filesystem safe)
- * We only allow '_' and alphanumeric chars. Non-printable
- * map to 'x' and all others map to '_'
- *
- * @param src string to clean up
- * @param dest cleaned up, pre-allocated string
- * @return Status value indicating whether the cleaning was successful or not.
- */
- AP_DECLARE(apr_status_t) ap_str2_alnum(const char *src, char *dest);
- /**
- * Structure to store the contents of an HTTP form of the type
- * application/x-www-form-urlencoded.
- *
- * Currently it contains the name as a char* of maximum length
- * HUGE_STRING_LEN, and a value in the form of a bucket brigade
- * of arbitrary length.
- */
- typedef struct {
- const char *name;
- apr_bucket_brigade *value;
- } ap_form_pair_t;
- /**
- * Read the body and parse any form found, which must be of the
- * type application/x-www-form-urlencoded.
- * @param r request containing POSTed form data
- * @param f filter
- * @param ptr returned array of ap_form_pair_t
- * @param num max num of params or -1 for unlimited
- * @param size max size allowed for parsed data
- * @return OK or HTTP error
- */
- AP_DECLARE(int) ap_parse_form_data(request_rec *r, struct ap_filter_t *f,
- apr_array_header_t **ptr,
- apr_size_t num, apr_size_t size);
- /* Misc system hackery */
- /**
- * Given the name of an object in the file system determine if it is a directory
- * @param p The pool to allocate from
- * @param name The name of the object to check
- * @return 1 if it is a directory, 0 otherwise
- */
- AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name);
- /**
- * Given the name of an object in the file system determine if it is a directory - this version is symlink aware
- * @param p The pool to allocate from
- * @param name The name of the object to check
- * @return 1 if it is a directory, 0 otherwise
- */
- AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name);
- #ifdef _OSD_POSIX
- extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process);
- #endif /* _OSD_POSIX */
- /**
- * Determine the local host name for the current machine
- * @param p The pool to allocate from
- * @return A copy of the local host name
- */
- char *ap_get_local_host(apr_pool_t *p);
- /**
- * Log an assertion to the error log
- * @param szExp The assertion that failed
- * @param szFile The file the assertion is in
- * @param nLine The line the assertion is defined on
- */
- AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine)
- __attribute__((noreturn));
- /**
- * @internal Internal Assert function
- */
- #define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__))
- /**
- * Redefine assert() to something more useful for an Apache...
- *
- * Use ap_assert() if the condition should always be checked.
- * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG
- * is defined.
- */
- #ifdef AP_DEBUG
- #define AP_DEBUG_ASSERT(exp) ap_assert(exp)
- #else
- #define AP_DEBUG_ASSERT(exp) ((void)0)
- #endif
- /**
- * @defgroup stopsignal Flags which indicate places where the server should stop for debugging.
- * @{
- * A set of flags which indicate places where the server should raise(SIGSTOP).
- * This is useful for debugging, because you can then attach to that process
- * with gdb and continue. This is important in cases where one_process
- * debugging isn't possible.
- */
- /** stop on a Detach */
- #define SIGSTOP_DETACH 1
- /** stop making a child process */
- #define SIGSTOP_MAKE_CHILD 2
- /** stop spawning a child process */
- #define SIGSTOP_SPAWN_CHILD 4
- /** stop spawning a child process with a piped log */
- #define SIGSTOP_PIPED_LOG_SPAWN 8
- /** stop spawning a CGI child process */
- #define SIGSTOP_CGI_CHILD 16
- /** Macro to get GDB started */
- #ifdef DEBUG_SIGSTOP
- extern int raise_sigstop_flags;
- #define RAISE_SIGSTOP(x) do { \
- if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\
- } while (0)
- #else
- #define RAISE_SIGSTOP(x)
- #endif
- /** @} */
- /**
- * Get HTML describing the address and (optionally) admin of the server.
- * @param prefix Text which is prepended to the return value
- * @param r The request_rec
- * @return HTML describing the server, allocated in @a r's pool.
- */
- AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r);
- /* The C library has functions that allow const to be silently dropped ...
- these macros detect the drop in maintainer mode, but use the native
- methods for normal builds
- Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs
- to be included before the macros are defined or compilation will fail.
- */
- #include <string.h>
- AP_DECLARE(char *) ap_strchr(char *s, int c);
- AP_DECLARE(const char *) ap_strchr_c(const char *s, int c);
- AP_DECLARE(char *) ap_strrchr(char *s, int c);
- AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c);
- AP_DECLARE(char *) ap_strstr(char *s, const char *c);
- AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c);
- #ifdef AP_DEBUG
- #undef strchr
- # define strchr(s, c) ap_strchr(s,c)
- #undef strrchr
- # define strrchr(s, c) ap_strrchr(s,c)
- #undef strstr
- # define strstr(s, c) ap_strstr(s,c)
- #else
- /** use this instead of strchr */
- # define ap_strchr(s, c) strchr(s, c)
- /** use this instead of strchr */
- # define ap_strchr_c(s, c) strchr(s, c)
- /** use this instead of strrchr */
- # define ap_strrchr(s, c) strrchr(s, c)
- /** use this instead of strrchr */
- # define ap_strrchr_c(s, c) strrchr(s, c)
- /** use this instead of strrstr*/
- # define ap_strstr(s, c) strstr(s, c)
- /** use this instead of strrstr*/
- # define ap_strstr_c(s, c) strstr(s, c)
- #endif
- /**
- * Generate pseudo random bytes.
- * This is a convenience interface to apr_random. It is cheaper but less
- * secure than apr_generate_random_bytes().
- * @param buf where to store the bytes
- * @param size number of bytes to generate
- * @note ap_random_insecure_bytes() is thread-safe, it uses a mutex on
- * threaded MPMs.
- */
- AP_DECLARE(void) ap_random_insecure_bytes(void *buf, apr_size_t size);
- /**
- * Get a pseudo random number in a range.
- * @param min low end of range
- * @param max high end of range
- * @return a number in the range
- */
- AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max);
- /**
- * Abort with a error message signifying out of memory
- */
- AP_DECLARE(void) ap_abort_on_oom(void) __attribute__((noreturn));
- /**
- * Wrapper for malloc() that calls ap_abort_on_oom() if out of memory
- * @param size size of the memory block
- * @return pointer to the allocated memory
- * @note ap_malloc may be implemented as a macro
- */
- AP_DECLARE(void *) ap_malloc(size_t size)
- __attribute__((malloc))
- AP_FN_ATTR_ALLOC_SIZE(1);
- /**
- * Wrapper for calloc() that calls ap_abort_on_oom() if out of memory
- * @param nelem number of elements to allocate memory for
- * @param size size of a single element
- * @return pointer to the allocated memory
- * @note ap_calloc may be implemented as a macro
- */
- AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size)
- __attribute__((malloc))
- AP_FN_ATTR_ALLOC_SIZE2(1,2);
- /**
- * Wrapper for realloc() that calls ap_abort_on_oom() if out of memory
- * @param ptr pointer to the old memory block (or NULL)
- * @param size new size of the memory block
- * @return pointer to the reallocated memory
- * @note ap_realloc may be implemented as a macro
- */
- AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
- AP_FN_ATTR_WARN_UNUSED_RESULT
- AP_FN_ATTR_ALLOC_SIZE(2);
- /**
- * Get server load params
- * @param ld struct to populate: -1 in fields means error
- */
- AP_DECLARE(void) ap_get_sload(ap_sload_t *ld);
- /**
- * Get server load averages (ala getloadavg)
- * @param ld struct to populate: -1 in fields means error
- */
- AP_DECLARE(void) ap_get_loadavg(ap_loadavg_t *ld);
- /**
- * Convert binary data into a hex string
- * @param src pointer to the data
- * @param srclen length of the data
- * @param dest pointer to buffer of length (2 * srclen + 1). The resulting
- * string will be NUL-terminated.
- */
- AP_DECLARE(void) ap_bin2hex(const void *src, apr_size_t srclen, char *dest);
- /**
- * Short function to execute a command and return the first line of
- * output minus \r \n. Useful for "obscuring" passwords via exec calls
- * @param p the pool to allocate from
- * @param cmd the command to execute
- * @param argv the arguments to pass to the cmd
- * @return ptr to characters or NULL on any error
- */
- AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p,
- const char *cmd,
- const char * const *argv);
- #define AP_NORESTART APR_OS_START_USEERR + 1
- /**
- * Get the first index of the string in the array or -1 if not found. Start
- * searching a start.
- * @param array The array the check
- * @param s The string to find
- * @param start Start index for search. If start is out of bounds (negative or
- equal to array length or greater), -1 will be returned.
- * @return index of string in array or -1
- */
- AP_DECLARE(int) ap_array_str_index(const apr_array_header_t *array,
- const char *s,
- int start);
- /**
- * Check if the string is member of the given array by strcmp.
- * @param array The array the check
- * @param s The string to find
- * @return !=0 iff string is member of array (via strcmp)
- */
- AP_DECLARE(int) ap_array_str_contains(const apr_array_header_t *array,
- const char *s);
- /**
- * Perform a case-insensitive comparison of two strings @a str1 and @a str2,
- * treating upper and lower case values of the 26 standard C/POSIX alphabetic
- * characters as equivalent. Extended latin characters outside of this set
- * are treated as unique octets, irrespective of the current locale.
- *
- * Returns in integer greater than, equal to, or less than 0,
- * according to whether @a str1 is considered greater than, equal to,
- * or less than @a str2.
- *
- * @note Same code as apr_cstr_casecmp, which arrives in APR 1.6
- */
- AP_DECLARE(int) ap_cstr_casecmp(const char *s1, const char *s2);
- /**
- * Perform a case-insensitive comparison of two strings @a str1 and @a str2,
- * treating upper and lower case values of the 26 standard C/POSIX alphabetic
- * characters as equivalent. Extended latin characters outside of this set
- * are treated as unique octets, irrespective of the current locale.
- *
- * Returns in integer greater than, equal to, or less than 0,
- * according to whether @a str1 is considered greater than, equal to,
- * or less than @a str2.
- *
- * @note Same code as apr_cstr_casecmpn, which arrives in APR 1.6
- */
- AP_DECLARE(int) ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n);
- /**
- * Default flags for ap_dir_*fnmatch().
- */
- #define AP_DIR_FLAG_NONE 0
- /**
- * If set, wildcards that match no files or directories will be ignored, otherwise
- * an error is triggered.
- */
- #define AP_DIR_FLAG_OPTIONAL 1
- /**
- * If set, and the wildcard resolves to a directory, recursively find all files
- * below that directory, otherwise return the directory.
- */
- #define AP_DIR_FLAG_RECURSIVE 2
- /**
- * Structure to provide the state of a directory match.
- */
- typedef struct ap_dir_match_t ap_dir_match_t;
- /**
- * Concrete structure to provide the state of a directory match.
- */
- struct ap_dir_match_t {
- /** Pool to use for allocating the result */
- apr_pool_t *p;
- /** Temporary pool used for directory traversal */
- apr_pool_t *ptemp;
- /** Prefix for log messages */
- const char *prefix;
- /** Callback for each file found that matches the wildcard. Return NULL on success, an error string on error. */
- const char *(*cb)(ap_dir_match_t *w, const char *fname);
- /** Context for the callback */
- void *ctx;
- /** Flags to indicate whether optional or recursive */
- int flags;
- /** Recursion depth safety check */
- unsigned int depth;
- };
- /**
- * Search for files given a non wildcard filename with non native separators.
- *
- * If the provided filename points at a file, the callback within ap_dir_match_t is
- * triggered for that file, and this function returns the result of the callback.
- *
- * If the provided filename points at a directory, and recursive within ap_dir_match_t
- * is true, the callback will be triggered for every file found recursively beneath
- * that directory, otherwise the callback is triggered once for the directory itself.
- * This function returns the result of the callback.
- *
- * If the provided path points to neither a file nor a directory, and optional within
- * ap_dir_match_t is true, this function returns NULL. If optional within ap_dir_match_t
- * is false, this function will return an error string indicating that the path does not
- * exist.
- *
- * @param w Directory match structure containing callback and context.
- * @param fname The name of the file or directory, with non native separators.
- * @return NULL on success, or a string describing the error.
- */
- AP_DECLARE(const char *)ap_dir_nofnmatch(ap_dir_match_t *w, const char *fname)
- __attribute__((nonnull(1,2)));
- /**
- * Search for files given a wildcard filename with non native separators.
- *
- * If the filename contains a wildcard, all files and directories that match the wildcard
- * will be returned.
- *
- * ap_dir_nofnmatch() is called for each directory and file found, and the callback
- * within ap_dir_match_t triggered as described above.
- *
- * Wildcards may appear in both directory and file components in the path, and
- * wildcards may appear more than once.
- *
- * @param w Directory match structure containing callback and context.
- * @param path Path prefix for search, with non native separators and no wildcards.
- * @param fname The name of the file or directory, with non native separators and
- * optional wildcards.
- * @return NULL on success, or a string describing the error.
- */
- AP_DECLARE(const char *)ap_dir_fnmatch(ap_dir_match_t *w, const char *path,
- const char *fname) __attribute__((nonnull(1,3)));
- #ifdef __cplusplus
- }
- #endif
- #endif /* !APACHE_HTTPD_H */
- /** @} //APACHE Daemon */
- /** @} //APACHE Core */
- /** @} //APACHE super group */
|