mod_mime.c revision 2c36f8e0f0d10035ccebf08864856e50eb6bb238
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder/* ====================================================================
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * The Apache Software License, Version 1.1
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * Redistribution and use in source and binary forms, with or without
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * modification, are permitted provided that the following conditions
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * 1. Redistributions of source code must retain the above copyright
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * notice, this list of conditions and the following disclaimer.
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * 2. Redistributions in binary form must reproduce the above copyright
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * notice, this list of conditions and the following disclaimer in
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * the documentation and/or other materials provided with the
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * distribution.
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * 3. The end-user documentation included with the redistribution,
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * if any, must include the following acknowledgment:
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * "This product includes software developed by the
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * Apache Software Foundation (http://www.apache.org/)."
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * Alternately, this acknowledgment may appear in the software itself,
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * if and wherever such third-party acknowledgments normally appear.
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * 4. The names "Apache" and "Apache Software Foundation" must
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * not be used to endorse or promote products derived from this
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * software without prior written permission. For written
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * permission, please contact apache@apache.org.
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * 5. Products derived from this software may not be called "Apache",
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * nor may "Apache" appear in their name, without prior written
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * permission of the Apache Software Foundation.
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
770abb9d4554f378acbae393b25f8687eeeb3ad0Christian Maeder * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
79e28be65fd0bc65adf266d5ae4f6deb92546bf7Christian Maeder * SUCH DAMAGE.
79e28be65fd0bc65adf266d5ae4f6deb92546bf7Christian Maeder * ====================================================================
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * This software consists of voluntary contributions made by many
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * individuals on behalf of the Apache Software Foundation. For more
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * information on the Apache Software Foundation, please see
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * Portions of this software are based upon public domain software
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * originally written at the National Center for Supercomputing Applications,
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * University of Illinois, Urbana-Champaign.
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * http_mime.c: Sends/gets MIME headers for requests
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder/* XXXX - fix me / EBCDIC
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * there was a cludge here which would use its
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * own version apr_isascii(). Indicating that
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder * on some platforms that might be needed.
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * #define OS_ASC(c) (c) -- for mere mortals
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * #define OS_ASC(c) (ebcdic2ascii[c]) -- for dino's
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder * #define apr_isascii(c) ((OS_ASC(c) & 0x80) == 0)
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder/* XXXXX - fix me - See note with NOT_PROXY
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maedertypedef struct attrib_info {
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder/* Information to which an extension can be mapped
1ba51e89f63278f541a547315926a05f92c676ffChristian Maeder char *forced_type; /* Additional AddTyped stuff */
1ba51e89f63278f541a547315926a05f92c676ffChristian Maeder char *encoding_type; /* Added with AddEncoding... */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder char *language_type; /* Added with AddLanguage... */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder char *handler; /* Added with AddHandler... */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder char *charset_type; /* Added with AddCharset... */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder int copy; /* To avoid dupping in the merge */
79e28be65fd0bc65adf266d5ae4f6deb92546bf7Christian Maedertypedef struct {
79e28be65fd0bc65adf266d5ae4f6deb92546bf7Christian Maeder apr_hash_t *extension_mappings; /* Map from extension name to
79e28be65fd0bc65adf266d5ae4f6deb92546bf7Christian Maeder * extension_info structure */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder int copy_mappings; /* To avoid dupping in the merge */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder apr_array_header_t *handlers_remove; /* List of handlers to remove */
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder apr_array_header_t *types_remove; /* List of MIME types to remove */
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maeder apr_array_header_t *encodings_remove; /* List of encodings to remove */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder char *type; /* Type forced with ForceType */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder char *handler; /* Handler forced with SetHandler */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder char *default_language; /* Language if no AddLanguage ext found */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder /* Due to the FUD about JS and charsets
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder * default_charset is actually in src/main */
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maedertypedef struct param_s {
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maedertypedef struct {
5b55761e0df088c5b41183fb83106bfd02a61fa2Christian Maederstatic char tspecial[] = {
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maederstatic void *create_mime_dir_config(apr_pool_t *p, char *dummy)
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder (mime_dir_config *) apr_palloc(p, sizeof(mime_dir_config));
89026e63176e6e40c7be1bbc542326f0d29d8108Christian Maeder new->extension_mappings = apr_hash_make(p);
8ab0f7627987d45eb3fe36845a91694977ca5cdbChristian Maeder * Overlay one hash table of extension_mappings onto another
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maederstatic void overlay_extension_mappings(apr_pool_t *p,
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder for (index = apr_hash_first(p, overlay); index;
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder apr_hash_this(index, (const void**)&key, &klen, (void**)&overlay_info);
57dc8a87418e235e3d0621fb90728054044a9ef9Christian Maeder base_info = (extension_info*)apr_hash_get(base, key, klen);
if (base_info) {
if (exinfo) {
if (exinfo) {
if (exinfo) {
return new;
const char* ext)
#ifdef CASE_BLIND_FILESYSTEM
++key;
if (!exinfo) {
return exinfo;
const char *ext)
return NULL;
const char *ext)
return NULL;
const char *ext)
return NULL;
const char *ext)
return NULL;
const char *ext)
return NULL;
const char* ext)
++ext;
#ifdef CASE_BLIND_FILESYSTEM
return NULL;
return NULL;
return NULL;
const char *arg)
(void *)arg);
return NULL;
{NULL}
ap_configfile_t *f;
char l[MAX_STRING_LEN];
if (!types_confname)
while (ll[0]) {
ap_cfg_closefile(f);
static char *zap_sp(char *s)
char *tp;
if (s == NULL) {
return (NULL);
static int is_token(char c)
int res;
return res;
static int is_qtext(char c)
int res;
return res;
static int is_quoted_pair(char *s)
if (apr_isascii(c)) {
return (res);
int quoted = 0;
(const char *) mp);
return (NULL);
return (NULL);
cp++;
return (NULL);
return (ctp);
cp++;
return (NULL);
cp++;
cp++;
return (NULL);
cp++;
return (NULL);
return (NULL);
cp++;
quoted = 0;
if (quoted > 0) {
cp++;
cp++;
cp++;
return(NULL);
quoted = 0;
return (NULL);
cp++;
return (NULL);
return (NULL);
quoted = 0;
cp++;
return (ctp);
char *ext;
const char *type;
return OK;
++fn;
int found = 0;
#ifdef CASE_BLIND_FILESYSTEM
APR_HASH_KEY_STRING))) {
const char **new;
if (!r->content_languages)
if (!r->content_encoding)
if (!found)
(void *)exception_list);
if (r->content_type) {
char *ct;
int override = 0;
if (!override) {
NULL);
NULL);
NULL);
const char **new;
if (!r->content_languages)
/* Check for overrides with ForceType/SetHandler */
if (!r->content_type)
return DECLINED;
return OK;