core.c revision 8496c88debb9962575dac2b1ef9b81984d7bd759
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering/* ====================================================================
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * The Apache Software License, Version 1.1
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Redistribution and use in source and binary forms, with or without
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * modification, are permitted provided that the following conditions
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 1. Redistributions of source code must retain the above copyright
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * notice, this list of conditions and the following disclaimer.
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 2. Redistributions in binary form must reproduce the above copyright
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * notice, this list of conditions and the following disclaimer in
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * the documentation and/or other materials provided with the
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * 3. The end-user documentation included with the redistribution,
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * if any, must include the following acknowledgment:
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * "This product includes software developed by the
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Apache Software Foundation (http://www.apache.org/)."
19887cd06a3af2f045e763986eda19e208bd3f85Zbigniew Jędrzejewski-Szmek * Alternately, this acknowledgment may appear in the software itself,
21ac6ff143cc8bebfbd1818af28e8c6f82cd5265Zbigniew Jędrzejewski-Szmek * if and wherever such third-party acknowledgments normally appear.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 4. The names "Apache" and "Apache Software Foundation" must
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * not be used to endorse or promote products derived from this
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * software without prior written permission. For written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission, please contact apache@apache.org.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * 5. Products derived from this software may not be called "Apache",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * nor may "Apache" appear in their name, without prior written
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * permission of the Apache Software Foundation.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * ====================================================================
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * This software consists of voluntary contributions made by many
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * individuals on behalf of the Apache Software Foundation. For more
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * information on the Apache Software Foundation, please see
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Portions of this software are based upon public domain software
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * originally written at the National Center for Supercomputing Applications,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * University of Illinois, Urbana-Champaign.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "apr_thread_proc.h" /* for RLIMIT stuff */
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering#include "http_protocol.h" /* For index_of_response(). Grump. */
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering#include "http_main.h" /* For the default_handler below... */
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering/* LimitXMLRequestBody handling */
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering#define AP_DEFAULT_LIMIT_XML_BODY ((size_t)1000000)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (apr_pool_t *p, const char *val, apr_hash_t *ht),
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* Server core module... This module provides support for really basic
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * server operations, including options and commands which control the
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * operation of other modules. Consider this the bureaucracy module.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * The core module also defines handlers, etc., do handle just enough
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * to allow a server with the core module ONLY to actually serve documents
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * (though it slaps DefaultType on all of 'em); this was useful in testing,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * but may not be worth preserving.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * This file could almost be mod_core.c, except for the stuff which affects
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * the http_conf_globals.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* Handles for core filters */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void *create_core_dir_config(apr_pool_t *a, char *dir)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_dir_config *)apr_pcalloc(a, sizeof(core_dir_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* conf->r and conf->d[_*] are initialized by dirsection() or left NULL */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts = dir ? OPT_UNSET : OPT_UNSET|OPT_ALL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts_add = conf->opts_remove = OPT_NONE;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->override = dir ? OR_UNSET : OR_UNSET|OR_ALL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->use_canonical_name = USE_CANONICAL_NAME_UNSET;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_xml_body = AP_LIMIT_UNSET;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_file = apr_array_make(a, 2, sizeof(ap_conf_vector_t *));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->server_signature = srv_sig_unset;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->add_default_charset = ADD_DEFAULT_CHARSET_UNSET;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Overriding all negotiation
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering * Flag for use of inodes in ETags.
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering return (void *)conf;
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering * Overlay one hash table of ct_output_filters onto another
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poetteringstatic void *merge_ct_filters(apr_pool_t *p,
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering const ap_filter_rec_t *overlay_info = (const ap_filter_rec_t *)overlay_val;
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering const ap_filter_rec_t *base_info = (const ap_filter_rec_t *)base_val;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek new = apr_pcalloc(p, sizeof(ap_filter_rec_t));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek new->name = apr_pstrdup(p, overlay_info->name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek overlay_info = overlay_info->next;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* We can't have dups. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!strcasecmp(base_info->name, f->name)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek f = apr_pcalloc(p, sizeof(ap_filter_rec_t));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek f->name = apr_pstrdup(p, base_info->name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_dir_config *base = (core_dir_config *)basev;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_dir_config *new = (core_dir_config *)newv;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Create this conf by duplicating the base, replacing elements
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * (or creating copies for merging) where new-> values exist.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_dir_config *)apr_palloc(a, sizeof(core_dir_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy(conf, base, sizeof(core_dir_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->d_is_fnmatch = new->d_is_fnmatch;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->d_components = new->d_components;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* there was no explicit setting of new->opts, so we merge
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * preserve the invariant (opts_add & opts_remove) == 0
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts_remove = (conf->opts_remove & ~new->opts_add)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* otherwise we just copy, because an explicit opts setting
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * overrides all earlier +/- modifiers
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering conf->ap_default_type = new->ap_default_type;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->ap_auth_type = new->ap_auth_type;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->ap_auth_name = new->ap_auth_name;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->ap_requires = new->ap_requires;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (conf->response_code_strings == NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->response_code_strings = new->response_code_strings;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (new->response_code_strings != NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* If we merge, the merge-result must have it's own array
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->response_code_strings = apr_palloc(a,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sizeof(*conf->response_code_strings) * RESPONSE_CODES);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy(conf->response_code_strings, base->response_code_strings,
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering sizeof(*conf->response_code_strings) * RESPONSE_CODES);
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering for (i = 0; i < RESPONSE_CODES; ++i) {
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering if (new->response_code_strings[i] != NULL) {
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering conf->response_code_strings[i] = new->response_code_strings[i];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Otherwise we simply use the base->response_code_strings array
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->hostname_lookups != HOSTNAME_LOOKUP_UNSET) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->hostname_lookups = new->hostname_lookups;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((new->do_rfc1413 & 2) == 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->do_rfc1413 = new->do_rfc1413;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((new->content_md5 & 2) == 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->content_md5 = new->content_md5;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->accept_path_info != 3) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->accept_path_info = new->accept_path_info;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->use_canonical_name != USE_CANONICAL_NAME_UNSET) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->use_canonical_name = new->use_canonical_name;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_cpu = new->limit_cpu;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_mem = new->limit_mem;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_nproc = new->limit_nproc;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_req_body = new->limit_req_body;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->limit_xml_body != AP_LIMIT_UNSET)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_xml_body = new->limit_xml_body;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->limit_xml_body = base->limit_xml_body;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* If we merge, the merge-result must have it's own array
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_file = apr_array_append(a, base->sec_file, new->sec_file);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Otherwise we simply use the base->sec_file array
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->satisfy != SATISFY_NOSPEC) {
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering if (new->server_signature != srv_sig_unset) {
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt conf->server_signature = new->server_signature;
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering if (new->add_default_charset != ADD_DEFAULT_CHARSET_UNSET) {
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering conf->add_default_charset = new->add_default_charset;
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering conf->add_default_charset_name = new->add_default_charset_name;
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering /* Overriding all negotiation
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->mime_type = new->mime_type;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->output_filters = new->output_filters;
c454426c54c9beb274f415a80c64a4f1580700e7Lennart Poettering conf->input_filters = new->input_filters;
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering if (conf->ct_output_filters && new->ct_output_filters) {
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering conf->ct_output_filters = apr_hash_merge(a,
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poettering conf->ct_output_filters = apr_hash_copy(a, new->ct_output_filters);
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poettering /* That memcpy above isn't enough. */
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poettering conf->ct_output_filters = apr_hash_copy(a, base->ct_output_filters);
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt * Now merge the setting of the FileETag directive.
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poettering (conf->etag_add & (~ new->etag_remove)) | new->etag_add;
762a5766dc65058c245c87d326ae3d403d85ea06Lennart Poettering (conf->opts_remove & (~ new->etag_add)) | new->etag_remove;
762a5766dc65058c245c87d326ae3d403d85ea06Lennart Poettering (conf->etag_bits & (~ conf->etag_remove)) | conf->etag_add;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (new->enable_mmap != ENABLE_MMAP_UNSET) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->enable_mmap = new->enable_mmap;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void *create_core_server_config(apr_pool_t *a, server_rec *s)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_server_config *)apr_pcalloc(a, sizeof(core_server_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->access_name = is_virtual ? NULL : DEFAULT_ACCESS_FNAME;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->ap_document_root = is_virtual ? NULL : DOCUMENT_LOCATION;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_dir = apr_array_make(a, 40, sizeof(ap_conf_vector_t *));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_url = apr_array_make(a, 40, sizeof(ap_conf_vector_t *));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic void *merge_core_server_configs(apr_pool_t *p, void *basev, void *virtv)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_server_config *base = (core_server_config *)basev;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_server_config *virt = (core_server_config *)virtv;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_server_config *)apr_palloc(p, sizeof(core_server_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek memcpy(conf, virt, sizeof(core_server_config));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->access_name = base->access_name;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->ap_document_root = base->ap_document_root;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_dir = apr_array_append(p, base->sec_dir, virt->sec_dir);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->sec_url = apr_array_append(p, base->sec_url, virt->sec_url);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* Add per-directory configuration entry (for <directory> section);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * these are part of the core server config.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_server_config *sconf = ap_get_module_config(s->module_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **new_space = (void **)apr_array_push(sconf->sec_dir);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_CORE_DECLARE(void) ap_add_per_url_conf(server_rec *s, void *url_config)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_server_config *sconf = ap_get_module_config(s->module_config,
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt void **new_space = (void **)apr_array_push(sconf->sec_url);
cb7bb815d2ad7945e63214d21cec1d70152ba6abMarkus KnetschkeAP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void **new_space = (void **)apr_array_push(conf->sec_file);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* We need to do a stable sort, qsort isn't stable. So to make it stable
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * we'll be maintaining the original index into the list, and using it
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * as the minor key during sorting. The major key is the number of
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * components (where the root component is zero).
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int reorder_sorter(const void *va, const void *vb)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const struct reorder_sort_rec *a = va;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const struct reorder_sort_rec *b = vb;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_a = ap_get_module_config(a->elt, &core_module);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_b = ap_get_module_config(b->elt, &core_module);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* a regex always sorts after a non-regex
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (core_a->r && !core_b->r) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* we always sort next by the number of components
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt if (core_a->d_components < core_b->d_components) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (core_a->d_components > core_b->d_components) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* They have the same number of components, we now have to compare
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * the minor key to maintain the original order (from the config.)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return a->orig_index - b->orig_index;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekvoid ap_core_reorder_directories(apr_pool_t *p, server_rec *s)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek struct reorder_sort_rec *sortbin;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sconf = ap_get_module_config(s->module_config, &core_module);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek elts = (ap_conf_vector_t **)sec_dir->elts;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* simple case of already being sorted... */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* We're not checking this condition to be fast... we're checking
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * it to avoid trying to palloc zero bytes, which can trigger some
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * memory debuggers to barf
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart Poettering /* we have to allocate tmp space to do a stable sort */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sortbin = apr_palloc(tmp, sec_dir->nelts * sizeof(*sortbin));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (i = 0; i < nelts; ++i) {
3fe22bb4b6b5faf27683ad2e231b5a69b6e63a9eLennart Poettering qsort(sortbin, nelts, sizeof(*sortbin), reorder_sorter);
3fe22bb4b6b5faf27683ad2e231b5a69b6e63a9eLennart Poettering /* and now copy back to the original array */
3fe22bb4b6b5faf27683ad2e231b5a69b6e63a9eLennart Poettering for (i = 0; i < nelts; ++i) {
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart Poettering/*****************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * There are some elements of the core config structures in which
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * other modules have a legitimate interest (this is ugly, but necessary
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * to preserve NCSA back-compatibility). So, we have a bunch of accessors
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart PoetteringAP_DECLARE(int) ap_allow_options(request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_allow_overrides(request_rec *r)
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart PoetteringAP_DECLARE(const char *) ap_auth_type(request_rec *r)
d6ce17c7f02ed3facdb45f65f546e587c2f00950Lennart Poettering conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
7de304525deafe4eb86060321e39787138dbbadfLennart PoetteringAP_DECLARE(const char *) ap_auth_name(request_rec *r)
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
7de304525deafe4eb86060321e39787138dbbadfLennart PoetteringAP_DECLARE(const char *) ap_default_type(request_rec *r)
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_server_config *)ap_get_module_config(r->server->module_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const apr_array_header_t *) ap_requires(request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(int) ap_satisfies(request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen/* Should probably just get rid of this... the only code that cares is
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * part of the core anyway (and in fact, it isn't publicised to other
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekchar *ap_response_code_string(request_rec *r, int error_index)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (conf->response_code_strings == NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return conf->response_code_strings[error_index];
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* Code from Harald Hanche-Olsen <hanche@imf.unit.no> */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic APR_INLINE void do_double_reverse (conn_rec *conn)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* already done */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (conn->remote_host == NULL || conn->remote_host[0] == '\0') {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* single reverse failed, so don't bother */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek rv = apr_sockaddr_info_get(&sa, conn->remote_host, APR_UNSPEC, 0, 0, conn->pool);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (apr_sockaddr_equal(sa, conn->remote_addr)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (str_is_ip) { /* if caller wants to know */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* If we haven't checked the host name, and we want to */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ((core_dir_config *)ap_get_module_config(dir_config, &core_module))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek hostname_lookups = HOSTNAME_LOOKUP_OFF;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* the default */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek hostname_lookups = HOSTNAME_LOOKUP_OFF;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek || hostname_lookups != HOSTNAME_LOOKUP_OFF)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (apr_getnameinfo(&conn->remote_host, conn->remote_addr, 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek ap_str_tolower(conn->remote_host);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* if failed, set it to the NULL string to indicate error */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (conn->remote_host == NULL) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (type == REMOTE_DOUBLE_REV) {
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt * Return the desired information; either the remote DNS name, if found,
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt * or either NULL (if the hostname was requested) or the IP address
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering * (if any identifier was requested).
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt if (conn->remote_host != NULL && conn->remote_host[0] != '\0') {
b938cb902c3b5bca807a94b277672c64d6767886Jan Engelhardt if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) {
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering if (str_is_ip) { /* if caller wants to know */
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart PoetteringAP_DECLARE(const char *) ap_get_remote_logname(request_rec *r)
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering if (r->connection->remote_logname != NULL) {
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering /* If we haven't checked the identity, and we want to */
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering dir_conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering/* There are two options regarding what the "name" of a server is. The
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * "canonical" name as defined by ServerName and Port, or the "client's
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * name" as supplied by a possible Host: header or full URI. We never
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * trust the port passed in the client's headers, we always use the
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * port of the actual socket.
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * The DNS option to UseCanonicalName causes this routine to do a
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * reverse lookup on the local IP address of the connection and use
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * that for the ServerName. This makes its value more reliable while
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering * at the same time allowing Demon's magic virtual hosting to work.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * The assumption is that DNS lookups are sufficiently quick...
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * -- fanf 1998-10-03
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const char *) ap_get_server_name(request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering if (d->use_canonical_name == USE_CANONICAL_NAME_OFF) {
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering return r->hostname ? r->hostname : r->server->server_hostname;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (apr_getnameinfo(&conn->local_host,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conn->local_addr, 0) != APR_SUCCESS)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conn->local_host = apr_pstrdup(conn->pool,
91913f584af38b29a816cca959ba648acd60ac9fLennart PoetteringAP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering if (d->use_canonical_name == USE_CANONICAL_NAME_OFF
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering || d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering /* With UseCanonicalName off Apache will form self-referential
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering * URLs using the hostname and port supplied by the client if
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering * any are supplied (otherwise it will use the canonical name).
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering port = r->parsed_uri.port ? r->parsed_uri.port :
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering else { /* d->use_canonical_name == USE_CANONICAL_NAME_ON */
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering /* With UseCanonicalName on (and in all versions prior to 1.3)
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering * Apache will use the hostname and port specified in the
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering * ServerName directive to construct a canonical name for the
91913f584af38b29a816cca959ba648acd60ac9fLennart Poettering * server. (If no port was specified in the ServerName
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * directive, Apache uses the port supplied by the client if
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * any is supplied, and finally the default port for the protocol
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek port = r->server->port ? r->server->port :
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r->connection->local_addr->port ? r->connection->local_addr->port :
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(char *) ap_construct_url(apr_pool_t *p, const char *uri,
af40e5d3acbdcff09c8809cd1b86ecf8871f65f0Lennart Poettering const char *host = ap_get_server_name(r);
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering return apr_pstrcat(p, ap_http_method(r), "://", host, uri, NULL);
7de304525deafe4eb86060321e39787138dbbadfLennart Poettering return apr_psprintf(p, "%s://%s:%u%s", ap_http_method(r), host, port, uri);
7de304525deafe4eb86060321e39787138dbbadfLennart PoetteringAP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt/*****************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * Commands... this module handles almost all of the NCSA httpd.conf
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek * commands, but most of the old srm.conf is in the the modules.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* returns a parent if it matches the given directive */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic const ap_directive_t * find_parent(const ap_directive_t *dirp,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* ### it would be nice to have atom-ized directives */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (strcasecmp(dirp->directive, what) == 0)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-SzmekAP_DECLARE(const char *) ap_check_cmd_context(cmd_parms *cmd,
e0ea94c1e2ab3930c85c6057189a2a829a13a800Lennart Poettering const char *gt = (cmd->cmd->name[0] == '<'
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek && cmd->cmd->name[strlen(cmd->cmd->name)-1] != '>')
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((forbidden & NOT_IN_VIRTUALHOST) && cmd->server->is_virtual) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(cmd->pool, cmd->cmd->name, gt,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " cannot occur within <VirtualHost> section", NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if ((forbidden & NOT_IN_LIMIT) && cmd->limited != -1) {
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke return apr_pstrcat(cmd->pool, cmd->cmd->name, gt,
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke " cannot occur within <Limit> section", NULL);
ac92ced5bb41def1d90f871d6c8cfec2b03c0c7dBenjamin Franzke if ((forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(cmd->pool, cmd->cmd->name, gt,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " cannot occur within <Directory/Location/Files> "
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (((forbidden & NOT_IN_DIRECTORY)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek && ((found = find_parent(cmd->directive, "<Directory"))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek || (found = find_parent(cmd->directive, "<DirectoryMatch"))))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek || ((forbidden & NOT_IN_LOCATION)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek && ((found = find_parent(cmd->directive, "<Location"))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek || (found = find_parent(cmd->directive, "<LocationMatch"))))
e0ea94c1e2ab3930c85c6057189a2a829a13a800Lennart Poettering && ((found = find_parent(cmd->directive, "<Files"))
e0ea94c1e2ab3930c85c6057189a2a829a13a800Lennart Poettering || (found = find_parent(cmd->directive, "<FilesMatch"))))) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return apr_pstrcat(cmd->pool, cmd->cmd->name, gt,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " cannot occur within ", found->directive,
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poetteringstatic const char *set_access_name(cmd_parms *cmd, void *dummy,
a8eaaee72a2f06e0fb64fb71de3b71ecba31dafbJan Engelhardt core_server_config *conf = ap_get_module_config(sconf, &core_module);
6e9efa59209d48fc69a456fbadb2b5c113f503a6Lennart Poettering const char *err = ap_check_cmd_context(cmd,
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poettering conf->access_name = apr_pstrdup(cmd->pool, arg);
ef3100e9637adda26fa19e7ee8606788320dcde3Lennart Poetteringstatic const char *set_gprof_dir(cmd_parms *cmd, void *dummy, const char *arg)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek void *sconf = cmd->server->module_config;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek core_server_config *conf = ap_get_module_config(sconf, &core_module);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const char *err = ap_check_cmd_context(cmd,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek conf->gprof_dir = apr_pstrdup(cmd->pool, arg);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic const char *set_add_default_charset(cmd_parms *cmd,
16eb4024887b1b79fc56706fda25eadaecdef2d4Zbigniew Jędrzejewski-Szmek const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
return NULL;
const char *arg)
return err;
arg);
return NULL;
const char *string)
int idx;
return err;
* http_protocol.c relies on to distinguish between
return NULL;
return err;
return NULL;
char action;
action = *(w++);
else if (first) {
first = 0;
return NULL;
const char *args_p)
char action;
char *token;
const char *args;
int valid;
int first;
int explicit;
explicit = 0;
token++;
if (first) {
first = 0;
valid = 0;
valid = 0;
if (! valid) {
NULL);
if (explicit) {
return NULL;
const char *arg)
return err;
return NULL;
return NULL;
require_line *r;
if (!c->ap_requires) {
return NULL;
void *dummy,
const char *arg)
const char *errmsg;
return err;
while (limited_methods[0]) {
int methnum;
return errmsg;
#ifdef WIN32
#define USE_ICASE 0
const char *errmsg;
return err;
if (!arg) {
char *newpath;
return errmsg;
conf->r = r;
return NULL;
const char *errmsg;
return err;
return errmsg;
conf->r = r;
return NULL;
const char *errmsg;
return err;
if (!old_path) {
char *newpath;
return errmsg;
conf->r = r;
return NULL;
if (not) {
arg++;
const char *retval;
return retval;
char **defines;
const char *endp;
int not = 0;
arg++;
const char *retval;
return retval;
/* httpd.conf commands... beginning with the <VirtualHost> business */
const char *arg)
const char *errmsg;
return err;
if (errmsg) {
return errmsg;
s->lookup_defaults);
return errmsg;
const char *arg)
while (*arg) {
return NULL;
const char *arg)
return err;
return NULL;
const char *portstr;
int port;
return err;
if (portstr) {
portstr++;
port = 0;
return NULL;
const char *arg)
return err;
return NULL;
const char *arg)
return err;
return NULL;
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;
return NULL;
const char *arg)
return err;
return NULL;
const char *name)
if (!conffile) {
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)
char *errp;
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;
#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;
if (old) {
return NULL;
&core_module);
while (ct_filter) {
*nbytes = 0;
bytes_written += n;
return rv;
*nbytes += n;
if (n < cnt) {
return APR_SUCCESS;
#if APR_HAS_SENDFILE
#ifdef AP_DEBUG
flags);
tmplen = 0;
file_bytes_left = 0;
file_offset = 0;
tmplen = 0;
apr_int32_t i;
*nbytes = 0;
sendlen = 0;
return rv;
#ifdef GPROF
"Set to on or off for PATH_INFO to be accepted by handlers, or default for the per-handler preference"),
#ifdef _OSD_POSIX
#ifdef RLIMIT_CPU
#ifdef RLIMIT_NPROC
* #defined them in mpm.h.
#ifdef AP_MPM_WANT_SET_PIDFILE
#ifdef AP_MPM_WANT_SET_SCOREBOARD
#ifdef AP_MPM_WANT_SET_LOCKFILE
#ifdef AP_MPM_WANT_SET_MAX_REQUESTS
#ifdef AP_MPM_WANT_SET_COREDUMPDIR
{ NULL }
if (r->proxyreq) {
return HTTP_FORBIDDEN;
return HTTP_BAD_REQUEST;
!= APR_SUCCESS) {
return HTTP_FORBIDDEN;
!= APR_SUCCESS) {
return HTTP_FORBIDDEN;
return OK;
int access_status;
return access_status;
return access_status;
return OK;
&core_module);
return OK;
apr_bucket *e;
core_dir_config *d;
int errstatus;
int bld_content_md5;
return DECLINED;
&core_module);
return errstatus;
return HTTP_NOT_FOUND;
return HTTP_NOT_FOUND;
return HTTP_FORBIDDEN;
ap_set_etag(r);
return errstatus;
if (bld_content_md5) {
c->bucket_alloc);
#if APR_HAS_MMAP
(void)apr_bucket_file_enable_mmap(e, 0);
return HTTP_NOT_IMPLEMENTED;
return ap_send_http_options(r);
return HTTP_METHOD_NOT_ALLOWED;
if (!f->ctx) {
if (*first_line) {
(int)(keptalive
*first_line = 0;
if (keptalive) {
#define BRIGADE_NORMALIZE(b) \
if (e->length == 0) { \
apr_bucket *d; \
d = APR_BUCKET_NEXT(e); \
apr_bucket_delete(e); \
e = APR_BUCKET_NEXT(e); \
apr_bucket *e;
const char *str;
return APR_SUCCESS;
if (!ctx)
return APR_EOF;
return APR_EOF;
apr_bucket *e;
return APR_EOF;
return rv;
c = str;
if (*c == APR_ASCII_LF)
return APR_SUCCESS;
apr_bucket *e;
APR_BRIGADE_INSERT_TAIL(b, e);
return APR_SUCCESS;
apr_bucket *e;
return APR_SUCCESS;
return rv;
APR_BRIGADE_INSERT_TAIL(b, e);
return APR_SUCCESS;
return rv;
return APR_SUCCESS;
return rv;
conn_rec *c = f->c;
if (ctx->b) {
b = ctx->b;
apr_bucket *e;
APR_BRIGADE_FOREACH(e, b) {
last_e = e;
else if (APR_BUCKET_IS_FILE(e)
if (fd) {
const char *str;
apr_size_t n;
if (!fd) {
if (last_merged_bucket) {
temp_brig = b;
b = bb;
f->c->bucket_alloc);
while (temp != e) {
apr_bucket *d;
d = temp;
nvec = 0;
nbytes = 0;
nvec++;
nvec++;
e = temp;
last_e = e;
nvec++;
nbytes += n;
const char *str;
apr_size_t n;
return HTTP_INTERNAL_SERVER_ERROR;
return APR_SUCCESS;
if (fd) {
#if APR_HAS_SENDFILE
if (nvec) {
if (nvec_trailers) {
#if APR_HAS_SENDFILE
if (more)
return APR_SUCCESS;
b = more;
return APR_SUCCESS;
return OK;
return OK;
&core_module);
if (filters) {
if (filters) {
return APR_SUCCESS;
return num_request_notes++;
return NULL;
if (!req_cfg) {
return NULL;
sizeof(void *) * num_request_notes);
if (r->main) {
if (!r->prev) {
return OK;
!= APR_SUCCESS) {
return NULL;
!= APR_SUCCESS) {
return NULL;
net->c = c;
return DONE;