http_core.c revision cccd31fa4a72fe23cc3249c06db181b274a55a69
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz/* ====================================================================
08cb74ca432a8c24e39f17dedce527e6a47b8001jerenkrantz * The Apache Software License, Version 1.1
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * Copyright (c) 2000 The Apache Software Foundation. All rights
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * reserved.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Redistribution and use in source and binary forms, with or without
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * modification, are permitted provided that the following conditions
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * are met:
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * 1. Redistributions of source code must retain the above copyright
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * notice, this list of conditions and the following disclaimer.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd * 2. Redistributions in binary form must reproduce the above copyright
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * notice, this list of conditions and the following disclaimer in
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * the documentation and/or other materials provided with the
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * distribution.
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh * 3. The end-user documentation included with the redistribution,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * if any, must include the following acknowledgment:
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh * "This product includes software developed by the
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Apache Software Foundation (http://www.apache.org/)."
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Alternately, this acknowledgment may appear in the software itself,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * if and wherever such third-party acknowledgments normally appear.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * 4. The names "Apache" and "Apache Software Foundation" must
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * not be used to endorse or promote products derived from this
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * software without prior written permission. For written
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * permission, please contact apache@apache.org.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * 5. Products derived from this software may not be called "Apache",
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * nor may "Apache" appear in their name, without prior written
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * permission of the Apache Software Foundation.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames * SUCH DAMAGE.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * ====================================================================
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * This software consists of voluntary contributions made by many
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * individuals on behalf of the Apache Software Foundation. For more
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * information on the Apache Software Foundation, please see
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Portions of this software are based upon public domain software
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * originally written at the National Center for Supercomputing Applications,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * University of Illinois, Urbana-Champaign.
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz#include "apr_thread_proc.h" /* for RLIMIT stuff */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#include "http_protocol.h" /* For index_of_response(). Grump. */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker#include "http_main.h" /* For the default_handler below... */
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe/* LimitXMLRequestBody handling */
3e392a5afd51526de3cb15d57ee46d8cb160ae65gregames/* Server core module... This module provides support for really basic
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * server operations, including options and commands which control the
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * operation of other modules. Consider this the bureaucracy module.
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * The core module also defines handlers, etc., do handle just enough
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar * to allow a server with the core module ONLY to actually serve documents
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar * (though it slaps DefaultType on all of 'em); this was useful in testing,
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar * but may not be worth preserving.
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar * This file could almost be mod_core.c, except for the stuff which affects
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar * the http_conf_globals.
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantzstatic void *create_core_dir_config(apr_pool_t *a, char *dir)
8419e6f8bff1a3617933f3ba760d2bdec7442f44coar conf = (core_dir_config *)apr_pcalloc(a, sizeof(core_dir_config));
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf->d_is_fnmatch = conf->d ? (apr_is_fnmatch(conf->d) != 0) : 0;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf->d_components = conf->d ? ap_count_dirs(conf->d) : 0;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe conf->script_interpreter_source = INTERPRETER_SOURCE_UNSET;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf->add_default_charset = ADD_DEFAULT_CHARSET_UNSET;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME;
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf->output_filters = apr_make_array(a, 2, sizeof(void *));
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe conf->input_filters = apr_make_array(a, 2, sizeof(void *));
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe return (void *)conf;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowestatic void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf = (core_dir_config *)apr_palloc(a, sizeof(core_dir_config));
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe memcpy((char *)conf, (const char *)base, sizeof(core_dir_config));
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe memcpy(conf->response_code_strings, base->response_code_strings,
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe sizeof(*conf->response_code_strings) * RESPONSE_CODES);
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe /* there was no explicit setting of new->opts, so we merge
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz * preserve the invariant (opts_add & opts_remove) == 0
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe conf->opts_remove = (conf->opts_remove & ~new->opts_add)
c2cf53a40a9814eb91db2cdf820f97d943f21628coar conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES)) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES;
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe /* otherwise we just copy, because an explicit opts setting
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe * overrides all earlier +/- modifiers
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe sizeof(*conf->response_code_strings) * RESPONSE_CODES);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe memcpy(conf->response_code_strings, new->response_code_strings,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker sizeof(*conf->response_code_strings) * RESPONSE_CODES);
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe for (i = 0; i < RESPONSE_CODES; ++i) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (new->use_canonical_name != USE_CANONICAL_NAME_UNSET) {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp conf->sec = apr_append_arrays(a, base->sec, new->sec);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (new->script_interpreter_source != INTERPRETER_SOURCE_UNSET) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf->script_interpreter_source = new->script_interpreter_source;
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe if (new->add_default_charset != ADD_DEFAULT_CHARSET_UNSET) {
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe conf->add_default_charset_name = new->add_default_charset_name;
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf->output_filters = apr_append_arrays(a, base->output_filters,
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe conf->input_filters = apr_append_arrays(a, base->input_filters,
cc9582e53aead2a044077c4a92f3dfc3605590b3wrowe return (void*)conf;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic void *create_core_server_config(apr_pool_t *a, server_rec *s)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb conf = (core_server_config *)apr_pcalloc(a, sizeof(core_server_config));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb conf->access_name = is_virtual ? NULL : DEFAULT_ACCESS_FNAME;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb conf->ap_document_root = is_virtual ? NULL : DOCUMENT_LOCATION;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe return (void *)conf;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowestatic void *merge_core_server_configs(apr_pool_t *p, void *basev, void *virtv)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe core_server_config *base = (core_server_config *)basev;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe core_server_config *virt = (core_server_config *)virtv;
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe conf = (core_server_config *)apr_pcalloc(p, sizeof(core_server_config));
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe conf->sec = apr_append_arrays(p, base->sec, virt->sec);
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz conf->sec_url = apr_append_arrays(p, base->sec_url, virt->sec_url);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe/* Add per-directory configuration entry (for <directory> section);
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz * these are part of the core server config.
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwroweAP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config)
e8f95a682820a599fe41b22977010636be5c2717jim core_server_config *sconf = ap_get_module_config(s->module_config,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe void **new_space = (void **)apr_push_array(sconf->sec);
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantzAP_CORE_DECLARE(void) ap_add_per_url_conf(server_rec *s, void *url_config)
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz core_server_config *sconf = ap_get_module_config(s->module_config,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker void **new_space = (void **)apr_push_array(sconf->sec_url);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwroweAP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config)
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe void **new_space = (void **)apr_push_array(conf->sec);
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe/* core_reorder_directories reorders the directory sections such that the
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * 1-component sections come first, then the 2-component, and so on, finally
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * followed by the "special" sections. A section is "special" if it's a regex,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * or if it doesn't start with / -- consider proxy: matching. All movements
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * are in-order to preserve the ordering of the sections from the config files.
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * See directory_walk().
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar || ((entry_core)->d[0] != '/' && (entry_core)->d[1] != ':'))
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe/* XXX: Fairly certain this is correct... '/' must prefix the path
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowe * or else in the case xyz:/ or abc/xyz:/, '/' must follow the ':'.
7c301a1818939f85da8f3629cc3e9b5588610ef0jerenkrantz * If there is no leading '/' or embedded ':/', then we are special.
700b96db75e7cfadb5219978c1735b710d583763wrowe ((entry_core)->r != NULL || (entry_core)->d[0] != '/')
700b96db75e7cfadb5219978c1735b710d583763wrowe/* We need to do a stable sort, qsort isn't stable. So to make it stable
700b96db75e7cfadb5219978c1735b710d583763wrowe * we'll be maintaining the original index into the list, and using it
700b96db75e7cfadb5219978c1735b710d583763wrowe * as the minor key during sorting. The major key is the number of
700b96db75e7cfadb5219978c1735b710d583763wrowe * components (where a "special" section has infinite components).
700b96db75e7cfadb5219978c1735b710d583763wrowestatic int reorder_sorter(const void *va, const void *vb)
700b96db75e7cfadb5219978c1735b710d583763wrowe core_a = (core_dir_config *)ap_get_module_config(a->elt, &core_module);
700b96db75e7cfadb5219978c1735b710d583763wrowe core_b = (core_dir_config *)ap_get_module_config(b->elt, &core_module);
700b96db75e7cfadb5219978c1735b710d583763wrowe /* we know they're both not special */
700b96db75e7cfadb5219978c1735b710d583763wrowe else if (core_a->d_components > core_b->d_components) {
700b96db75e7cfadb5219978c1735b710d583763wrowe /* Either they're both special, or they're both not special and have the
700b96db75e7cfadb5219978c1735b710d583763wrowe * same number of components. In any event, we now have to compare
700b96db75e7cfadb5219978c1735b710d583763wrowe * the minor key. */
700b96db75e7cfadb5219978c1735b710d583763wrowevoid ap_core_reorder_directories(apr_pool_t *p, server_rec *s)
8aefbd756763807188d2e3ce336a8680e4893066wrowe sconf = ap_get_module_config(s->module_config, &core_module);
8aefbd756763807188d2e3ce336a8680e4893066wrowe /* we have to allocate tmp space to do a stable sort */
a2a0abd88b19e042a3eb2a9fa1702c25ad51303dwrowe sortbin = apr_palloc(tmp, sec->nelts * sizeof(*sortbin));
8aefbd756763807188d2e3ce336a8680e4893066wrowe for (i = 0; i < nelts; ++i) {
2fa5b5878e7567e2875807c3e2a2b3b0d3ef74bewrowe qsort(sortbin, nelts, sizeof(*sortbin), reorder_sorter);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* and now copy back to the original array */
8aefbd756763807188d2e3ce336a8680e4893066wrowe for (i = 0; i < nelts; ++i) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker/*****************************************************************
8aefbd756763807188d2e3ce336a8680e4893066wrowe * There are some elements of the core config structures in which
23c6309e36a63b13b61c35999c978017521993d6wrowe * other modules have a legitimate interest (this is ugly, but necessary
2d399cd7535887fceaa9f8f116eb98ce68ddd602trawick * to preserve NCSA back-compatibility). So, we have a bunch of accessors
cf6ef072483172309861d06e85b1aeff4573c060wrowe (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
cf6ef072483172309861d06e85b1aeff4573c060wrowe conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
cf6ef072483172309861d06e85b1aeff4573c060wrowe conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
ecde48c75338ff5712f2036711f813c6dedca28ewroweAP_DECLARE(const char *) ap_default_type(request_rec *r)
d75626f0952c6152a99acd013a4f127d46f0f9edtrawick conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
d75626f0952c6152a99acd013a4f127d46f0f9edtrawickAP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe conf = (core_server_config *)ap_get_module_config(r->server->module_config,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoarAP_DECLARE(const apr_array_header_t *) ap_requires(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe/* Should probably just get rid of this... the only code that cares is
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * part of the core anyway (and in fact, it isn't publicised to other
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * modules).
a9a4544168a37b43bd180b3703ccee995f27a80awrowechar *ap_response_code_string(request_rec *r, int error_index)
a9a4544168a37b43bd180b3703ccee995f27a80awrowe conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe/* Code from Harald Hanche-Olsen <hanche@imf.unit.no> */
8aefbd756763807188d2e3ce336a8680e4893066wrowestatic apr_inline void do_double_reverse (conn_rec *conn)
700b96db75e7cfadb5219978c1735b710d583763wrowe /* already done */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (conn->remote_host == NULL || conn->remote_host[0] == '\0') {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* single reverse failed, so don't bother */
700b96db75e7cfadb5219978c1735b710d583763wroweAP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* If we haven't checked the host name, and we want to */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe ((core_dir_config *)ap_get_module_config(dir_config, &core_module))
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* the default */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (apr_get_hostname(&conn->remote_host, APR_REMOTE, conn->client_socket)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* if failed, set it to the NULL string to indicate error */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * Return the desired information; either the remote DNS name, if found,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * or either NULL (if the hostname was requested) or the IP address
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * (if any identifier was requested).
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (conn->remote_host != NULL && conn->remote_host[0] != '\0') {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwroweAP_DECLARE(const char *) ap_get_remote_logname(request_rec *r)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe/* If we haven't checked the identity, and we want to */
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe dir_conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe/* There are two options regarding what the "name" of a server is. The
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * "canonical" name as defined by ServerName and Port, or the "client's
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * name" as supplied by a possible Host: header or full URI. We never
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * trust the port passed in the client's headers, we always use the
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * port of the actual socket.
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * The DNS option to UseCanonicalName causes this routine to do a
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * reverse lookup on the local IP address of the connectiona and use
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * that for the ServerName. This makes its value more reliable while
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe * at the same time allowing Demon's magic virtual hosting to work.
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * The assumption is that DNS lookups are sufficiently quick...
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * -- fanf 1998-10-03
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(const char *) ap_get_server_name(request_rec *r)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
700b96db75e7cfadb5219978c1735b710d583763wrowe if (d->use_canonical_name == USE_CANONICAL_NAME_OFF) {
700b96db75e7cfadb5219978c1735b710d583763wrowe return r->hostname ? r->hostname : r->server->server_hostname;
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
cf6ef072483172309861d06e85b1aeff4573c060wrowe if (apr_get_hostname(&conn->local_host, APR_LOCAL, conn->client_socket) != APR_SUCCESS)
cf6ef072483172309861d06e85b1aeff4573c060wrowe conn->local_host = apr_pstrdup(conn->pool, r->server->server_hostname);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* default */
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)
548b2980e83f609186a76e98fb245d02e8547bc3jerenkrantz (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz port = r->server->port ? r->server->port : ap_default_port(r);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe apr_get_sockaddr(&localsa, APR_LOCAL, r->connection->client_socket);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* default */
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(char *) ap_construct_url(apr_pool_t *p, const char *uri,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_pstrcat(p, ap_http_method(r), "://", host, uri, NULL);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe return apr_psprintf(p, "%s://%s:%u%s", ap_http_method(r), host, port, uri);
f08810eff40a2bddd2bc0103453c4ae775ea62bewroweAP_DECLARE(unsigned long) ap_get_limit_req_body(const request_rec *r)
f08810eff40a2bddd2bc0103453c4ae775ea62bewrowe (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
700b96db75e7cfadb5219978c1735b710d583763wrowestatic apr_status_t get_win32_registry_default_value(apr_pool_t *p, HKEY hkey,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Read to NULL buffer to determine value size */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe result = RegQueryValueEx(hkeyOpen, "", 0, &type, NULL, &size);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((size < 2) || (type != REG_SZ && type != REG_EXPAND_SZ)) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Read value based on size query above */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe result = RegQueryValueEx(hkeyOpen, "", 0, &type, *value, &size);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* TODO: This might look fine, but we need to provide some warning
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * somewhere that some environment variables may -not- be translated,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * seeing as we may have chopped the environment table down somewhat.
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((result == ERROR_SUCCESS) && (type == REG_EXPAND_SZ))
700b96db75e7cfadb5219978c1735b710d583763wrowestatic char* get_interpreter_from_win32_registry(apr_pool_t *p, const char* ext,
700b96db75e7cfadb5219978c1735b710d583763wrowe * Future optimization:
700b96db75e7cfadb5219978c1735b710d583763wrowe * When the registry is successfully searched, store the strings for
700b96db75e7cfadb5219978c1735b710d583763wrowe * interpreter and arguments in an ext hash to speed up subsequent look-ups
700b96db75e7cfadb5219978c1735b710d583763wrowe /* Open the key associated with the script filetype extension */
700b96db75e7cfadb5219978c1735b710d583763wrowe result = RegOpenKeyEx(HKEY_CLASSES_ROOT, ext, 0, KEY_QUERY_VALUE,
700b96db75e7cfadb5219978c1735b710d583763wrowe /* Retrieve the name of the script filetype extension */
700b96db75e7cfadb5219978c1735b710d583763wrowe result = RegQueryValueEx(hkeyType, "", NULL, &type, typeName, &size);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (result == ERROR_SUCCESS && type == REG_SZ && typeName[0]) {
700b96db75e7cfadb5219978c1735b710d583763wrowe /* Open the key associated with the script filetype extension */
700b96db75e7cfadb5219978c1735b710d583763wrowe /* Open the key for the script command path by:
700b96db75e7cfadb5219978c1735b710d583763wrowe * 1) the 'named' filetype key for ExecCGI/Command
700b96db75e7cfadb5219978c1735b710d583763wrowe * 2) the extension's type key for ExecCGI/Command
700b96db75e7cfadb5219978c1735b710d583763wrowe * and if the strict arg is false, then continue trying:
700b96db75e7cfadb5219978c1735b710d583763wrowe * 3) the 'named' filetype key for Open/Command
700b96db75e7cfadb5219978c1735b710d583763wrowe * 4) the extension's type key for Open/Command
700b96db75e7cfadb5219978c1735b710d583763wrowe result = get_win32_registry_default_value(p, hkeyName,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (!strict && cmdOfName && (result != ERROR_SUCCESS)) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe result = get_win32_registry_default_value(p, hkeyName,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker result = get_win32_registry_default_value(p, hkeyType,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * The canonical way shell command entries are entered in the Win32
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * registry is as follows:
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * shell [options] "%1" [args]
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * shell - full path name to interpreter or shell to run.
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * E.g., c:\usr\local\ntreskit\perl\bin\perl.exe
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz * options - optional switches
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * "%1" - Place holder for file to run the shell against.
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * Typically quoted.
4f9c22c4f27571d54197be9674e1fc0d528192aestriker * options - additional arguments
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * E.g., /silent
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar * If we find a %1 or a quoted %1, lop off the remainder to arguments.
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE (file_type_e) ap_get_win32_interpreter(const request_rec *r,
c2cf53a40a9814eb91db2cdf820f97d943f21628coar d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
8aefbd756763807188d2e3ce336a8680e4893066wrowe /* Find the file extension */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if (ext && (!strcasecmp(ext,".bat") || !strcasecmp(ext,".cmd")))
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe *interpreter = apr_pstrcat(r->pool, "\"", comspec, "\" /c ", NULL);
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, 0, r->server,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe "Failed to start a '%s' file as a script." APR_EOL_STR
cadddb2c31d24d48f4017db4df0a29687432326cwrowe "\tCOMSPEC variable is missing from the environment.", ext);
0e58e92812f2f679d6bf2ff66cbcfa6c1d1e14bbjerenkrantz /* If the file has an extension and it is not .com and not .exe and
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * we've been instructed to search the registry, then do it!
cf6ef072483172309861d06e85b1aeff4573c060wrowe if (ext && strcasecmp(ext,".exe") && strcasecmp(ext,".com") &&
cf6ef072483172309861d06e85b1aeff4573c060wrowe (d->script_interpreter_source == INTERPRETER_SOURCE_REGISTRY ||
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe d->script_interpreter_source == INTERPRETER_SOURCE_REGISTRY_STRICT)) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Check the registry */
71fe373d064756fb261876443806ece033ee3309slive *interpreter = get_interpreter_from_win32_registry(r->pool, ext,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe else if (d->script_interpreter_source == INTERPRETER_SOURCE_REGISTRY_STRICT) {
ecde48c75338ff5712f2036711f813c6dedca28ewrowe ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, 0, r->server,
8aefbd756763807188d2e3ce336a8680e4893066wrowe "ScriptInterpreterSource config directive set to \"registry-strict\"." APR_EOL_STR
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "\tInterpreter not found for files of type '%s'.", ext);
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, 0, r->server,
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "ScriptInterpreterSource config directive set to \"registry\"." APR_EOL_STR
ecde48c75338ff5712f2036711f813c6dedca28ewrowe "\tInterpreter not found for files of type '%s', "
ecde48c75338ff5712f2036711f813c6dedca28ewrowe /* Need to peek into the file figure out what it really is... */
ecde48c75338ff5712f2036711f813c6dedca28ewrowe hFile = CreateFile(r->filename, GENERIC_READ, FILE_SHARE_READ, NULL,
cf6ef072483172309861d06e85b1aeff4573c060wrowe bResult = ReadFile(hFile, (void*) &buffer, sizeof(buffer) - 1,
cf6ef072483172309861d06e85b1aeff4573c060wrowe ap_log_rerror(APLOG_MARK, APLOG_ERR, GetLastError(), r,
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Script or executable, that is the question... */
cf6ef072483172309861d06e85b1aeff4573c060wrowe /* Assuming file is a script since it starts with a shebang */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* Not a script, is it an executable? */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar if ((nBytesRead >= sizeof(IMAGE_DOS_HEADER)) && (hdr->e_magic == IMAGE_DOS_SIGNATURE)) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe/*****************************************************************
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * Commands... this module handles almost all of the NCSA httpd.conf
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe * commands, but most of the old srm.conf is in the the modules.
700b96db75e7cfadb5219978c1735b710d583763wrowe/* returns a parent if it matches the given directive */
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowestatic const ap_directive_t * find_parent(const ap_directive_t *dirp,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *what)
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe /* ### it would be nice to have atom-ized directives */
e4a3f3c2f080cac75a15a6454cca429b8161c050wroweAP_DECLARE(const char *) ap_check_cmd_context(cmd_parms *cmd,
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((forbidden & NOT_IN_VIRTUALHOST) && cmd->server->is_virtual) {
e4a3f3c2f080cac75a15a6454cca429b8161c050wrowe if ((forbidden & NOT_IN_LIMIT) && cmd->limited != -1) {
8aefbd756763807188d2e3ce336a8680e4893066wrowe if ((forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE
c2cf53a40a9814eb91db2cdf820f97d943f21628coar " cannot occur within <Directory/Location/Files> "
8aefbd756763807188d2e3ce336a8680e4893066wrowe && ((found = find_parent(cmd->directive, "<Directory"))
8aefbd756763807188d2e3ce336a8680e4893066wrowe || (found = find_parent(cmd->directive, "<DirectoryMatch"))))
8aefbd756763807188d2e3ce336a8680e4893066wrowe && ((found = find_parent(cmd->directive, "<Location"))
5bb29f57ae0184d2b3c1cdf35132f8ceb011f882wrowe || (found = find_parent(cmd->directive, "<LocationMatch"))))
8aefbd756763807188d2e3ce336a8680e4893066wrowe || (found = find_parent(cmd->directive, "<FilesMatch"))))) {
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowestatic const char *set_access_name(cmd_parms *cmd, void *dummy,
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe const char *arg)
1b315ee865b0f11e582beb64127ca3a99a319d2fwrowe core_server_config *conf = ap_get_module_config(sconf, &core_module);
0540a0b469147b52e858587270dba31c2aaa9e09wrowestatic const char *set_gprof_dir(cmd_parms *cmd, void *dummy, char *arg)
0540a0b469147b52e858587270dba31c2aaa9e09wrowe core_server_config *conf = ap_get_module_config(sconf, &core_module);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb#endif /*GPROF*/
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *set_add_default_charset(cmd_parms *cmd,
948096a99010fccf648814fecf38f75c689172d7wrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb d->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME;
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantzstatic const char *set_document_root(cmd_parms *cmd, void *dummy,
948096a99010fccf648814fecf38f75c689172d7wrowe const char *arg)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz core_server_config *conf = ap_get_module_config(sconf, &core_module);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker if (/* TODO: ap_configtestonly && ap_docrootcheck && */ !ap_is_directory(arg)) {
948096a99010fccf648814fecf38f75c689172d7wrowe ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker "Warning: DocumentRoot [%s] does not exist",
a9a4544168a37b43bd180b3703ccee995f27a80awrowe return "DocumentRoot must be a directory";
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(void) ap_custom_response(request_rec *r, int status, char *string)
948096a99010fccf648814fecf38f75c689172d7wrowe ap_get_module_config(r->per_dir_config, &core_module);
948096a99010fccf648814fecf38f75c689172d7wrowe ((ap_is_url(string) || (*string == '/')) && (*string != '"')) ?
948096a99010fccf648814fecf38f75c689172d7wrowe apr_pstrdup(r->pool, string) : apr_pstrcat(r->pool, "\"", string, NULL);
053497224246c4dbef9af594cacf5c00ed271e6cwrowestatic const char *set_error_document(cmd_parms *cmd, void *conf_,
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz enum { MSG, LOCAL_PATH, REMOTE_PATH } what = MSG;
053497224246c4dbef9af594cacf5c00ed271e6cwrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* 1st parameter should be a 3 digit number, which we recognize;
c2cf53a40a9814eb91db2cdf820f97d943f21628coar * convert it into an array index
c2cf53a40a9814eb91db2cdf820f97d943f21628coar idx500 = ap_index_of_response(HTTP_INTERNAL_SERVER_ERROR);
053497224246c4dbef9af594cacf5c00ed271e6cwrowe else if ((index_number = ap_index_of_response(error_number)) == idx500) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return apr_pstrcat(cmd->pool, "Unsupported HTTP response code ",
0540a0b469147b52e858587270dba31c2aaa9e09wrowe /* Heuristic to determine second argument. */
948096a99010fccf648814fecf38f75c689172d7wrowe /* The entry should be ignored if it is a full URL for a 401 error */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, cmd->server,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar "cannot use a full URL in a 401 ErrorDocument "
4f9c22c4f27571d54197be9674e1fc0d528192aestriker "directive --- ignoring!");
0540a0b469147b52e858587270dba31c2aaa9e09wrowe else { /* Store it... */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar sizeof(*conf->response_code_strings) * RESPONSE_CODES);
948096a99010fccf648814fecf38f75c689172d7wrowe /* hack. Prefix a " if it is a msg; as that is what
0540a0b469147b52e858587270dba31c2aaa9e09wrowe * http_protocol.c relies on to distinguish between
948096a99010fccf648814fecf38f75c689172d7wrowe * a msg and a (local) path.
4f9c22c4f27571d54197be9674e1fc0d528192aestriker conf->response_code_strings[index_number] = (what == MSG) ?
053497224246c4dbef9af594cacf5c00ed271e6cwrowestatic const char *set_override(cmd_parms *cmd, void *d_, const char *l)
948096a99010fccf648814fecf38f75c689172d7wrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar while (l[0]) {
a2b181763cb35fd899feb4a436aeadaa80bf91eabrianp return apr_pstrcat(cmd->pool, "Illegal override option ", w, NULL);
aa047239dedf0d26e8efecfade32e7337f35df19wrowestatic const char *set_options(cmd_parms *cmd, void *d_, const char *l)
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz while (l[0]) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker else if (first) {
4f9c22c4f27571d54197be9674e1fc0d528192aestriker else if (!strcasecmp(w, "RunScripts")) { /* AI backcompat. Yuck */
aa047239dedf0d26e8efecfade32e7337f35df19wrowe return apr_pstrcat(cmd->pool, "Illegal option ", w, NULL);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* we ensure the invariant (d->opts_add & d->opts_remove) == 0 */
aa047239dedf0d26e8efecfade32e7337f35df19wrowestatic const char *satisfy(cmd_parms *cmd, void *c_, const char *arg)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker return "Satisfy either 'any' or 'all'.";
0540a0b469147b52e858587270dba31c2aaa9e09wrowestatic const char *require(cmd_parms *cmd, void *c_, const char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb c->ap_requires = apr_make_array(cmd->pool, 2, sizeof(require_line));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbAP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy,
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe const char *arg) {
a9a4544168a37b43bd180b3703ccee995f27a80awrowe const char *limited_methods = ap_getword(cmd->pool, &arg, '>');
aa047239dedf0d26e8efecfade32e7337f35df19wrowe const char *errmsg;
dc8692c6c0ca616a09aa12dad005f2ef23baa1a0wrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
aa047239dedf0d26e8efecfade32e7337f35df19wrowe char *method = ap_getword_conf(cmd->pool, &limited_methods);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return "TRACE cannot be controlled by <Limit>";
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb register int i, j, k;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * Deal with <Limit> by adding the method to the list.
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb sizeof(char *));
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb xmethod = (char **) apr_push_array(cmd->limited_xmethods);
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe * <LimitExcept>, so remove any/all occurrences of the method
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb * in the extension array.
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe for (j = i, k = i + 1;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe ++j, ++k) {
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe /* Killing two features with one function,
fa06de8a28a737e8fbaad76d7f3ff67aaa5e4a09wrowe * if (tog == NULL) <Limit>, else <LimitExcept>
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe errmsg = ap_walk_config(cmd->directive->first_child, cmd, cmd->context);
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb/* We use this in <DirectoryMatch> and <FilesMatch>, to ensure that
ebe7da316894e2b93b4a905fccd2496d0ed1bc78rbb * people don't get bitten by wrong-cased regex matches
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe * Report a missing-'>' syntax error.
e57e920838f31508f1418aa4c25ce55b345b2cebrbbstatic const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg)
e57e920838f31508f1418aa4c25ce55b345b2cebrbb const char *errmsg;
e68544ae924174ca227ede8e2e722cefa00ea0d3wrowe void *new_dir_conf = ap_create_per_dir_config(cmd->pool);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
68b29bcadd6c46aecdc9fe14c93555a2238ad2aagregames r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Treat 'default' path / as an inalienable root */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* Treat UNC path // as an inalienable root */
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Ensure that the pathname is canonical */
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar cmd->path = ap_os_canonical_filename(cmd->pool, cmd->path);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* initialize our config and fetch it */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb conf = (core_dir_config *)ap_set_config_vectors(cmd, new_dir_conf,
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_dir_conf);
b67fb549910fa0faf4cdd8aeaf9aeab51d4b6a92wrowe return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowestatic const char *urlsection(cmd_parms *cmd, void *mconfig, const char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *errmsg;
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb void *new_url_conf = ap_create_per_dir_config(cmd->pool);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb /* initialize our config and fetch it */
6edf0ccf36ca2792b20058833680375b9256f2e0colm conf = (core_dir_config *)ap_set_config_vectors(cmd, new_url_conf,
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_url_conf);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb conf->d = apr_pstrdup(cmd->pool, cmd->path); /* No mangling, please */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
6c24fd6cfe148639988d5b335185ffb215662801wrowestatic const char *filesection(cmd_parms *cmd, void *mconfig, const char *arg)
d2220a04f870f632b8cec1e6713dbb980ed5e386wrowe const char *errmsg;
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe void *new_file_conf = ap_create_per_dir_config(cmd->pool);
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT|NOT_IN_LOCATION);
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames /* Only if not an .htaccess file */
f888346b48f5e5b5e3f0a47dedb8cefd2759a4e2gregames r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
4f9c22c4f27571d54197be9674e1fc0d528192aestriker /* Ensure that the pathname is canonical */
cadddb2c31d24d48f4017db4df0a29687432326cwrowe cmd->path = ap_os_canonical_filename(cmd->pool, cmd->path);
cadddb2c31d24d48f4017db4df0a29687432326cwrowe /* initialize our config and fetch it */
5b3abd2fecc712f08ad728114aa77137b9f67716wrowe conf = (core_dir_config *)ap_set_config_vectors(cmd, new_file_conf,
efa1a34b0a7785fc72863eff175b0cfc1ecb0e38wrowe errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_file_conf);
c2cf53a40a9814eb91db2cdf820f97d943f21628coar return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name,
290ecc1ddceca1ed49bc1a5338921264b5c3e07cwrowestatic const char *start_ifmod(cmd_parms *cmd, void *mconfig, const char *arg)
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe const char *retval;
cadddb2c31d24d48f4017db4df0a29687432326cwrowe retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd,
4f9c22c4f27571d54197be9674e1fc0d528192aestrikerAP_DECLARE(int) ap_exists_config_define(const char *name)
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowestatic const char *start_ifdefine(cmd_parms *cmd, void *dummy, const char *arg)
83a8dc5a596a8a1b9d14f063268287d123b9ed7ewrowe const char *endp;
1067418d9ed9ed9daeb3ca4f74e72db810c49833wrowe int defined;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar const char *retval;
731344ed8f3677d1661c261ca5fcdd2ee3dbc74ccoar retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb/* httpd.conf commands... beginning with the <VirtualHost> business */
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *virtualhost_section(cmd_parms *cmd, void *dummy,
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *errmsg;
0540a0b469147b52e858587270dba31c2aaa9e09wrowe const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
1fbf6ba0f5207e6637b49f9a9dfcc779bbe952a9trawick /* FIXME: There's another feature waiting to happen here -- since you
c2cf53a40a9814eb91db2cdf820f97d943f21628coar can now put multiple addresses/names on a single <VirtualHost>
0540a0b469147b52e858587270dba31c2aaa9e09wrowe you might want to use it to group common definitions and then
c2cf53a40a9814eb91db2cdf820f97d943f21628coar define other "subhosts" with their individual differences. But
0540a0b469147b52e858587270dba31c2aaa9e09wrowe personally I'd rather just do it with a macro preprocessor. -djg */
0540a0b469147b52e858587270dba31c2aaa9e09wrowe return "<VirtualHost> doesn't nest!";
c2cf53a40a9814eb91db2cdf820f97d943f21628coar errmsg = ap_init_virtual_host(p, arg, main_server, &s);
d4abb06ac220bb280ae996b6d21bbd257db51bb1jerenkrantz errmsg = ap_walk_config(cmd->directive->first_child, cmd,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *set_server_alias(cmd_parms *cmd, void *dummy,
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd const char *arg)
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd return "ServerAlias only used in <VirtualHost>";
c880637396a01f4acfcf7e35fe423ced2d86c3b4nd while (*arg) {
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb item = (char **)apr_push_array(cmd->server->wild_names);
e8f95a682820a599fe41b22977010636be5c2717jimstatic const char *add_filter(cmd_parms *cmd, void *dummy, const char *arg)
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddard newfilter = (char **)apr_push_array(conf->output_filters);
30b4a330a5f651eb5198fa93dbb9f3d3594564c9stoddardstatic const char *add_input_filter(cmd_parms *cmd, void *dummy, const char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb newfilter = (char **)apr_push_array(conf->input_filters);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *add_module_command(cmd_parms *cmd, void *dummy,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *arg)
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
b38846b15c8891c6dec44dcc4f96ca40721bf663rbb return apr_pstrcat(cmd->pool, "Cannot add module via name '", arg,
b38846b15c8891c6dec44dcc4f96ca40721bf663rbbstatic const char *clear_module_list_command(cmd_parms *cmd, void *dummy)
4f9c22c4f27571d54197be9674e1fc0d528192aestriker const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
return err;
return NULL;
const char *arg)
return err;
return NULL;
int port;
return err;
return NULL;
const char *arg)
return err;
return NULL;
const char *arg)
return err;
return NULL;
return err;
return NULL;
const char *arg)
return err;
return NULL;
const char *arg)
return err;
return NULL;
const char *arg)
return err;
return NULL;
return err;
return NULL;
const char *arg)
return err;
return NULL;
const char *arg)
return err;
return NULL;
return err;
return NULL;
const char *arg)
return err;
return NULL;
const char *name)
return NULL;
char *str;
return err;
return NULL;
&core_module);
const char *word1)
return NULL;
return err;
static int version_locked = 0;
enum server_token_type {
version_locked = 0;
return APR_SUCCESS;
if (! version_locked) {
const char *arg)
return err;
return NULL;
const char *arg)
int lim;
return err;
if (lim < 0) {
return NULL;
const char *arg)
int lim;
return err;
if (lim < 0) {
NULL);
return NULL;
const char *arg)
int lim;
return err;
if (lim < 0) {
NULL);
return NULL;
const char *arg)
return err;
* Instead we have an idiotic define in httpd.h that prevents
return NULL;
const char *arg)
return err;
return NULL;
return AP_DEFAULT_LIMIT_XML_BODY;
#ifdef WIN32
char *arg)
return NULL;
#if !defined (RLIMIT_CPU) || !(defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)) || !defined (RLIMIT_NPROC)
return NULL;
#ifdef RLIMIT_CPU
return NULL;
#if defined(RLIMIT_AS)
return NULL;
#ifdef RLIMIT_NPROC
return NULL;
apr_size_t i = 0;
*nbytes = 0;
bytes_written += n;
return rv;
*nbytes += n;
if (n < cnt) {
return APR_SUCCESS;
#if APR_HAS_SENDFILE
flags);
tmplen = 0;
file_bytes_left = 0;
file_offset = 0;
tmplen = 0;
apr_int32_t i;
*nbytes = 0;
sendlen = 0;
return rv;
#ifdef GPROF
#ifdef _OSD_POSIX
#ifdef WIN32
#ifdef RLIMIT_CPU
#ifdef RLIMIT_NPROC
{ NULL }
if (r->proxyreq) {
return HTTP_FORBIDDEN;
return HTTP_BAD_REQUEST;
NULL);
NULL);
return OK;
ap_bucket *e;
core_dir_config *d =
int errstatus;
int bld_content_md5 =
return errstatus;
return HTTP_NOT_IMPLEMENTED;
return ap_send_http_options(r);
return HTTP_METHOD_NOT_ALLOWED;
: r->filename);
return HTTP_NOT_FOUND;
return HTTP_METHOD_NOT_ALLOWED;
if ((status = apr_open(&fd, r->filename, APR_READ | APR_BINARY, 0, r->connection->pool)) != APR_SUCCESS) {
return HTTP_FORBIDDEN;
ap_set_etag(r);
return errstatus;
if (bld_content_md5) {
e = ap_bucket_create_eos();
typedef struct COALESCE_FILTER_CTX {
AP_BRIGADE_FOREACH(e, b) {
if (destroy_me) {
const char *str;
apr_size_t n;
return rv;
AP_BUCKET_REMOVE(e);
destroy_me = e;
insert_before = e;
if (destroy_me) {
if (pass_the_brigade) {
if (insert_first) {
AP_BRIGADE_INSERT_HEAD(b, e);
else if (insert_before) {
return rv;
if (ctx) {
if (insert_before) {
return APR_SUCCESS;
ap_bucket *e;
AP_BRIGADE_FOREACH(e, b) {
if (AP_BUCKET_IS_EOS(e)) {
eos = e;
const char *data;
return rv;
if (len > 0) {
if (bytes > 0) {
AP_BRIGADE_INSERT_HEAD(b, e);
AP_BRIGADE_INSERT_TAIL(b, e);
return rv;
return APR_SUCCESS;
ap_bucket *e;
AP_BRIGADE_INSERT_TAIL(b, e);
return APR_SUCCESS;
return APR_EOF;
typedef struct CORE_OUTPUT_FILTER_CTX {
ap_bucket *e;
conn_rec *c = f->c;
if (ctx->b) {
b = ctx->b;
AP_BRIGADE_FOREACH(e, b) {
else if (AP_BUCKET_IS_FILE(e)) {
const char *str;
apr_size_t n;
nbytes += n;
if (!fd) {
nvec++;
if (AP_BUCKET_IS_EOS(e)) {
AP_BUCKET_REMOVE(e);
return APR_SUCCESS;
if (fd) {
#if APR_HAS_SENDFILE
if (nvec) {
if (nvec_trailers) {
#if APR_HAS_SENDFILE
if (!c->keepalive) {
#if APR_HAS_SENDFILE
if (more)
return rv;
nvec = 0;
nvec_trailers = 0;
b = more;
return APR_SUCCESS;
{ return DEFAULT_HTTP_PORT; }
&core_module);
static void register_hooks(void)