http_core.c revision 428e49b7e5886f1f0a47c1e00fc9cc7cd0b33b52
76318284fc970b30e9dc4c079960807345331dadLennart Poettering/* ====================================================================
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * The Apache Software License, Version 1.1
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * Copyright (c) 2000 The Apache Software Foundation. All rights
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * Redistribution and use in source and binary forms, with or without
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * modification, are permitted provided that the following conditions
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * 1. Redistributions of source code must retain the above copyright
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * notice, this list of conditions and the following disclaimer.
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * 2. Redistributions in binary form must reproduce the above copyright
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * notice, this list of conditions and the following disclaimer in
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering * the documentation and/or other materials provided with the
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * distribution.
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * 3. The end-user documentation included with the redistribution,
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * if any, must include the following acknowledgment:
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * "This product includes software developed by the
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * Apache Software Foundation (http://www.apache.org/)."
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * Alternately, this acknowledgment may appear in the software itself,
76318284fc970b30e9dc4c079960807345331dadLennart Poettering * if and wherever such third-party acknowledgments normally appear.
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * 4. The names "Apache" and "Apache Software Foundation" must
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * not be used to endorse or promote products derived from this
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * software without prior written permission. For written
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * permission, please contact apache@apache.org.
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * 5. Products derived from this software may not be called "Apache",
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * nor may "Apache" appear in their name, without prior written
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * permission of the Apache Software Foundation.
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * ====================================================================
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * This software consists of voluntary contributions made by many
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * individuals on behalf of the Apache Software Foundation. For more
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * information on the Apache Software Foundation, please see
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * Portions of this software are based upon public domain software
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * originally written at the National Center for Supercomputing Applications,
5aded369782f28255bc6b494ca905d7acaea7a56Zbigniew Jędrzejewski-Szmek * University of Illinois, Urbana-Champaign.
74a6d87d0cd1f2213869e168b6ca55eded6f4ae8Zbigniew Jędrzejewski-Szmek#include "http_protocol.h" /* For index_of_response(). Grump. */
74a6d87d0cd1f2213869e168b6ca55eded6f4ae8Zbigniew Jędrzejewski-Szmek#include "http_main.h" /* For the default_handler below... */
b5c7d097ec7d16facaaeb0da5ba2abb2b1fc230bZbigniew Jędrzejewski-Szmek/* Make sure we don't write less than 4096 bytes at any one time.
b5c7d097ec7d16facaaeb0da5ba2abb2b1fc230bZbigniew Jędrzejewski-Szmek/* Allow Apache to use ap_mmap */
b5c7d097ec7d16facaaeb0da5ba2abb2b1fc230bZbigniew Jędrzejewski-Szmek/* mmap support for static files based on ideas from John Heidemann's
b5c7d097ec7d16facaaeb0da5ba2abb2b1fc230bZbigniew Jędrzejewski-Szmek * patch against 1.0.5. See
b5c7d097ec7d16facaaeb0da5ba2abb2b1fc230bZbigniew Jędrzejewski-Szmek * <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
3b5cfcdb580f5b766ff7fb1a2839bd37d74a98deZbigniew Jędrzejewski-Szmek/* Files have to be at least this big before they're mmap()d. This is to deal
3b5cfcdb580f5b766ff7fb1a2839bd37d74a98deZbigniew Jędrzejewski-Szmek * with systems where the expense of doing an mmap() and an munmap() outweighs
3b5cfcdb580f5b766ff7fb1a2839bd37d74a98deZbigniew Jędrzejewski-Szmek * the benefit for small files. It shouldn't be set lower than 1.
3b5cfcdb580f5b766ff7fb1a2839bd37d74a98deZbigniew Jędrzejewski-Szmek #endif /* SUNOS4 */
3b5cfcdb580f5b766ff7fb1a2839bd37d74a98deZbigniew Jędrzejewski-Szmek#endif /* MMAP_THRESHOLD */
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk#endif /* USE_MMAP_FILES */
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk/* LimitXMLRequestBody handling */
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk#define AP_DEFAULT_LIMIT_XML_BODY ((size_t)1000000)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk/* Server core module... This module provides support for really basic
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * server operations, including options and commands which control the
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * operation of other modules. Consider this the bureaucracy module.
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * The core module also defines handlers, etc., do handle just enough
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * to allow a server with the core module ONLY to actually serve documents
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * (though it slaps DefaultType on all of 'em); this was useful in testing,
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * but may not be worth preserving.
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * This file could almost be mod_core.c, except for the stuff which affects
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * the http_conf_globals.
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerkstatic void *create_core_dir_config(apr_pool_t *a, char *dir)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf = (core_dir_config *)apr_pcalloc(a, sizeof(core_dir_config));
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->d_is_fnmatch = conf->d ? (apr_is_fnmatch(conf->d) != 0) : 0;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->d_components = conf->d ? ap_count_dirs(conf->d) : 0;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts = dir ? OPT_UNSET : OPT_UNSET|OPT_ALL;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts_add = conf->opts_remove = OPT_NONE;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->override = dir ? OR_UNSET : OR_UNSET|OR_ALL;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->use_canonical_name = USE_CANONICAL_NAME_UNSET;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->sec = apr_make_array(a, 2, sizeof(void *));
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->script_interpreter_source = INTERPRETER_SOURCE_UNSET;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->add_default_charset = ADD_DEFAULT_CHARSET_UNSET;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk return (void *)conf;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerkstatic void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk core_dir_config *base = (core_dir_config *)basev;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk core_dir_config *new = (core_dir_config *)newv;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf = (core_dir_config *)apr_palloc(a, sizeof(core_dir_config));
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk memcpy((char *)conf, (const char *)base, sizeof(core_dir_config));
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk apr_palloc(a, sizeof(*conf->response_code_strings)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk memcpy(conf->response_code_strings, base->response_code_strings,
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk sizeof(*conf->response_code_strings) * RESPONSE_CODES);
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek /* there was no explicit setting of new->opts, so we merge
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * preserve the invariant (opts_add & opts_remove) == 0
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts_remove = (conf->opts_remove & ~new->opts_add)
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add;
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES)) {
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES;
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek /* otherwise we just copy, because an explicit opts setting
aa1169774bbd61761965d826fe36bd071ec78656Johan Ouwerkerk * overrides all earlier +/- modifiers
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->opts_remove = new->opts_remove;
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek if (!(new->override & OR_UNSET)) {
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->ap_auth_type = new->ap_auth_type;
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->ap_auth_name = new->ap_auth_name;
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->ap_requires = new->ap_requires;
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek if (new->response_code_strings) {
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek if (conf->response_code_strings == NULL) {
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek conf->response_code_strings = apr_palloc(a,
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek sizeof(*conf->response_code_strings) * RESPONSE_CODES);
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek memcpy(conf->response_code_strings, new->response_code_strings,
20089f95e83dd6a3e9238b3448ce2e55536184ffZbigniew Jędrzejewski-Szmek sizeof(*conf->response_code_strings) * RESPONSE_CODES);
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers for (i = 0; i < RESPONSE_CODES; ++i) {
2cc8d9731aff3e401bc6a5a243f20fec123d48e6Zbigniew Jędrzejewski-Szmek if (new->hostname_lookups != HOSTNAME_LOOKUP_UNSET) {
2cc8d9731aff3e401bc6a5a243f20fec123d48e6Zbigniew Jędrzejewski-Szmek conf->hostname_lookups = new->hostname_lookups;
702f64b93cb215d43f673dd4b2f3646b879c566eZbigniew Jędrzejewski-Szmek if ((new->do_rfc1413 & 2) == 0) {
702f64b93cb215d43f673dd4b2f3646b879c566eZbigniew Jędrzejewski-Szmek conf->do_rfc1413 = new->do_rfc1413;
702f64b93cb215d43f673dd4b2f3646b879c566eZbigniew Jędrzejewski-Szmek if ((new->content_md5 & 2) == 0) {
702f64b93cb215d43f673dd4b2f3646b879c566eZbigniew Jędrzejewski-Szmek conf->content_md5 = new->content_md5;
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers if (new->use_canonical_name != USE_CANONICAL_NAME_UNSET) {
ecca17f6eec83b58f39ff5dc7894044c524ddf41Kay Sievers conf->use_canonical_name = new->use_canonical_name;
909f413d3c572baadf9b13e36e1e90beba42af86Zbigniew Jędrzejewski-Szmek conf->limit_cpu = new->limit_cpu;
76318284fc970b30e9dc4c079960807345331dadLennart Poettering#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS)
#ifdef RLIMIT_NPROC
#ifdef WIN32
return (void*)conf;
#ifdef GPROF
return (void *)conf;
return conf;
&core_module);
&core_module);
#ifdef HAVE_DRIVE_LETTERS
struct reorder_sort_rec {
void *elt;
int orig_index;
int nelts;
void **elts;
for (i = 0; i < nelts; ++i) {
for (i = 0; i < nelts; ++i) {
&core_module);
&core_module);
&core_module);
&core_module);
&core_module);
&core_module);
&core_module);
&core_module);
return NULL;
if (hptr) {
char **haddr;
int type)
int hostname_lookups;
if (dir_config) {
return NULL;
return NULL;
&core_module);
return NULL;
core_dir_config *d;
&core_module);
AF_INET);
unsigned port;
core_dir_config *d =
: port;
return port;
request_rec *r)
core_dir_config *d =
return d->limit_req_body;
#ifdef WIN32
return result;
if (size) {
return result;
int size;
int result;
char *buffer;
if (!ext)
return NULL;
&hkeyType);
return NULL;
if (cmdOfName) {
if (cmdOfName)
return NULL;
++*arguments;
return buffer;
char** interpreter,
char** arguments)
core_dir_config *d;
&core_module);
if (!exename) {
if (!exename) {
exename++;
if (comspec) {
return eFileTypeSCRIPT;
return eFileTypeUNKNOWN;
if (*interpreter)
return eFileTypeSCRIPT;
return eFileTypeUNKNOWN;
return eFileTypeUNKNOWN;
return eFileTypeUNKNOWN;
return fileType;
* Commands... this module handles almost all of the NCSA httpd.conf
* commands, but most of the old srm.conf is in the the modules.
const char *what)
return dirp;
return NULL;
unsigned forbidden)
return NULL;
const char *arg)
return err;
return NULL;
#ifdef GPROF
return err;
return NULL;
return err;
return NULL;
const char *arg)
return err;
arg);
return NULL;
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;
return NULL;
require_line *r;
if (!c->ap_requires) {
return NULL;
const char *arg) {
int limited = 0;
const char *errmsg;
return err;
while (limited_methods[0]) {
char **xmethod;
if (!tog) {
return errmsg;
#ifdef WIN32
#define USE_ICASE 0
const char *errmsg;
return err;
&core_module);
return errmsg;
conf->r = r;
return NULL;
const char *errmsg;
return err;
&core_module);
return errmsg;
conf->r = r;
return NULL;
const char *errmsg;
return err;
if (!old_path) {
&core_module);
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;
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;
#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;
core_dir_config *d =
#ifdef USE_MMAP_FILES
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;
return HTTP_FORBIDDEN;
ap_set_etag(r);
return errstatus;
#ifdef CHARSET_EBCDIC
ap_checkconv(r);
#ifdef USE_MMAP_FILES
#ifdef APACHE_XLATE
if (!r->header_only) {
if (!rangestatus) {
return HTTP_INTERNAL_SERVER_ERROR;
#ifdef USE_MMAP_FILES
unsigned char *addr;
#ifdef APACHE_XLATE
if (!r->header_only) {
if (!rangestatus) {
return OK;
ap_bucket *e;
if (bytes == 0) {
return APR_SUCCESS;
AP_BRIGADE_INSERT_HEAD(b, e);
if (eos) {
AP_BRIGADE_INSERT_TAIL(b, e);
ap_bucket *e;
int eos = 0;
AP_BRIGADE_FOREACH(e, b) {
const char *data;
return rv;
return rv;
return APR_SUCCESS;
request_rec *r = f->r;
ap_bucket *e;
const char *str;
b = ap_get_saved_data(f, &b);
while (dptr) {
ap_save_data_to_filter(f, &b);
AP_BRIGADE_FOREACH(e, b) {
return rv;
return rv;
return APR_SUCCESS;
{ return DEFAULT_HTTP_PORT; }
static void register_hooks(void)