mod_mime.c revision b2c2c8a4bc977c0a6bb937af995efc56dc3879a3
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* ====================================================================
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * The Apache Software License, Version 1.1
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen *
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen * reserved.
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen *
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * Redistribution and use in source and binary forms, with or without
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen * modification, are permitted provided that the following conditions
b7f14c9568e7edc75d1d7fd86751c02bc97cde3eTimo Sirainen * are met:
436adac819e7cbeef04af08dcc6a4f3ecd4a1d9eMartti Rannanjärvi *
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * 1. Redistributions of source code must retain the above copyright
57e3b63a75335f45cf6cf9cd89317e2e6cec249dStephan Bosch * notice, this list of conditions and the following disclaimer.
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen * 2. Redistributions in binary form must reproduce the above copyright
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen * notice, this list of conditions and the following disclaimer in
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * the documentation and/or other materials provided with the
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * distribution.
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen *
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen * 3. The end-user documentation included with the redistribution,
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * if any, must include the following acknowledgment:
7c3f90095b4168d89a268ac1ec820c5925d48fd3Timo Sirainen * "This product includes software developed by the
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * Apache Software Foundation (http://www.apache.org/)."
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * Alternately, this acknowledgment may appear in the software itself,
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen * if and wherever such third-party acknowledgments normally appear.
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen *
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen * 4. The names "Apache" and "Apache Software Foundation" must
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen * not be used to endorse or promote products derived from this
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen * software without prior written permission. For written
31be5ed1551c98cddeb2295a594f010aaf4b76bcTimo Sirainen * permission, please contact apache@apache.org.
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen *
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * 5. Products derived from this software may not be called "Apache",
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * nor may "Apache" appear in their name, without prior written
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * permission of the Apache Software Foundation.
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen *
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * SUCH DAMAGE.
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * ====================================================================
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen *
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * This software consists of voluntary contributions made by many
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * individuals on behalf of the Apache Software Foundation. For more
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * information on the Apache Software Foundation, please see
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * <http://www.apache.org/>.
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen *
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * Portions of this software are based upon public domain software
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * originally written at the National Center for Supercomputing Applications,
147a788fea2a88f7125b27226451271d55cf5b01Timo Sirainen * University of Illinois, Urbana-Champaign.
147a788fea2a88f7125b27226451271d55cf5b01Timo Sirainen */
147a788fea2a88f7125b27226451271d55cf5b01Timo Sirainen
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen/*
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen * http_mime.c: Sends/gets MIME headers for requests
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen *
6e8f0036cad59d1d6bcd9ef69bfe712d01656ca3Timo Sirainen * Rob McCool
6e8f0036cad59d1d6bcd9ef69bfe712d01656ca3Timo Sirainen *
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen */
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen
5df33e9ee65eec194105b338c55dedbf8422f695Timo Sirainen#include "apr.h"
4cce36128569c68a999e98c9034bfb1bc177f1ffTimo Sirainen#include "apr_strings.h"
4cce36128569c68a999e98c9034bfb1bc177f1ffTimo Sirainen#include "apr_lib.h"
4cce36128569c68a999e98c9034bfb1bc177f1ffTimo Sirainen#include "apr_hash.h"
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#define APR_WANT_STRFUNC
21a2a03602a45b1c74f2dfa80ee972b481da8c2aTimo Sirainen#include "apr_want.h"
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#include "ap_config.h"
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen#include "httpd.h"
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen#include "http_config.h"
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen#include "http_log.h"
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen#include "http_request.h"
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen/* XXXX - fix me / EBCDIC
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen * there was a cludge here which would use its
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen * own version apr_isascii(). Indicating that
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen * on some platforms that might be needed.
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen *
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen * #define OS_ASC(c) (c) -- for mere mortals
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen * or
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen * #define OS_ASC(c) (ebcdic2ascii[c]) -- for dino's
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen *
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen * #define apr_isascii(c) ((OS_ASC(c) & 0x80) == 0)
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen */
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen
c147bff818798a979d93537f72f5c1f68f5d5ba8Aki Tuomi/* XXXXX - fix me - See note with NOT_PROXY
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen */
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainentypedef struct attrib_info {
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen char *name;
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen int offset;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen} attrib_info;
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen/* Information to which an extension can be mapped
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen */
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainentypedef struct extension_info {
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen char *forced_type; /* Additional AddTyped stuff */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen char *encoding_type; /* Added with AddEncoding... */
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen char *language_type; /* Added with AddLanguage... */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen char *handler; /* Added with AddHandler... */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen char *charset_type; /* Added with AddCharset... */
7522446d6514e5593c9d4d7e4beacd328301cb23Aki Tuomi char *input_filters; /* Added with AddInputFilter... */
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen char *output_filters; /* Added with AddOutputFilter... */
46114180b41dc7cac5e7b0242ad347b4acdbaa5aTimo Sirainen} extension_info;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainentypedef struct {
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen apr_hash_t *extension_mappings; /* Map from extension name to
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen * extension_info structure */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen apr_array_header_t *remove_mappings; /* A simple list, walked once */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen char *type; /* Type forced with ForceType */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen char *handler; /* Handler forced with SetHandler */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen char *default_language; /* Language if no AddLanguage ext found */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen /* Due to the FUD about JS and charsets
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen * default_charset is actually in src/main */
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen} mime_dir_config;
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen
884228e5496378bada39a932db67aa3d9478198fTimo Sirainentypedef struct param_s {
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen char *attr;
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen char *val;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen struct param_s *next;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen} param;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainentypedef struct {
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen char *type;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen char *subtype;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen param *param;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen} content_type;
1b4441e3e6f9e78ebeae8218de971959cd55bf60Timo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainenstatic char tspecial[] = {
6e0054c2e5efc526df6287da368335680a856714Timo Sirainen '(', ')', '<', '>', '@', ',', ';', ':',
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen '\\', '"', '/', '[', ']', '?', '=',
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen '\0'
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
6e0054c2e5efc526df6287da368335680a856714Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenmodule AP_MODULE_DECLARE_DATA mime_module;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
6e0054c2e5efc526df6287da368335680a856714Timo Sirainenstatic void *create_mime_dir_config(apr_pool_t *p, char *dummy)
6e0054c2e5efc526df6287da368335680a856714Timo Sirainen{
1b4441e3e6f9e78ebeae8218de971959cd55bf60Timo Sirainen mime_dir_config *new =
1b4441e3e6f9e78ebeae8218de971959cd55bf60Timo Sirainen (mime_dir_config *) apr_palloc(p, sizeof(mime_dir_config));
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen new->extension_mappings = NULL;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen new->remove_mappings = NULL;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen new->type = NULL;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen new->handler = NULL;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen new->default_language = NULL;
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen return new;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen}
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen/*
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen * Overlay one hash table of extension_mappings onto another
0206dc57f2c04da69599dea5816235cfeb2b897aMartti Rannanjärvi */
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainenstatic void overlay_extension_mappings(apr_pool_t *p,
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen apr_hash_t *overlay, apr_hash_t *base)
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen{
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen apr_hash_index_t *index;
489301ee88b2174e3171875e979e667de2c4a174Timo Sirainen for (index = apr_hash_first(p, overlay); index;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen index = apr_hash_next(index)) {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen char *key;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen apr_ssize_t klen;
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen extension_info *overlay_info, *base_info;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen apr_hash_this(index, (const void**)&key, &klen, (void**)&overlay_info);
d9a7e950a9cd21f2b4a90ec7759fca9e8fcc7995Timo Sirainen
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen base_info = (extension_info*)apr_hash_get(base, key, klen);
3281669db44d09a087a203201248abbc81b3cc1aTimo Sirainen
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen if (base_info) {
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen extension_info *copyinfo = base_info;
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen base_info = (extension_info*)apr_palloc(p, sizeof(*base_info));
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen apr_hash_set(base, key, klen, base_info);
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen memcpy(base_info, copyinfo, sizeof(*base_info));
8e361d2906b0e44f7175a20981f8d2280645b58bTimo Sirainen
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainen if (overlay_info->forced_type) {
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen base_info->forced_type = overlay_info->forced_type;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (overlay_info->encoding_type) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen base_info->encoding_type = overlay_info->encoding_type;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
a39292e6410a30805b020acf4fc916210ae54e86Timo Sirainen if (overlay_info->language_type) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen base_info->language_type = overlay_info->language_type;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen if (overlay_info->handler) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen base_info->handler = overlay_info->handler;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if (overlay_info->charset_type) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen base_info->charset_type = overlay_info->charset_type;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen else {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen apr_hash_set(base, key, klen, overlay_info);
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen }
0737a4fe0b83a05f335a8ad02e833b62565a36daTimo Sirainen}
0737a4fe0b83a05f335a8ad02e833b62565a36daTimo Sirainen
0737a4fe0b83a05f335a8ad02e833b62565a36daTimo Sirainen/* Member is the offset within an extension_info of the pointer to reset
0737a4fe0b83a05f335a8ad02e833b62565a36daTimo Sirainen */
0737a4fe0b83a05f335a8ad02e833b62565a36daTimo Sirainenstatic void remove_items(apr_pool_t *p, apr_array_header_t *remove,
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen apr_hash_t *mappings)
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen{
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen attrib_info *suffix = (attrib_info *) remove->elts;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen int i;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen for (i = 0; i < remove->nelts; i++) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen extension_info *exinfo =
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen (extension_info*)apr_hash_get(mappings,
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen suffix[i].name,
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen APR_HASH_KEY_STRING);
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if (exinfo && *(const char**)((char *)exinfo + suffix[i].offset)) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen extension_info *copyinfo = exinfo;
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo));
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen apr_hash_set(mappings, suffix[i].name,
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen APR_HASH_KEY_STRING, exinfo);
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen memcpy(exinfo, copyinfo, sizeof(*exinfo));
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen *(const char**)((char *)exinfo + suffix[i].offset) = NULL;
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
817d027593510c3ba70ad542ce0011f5f6916d1eTimo Sirainen}
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen
439980f88f421039dea8335e92d3fa82b3f470a1Timo Sirainenstatic void *merge_mime_dir_configs(apr_pool_t *p, void *basev, void *addv)
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen{
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen mime_dir_config *base = (mime_dir_config *) basev;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen mime_dir_config *add = (mime_dir_config *) addv;
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen mime_dir_config *new = apr_palloc(p, sizeof(mime_dir_config));
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen if (base->extension_mappings && add->extension_mappings) {
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen new->extension_mappings = apr_hash_make(p);
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen overlay_extension_mappings(p, base->extension_mappings,
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainen new->extension_mappings);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen overlay_extension_mappings(p, add->extension_mappings,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen new->extension_mappings);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen }
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen else {
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek if (base->extension_mappings == NULL) {
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen new->extension_mappings = add->extension_mappings;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen }
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen else {
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen new->extension_mappings = base->extension_mappings;
ca98d6a1bbe73499da758a36bfab2963375c8d06Timo Sirainen }
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen /* We may not be merging the tables, but if we potentially will change
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen * an exinfo member, then we are about to trounce it anyways.
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen * We must have a copy for safety.
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen */
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen if (new->extension_mappings && add->remove_mappings) {
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen apr_hash_t *copyhash = new->extension_mappings;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen new->extension_mappings = apr_hash_make(p);
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek overlay_extension_mappings(p, copyhash, new->extension_mappings);
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen }
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen }
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen if (new->extension_mappings) {
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen if (add->remove_mappings)
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen remove_items(p, add->remove_mappings, new->extension_mappings);
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen }
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen new->remove_mappings = NULL;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen new->type = add->type ? add->type : base->type;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen new->handler = add->handler ? add->handler : base->handler;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen new->default_language = add->default_language ?
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen add->default_language : base->default_language;
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen
f46885a5b78b15a8d2419f6e5d13b643bd85e41fTimo Sirainen return new;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen}
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipekstatic const char *add_extension_info(cmd_parms *cmd, void *m_,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *value_, const char* ext)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen{
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mime_dir_config *m=m_;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen extension_info *exinfo;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen int offset = (int) (long) cmd->info;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen char *key = apr_pstrdup(cmd->temp_pool, ext);
c6eca51b54586c1f37cfe39e38c844da3f937a4dTimo Sirainen char *value = apr_pstrdup(cmd->pool, value_);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ap_str_tolower(value);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen#ifdef CASE_BLIND_FILESYSTEM
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen ap_str_tolower(key);
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen#endif
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (*key == '.')
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen ++key;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!m->extension_mappings) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen m->extension_mappings = apr_hash_make(cmd->pool);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen exinfo = NULL;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen else
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen exinfo = (extension_info*)apr_hash_get(m->extension_mappings, key,
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen APR_HASH_KEY_STRING);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (!exinfo) {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen exinfo = apr_pcalloc(cmd->pool, sizeof(extension_info));
31a574fda352ef4f71dbff9c30e15e4744e132c0Timo Sirainen key = apr_pstrdup(cmd->pool, key);
c6eca51b54586c1f37cfe39e38c844da3f937a4dTimo Sirainen apr_hash_set(m->extension_mappings, key,
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen APR_HASH_KEY_STRING, exinfo);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen *(const char**)((char *)exinfo + offset) = value;
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen return NULL;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen}
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen/*
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen * Note handler names are un-added with each per_dir_config merge.
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen * This keeps the association from being inherited, but not
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen * from being re-added at a subordinate level.
cd83124e5d070a016c590bb0b1096d7828c7b6adTimo Sirainen */
3fe9483b2b412a14493e3120751b0e99ecfe9388Timo Sirainenstatic const char *remove_extension_info(cmd_parms *cmd, void *m_,
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen const char *ext)
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen{
a757f31393b9d6fc7760a9dec8363404ab3ae576Timo Sirainen mime_dir_config *m = (mime_dir_config *) m_;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen attrib_info *suffix;
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen if (*ext == '.')
c0225f7f6b43d34dc58c17d3304f0fd60ab89894Timo Sirainen ++ext;
645f258ea29afaf09b673fc65d1bd788dfec8db8Timo Sirainen if (!m->remove_mappings) {
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek m->remove_mappings = apr_array_make(cmd->pool, 4, sizeof(*suffix));
645f258ea29afaf09b673fc65d1bd788dfec8db8Timo Sirainen }
645f258ea29afaf09b673fc65d1bd788dfec8db8Timo Sirainen suffix = (attrib_info *) apr_array_push(m->remove_mappings);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen suffix->name = apr_pstrdup(cmd->pool, ext);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#ifdef CASE_BLIND_FILESYSTEM
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen ap_str_tolower(suffix->name);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen#endif
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen suffix->offset = (int) (long) cmd->info;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen return NULL;
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen}
02b78558dc03daa2e7da2010b63f247b49936a38Timo Sirainen
02b78558dc03daa2e7da2010b63f247b49936a38Timo Sirainen/* The sole bit of server configuration that the MIME module has is
02b78558dc03daa2e7da2010b63f247b49936a38Timo Sirainen * the name of its config file, so...
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen */
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainenstatic const char *set_types_config(cmd_parms *cmd, void *dummy,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen const char *arg)
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen{
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen ap_set_module_config(cmd->server->module_config, &mime_module,
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen (void *)arg);
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen return NULL;
49f65b7c797515d787bcbc9cbeb78f0c21b1b282Timo Sirainen}
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainenstatic const command_rec mime_cmds[] =
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen{
e8a59a1671127f87e2d22f42e84c572f28299d81Timo SirainenAP_INIT_ITERATE2("AddCharset", add_extension_info,
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen (void *)APR_XtOffsetOf(extension_info, charset_type), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "a charset (e.g., iso-2022-jp), followed by one or more file extensions"),
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo SirainenAP_INIT_ITERATE2("AddEncoding", add_extension_info,
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek (void *)APR_XtOffsetOf(extension_info, encoding_type), OR_FILEINFO,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen "an encoding (e.g., gzip), followed by one or more file extensions"),
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo SirainenAP_INIT_ITERATE2("AddHandler", add_extension_info,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen (void *)APR_XtOffsetOf(extension_info, handler), OR_FILEINFO,
1d5f06e1f3226cf07d1521cee1b6b14744845273Timo Sirainen "a handler name followed by one or more file extensions"),
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo SirainenAP_INIT_ITERATE2("AddInputFilter", add_extension_info,
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen (void *)APR_XtOffsetOf(extension_info, input_filters), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "a handler name followed by one or more file extensions"),
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo SirainenAP_INIT_ITERATE2("AddLanguage", add_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, language_type), OR_FILEINFO,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen "a language (e.g., fr), followed by one or more file extensions"),
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo SirainenAP_INIT_ITERATE2("AddOutputFilter", add_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, output_filters), OR_FILEINFO,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "a mime type followed by one or more file extensions"),
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo SirainenAP_INIT_ITERATE2("AddType", add_extension_info,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen (void *)APR_XtOffsetOf(extension_info, forced_type), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "a mime type followed by one or more file extensions"),
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo SirainenAP_INIT_TAKE1("DefaultLanguage", ap_set_string_slot,
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek (void*)APR_XtOffsetOf(mime_dir_config, default_language), OR_FILEINFO,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen "language to use for documents with no other language file extension"),
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo SirainenAP_INIT_TAKE1("ForceType", ap_set_string_slot_lower,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen (void *)APR_XtOffsetOf(mime_dir_config, type), OR_FILEINFO,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen "a media type"),
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo SirainenAP_INIT_ITERATE("RemoveCharset", remove_extension_info,
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen (void *)APR_XtOffsetOf(extension_info, charset_type), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "one or more file extensions"),
83bb013a99f0936995f9c7a1077822662d8fefdbTimo SirainenAP_INIT_ITERATE("RemoveEncoding", remove_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, encoding_type), OR_FILEINFO,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen "one or more file extensions"),
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo SirainenAP_INIT_ITERATE("RemoveHandler", remove_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, handler), OR_FILEINFO,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "one or more file extensions"),
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo SirainenAP_INIT_ITERATE("RemoveInputFilter", remove_extension_info,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen (void *)APR_XtOffsetOf(extension_info, input_filters), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "one or more file extensions"),
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo SirainenAP_INIT_ITERATE("RemoveLanguage", remove_extension_info,
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen (void *)APR_XtOffsetOf(extension_info, language_type), OR_FILEINFO,
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen "one or more file extensions"),
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo SirainenAP_INIT_ITERATE("RemoveOutputFilter", remove_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, output_filters), OR_FILEINFO,
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen "one or more file extensions"),
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo SirainenAP_INIT_ITERATE("RemoveType", remove_extension_info,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(extension_info, forced_type), OR_FILEINFO,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "one or more file extensions"),
f7f16d4fa869337c15e41becab24fece11620f01Timo SirainenAP_INIT_TAKE1("SetHandler", ap_set_string_slot_lower,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen (void *)APR_XtOffsetOf(mime_dir_config, handler), OR_FILEINFO,
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen "a handler name"),
f7f16d4fa869337c15e41becab24fece11620f01Timo SirainenAP_INIT_TAKE1("TypesConfig", set_types_config, NULL, RSRC_CONF,
f7f16d4fa869337c15e41becab24fece11620f01Timo Sirainen "the MIME types config file"),
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen {NULL}
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen};
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainenstatic apr_hash_t *mime_type_extensions;
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainenstatic void mime_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen{
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen ap_configfile_t *f;
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen char l[MAX_STRING_LEN];
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const char *types_confname = ap_get_module_config(s->module_config, &mime_module);
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen apr_status_t status;
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (!types_confname)
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen types_confname = AP_TYPES_CONFIG_FILE;
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen types_confname = ap_server_root_relative(p, types_confname);
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen if ((status = ap_pcfg_openfile(&f, ptemp, types_confname)) != APR_SUCCESS) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen ap_log_error(APLOG_MARK, APLOG_ERR, status, s,
e192a3b1ca8ae857e7d87298ea507d32977ba570Timo Sirainen "could not open mime types config file %s.", types_confname);
7a1090f7f238b73b4e06f23f6ea7b7c8184fc630Timo Sirainen exit(1);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen mime_type_extensions = apr_hash_make(p);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) {
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen const char *ll = l, *ct;
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen if (l[0] == '#')
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen continue;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen ct = ap_getword_conf(p, &ll);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen while (ll[0]) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen char *ext = ap_getword_conf(p, &ll);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen ap_str_tolower(ext); /* ??? */
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen apr_hash_set(mime_type_extensions, ext, APR_HASH_KEY_STRING, ct);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen ap_cfg_closefile(f);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen}
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenstatic char *zap_sp(char *s)
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen{
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen char *tp;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
444c9a022d902abd0539a68d2efef83483b8a8d9Timo Sirainen if (s == NULL) {
444c9a022d902abd0539a68d2efef83483b8a8d9Timo Sirainen return (NULL);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen if (*s == '\0') {
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen return (s);
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen }
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen /* delete prefixed white space */
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen for (; *s == ' ' || *s == '\t' || *s == '\n'; s++);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen /* delete postfixed white space */
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen for (tp = s; *tp != '\0'; tp++);
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen for (tp--; tp != s && (*tp == ' ' || *tp == '\t' || *tp == '\n'); tp--) {
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen *tp = '\0';
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek return (s);
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi}
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomistatic int is_token(char c)
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi{
134987bc3b685d7ec71c04e9337f7125cff0698fTimo Sirainen int res;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi res = (apr_isascii(c) && apr_isgraph(c)
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi && (strchr(tspecial, c) == NULL)) ? 1 : -1;
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen return res;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi}
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainenstatic int is_qtext(char c)
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen{
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen int res;
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen res = (apr_isascii(c) && (c != '"') && (c != '\\') && (c != '\n'))
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen ? 1 : -1;
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen return res;
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen}
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainenstatic int is_quoted_pair(char *s)
424633d1a1e22139a5ab9345f807a89d0792ead3Timo Sirainen{
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen int res = -1;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen int c;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen if (((s + 1) != NULL) && (*s == '\\')) {
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen c = (int) *(s + 1);
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen if (apr_isascii(c)) {
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen res = 1;
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return (res);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen}
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainenstatic content_type *analyze_ct(request_rec *r, char *s)
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen{
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen char *tp, *mp, *cp;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen char *attribute, *value;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen int quoted = 0;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen server_rec * ss = r->server;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen apr_pool_t * p = r->pool;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi content_type *ctp;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi param *pp, *npp;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi /* initialize ctp */
2b96309988981c4005d59ea41e270c9b55c44de7Aki Tuomi ctp = (content_type *) apr_palloc(p, sizeof(content_type));
7f1ecb1481e89541b0a4a26cbc73a1263731f7b7Timo Sirainen ctp->type = NULL;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi ctp->subtype = NULL;
134987bc3b685d7ec71c04e9337f7125cff0698fTimo Sirainen ctp->param = NULL;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi tp = apr_pstrdup(p, s);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen mp = tp;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen cp = mp;
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen /* getting a type */
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen if (!(cp = strchr(mp, '/'))) {
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen "mod_mime: analyze_ct: cannot get media type from '%s'",
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen (const char *) mp);
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen return (NULL);
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen }
aa215ab623706463cea1d047f975ffe51d3f0c05Timo Sirainen ctp->type = apr_pstrndup(p, mp, cp - mp);
aa215ab623706463cea1d047f975ffe51d3f0c05Timo Sirainen ctp->type = zap_sp(ctp->type);
aa215ab623706463cea1d047f975ffe51d3f0c05Timo Sirainen if (ctp->type == NULL || *(ctp->type) == '\0' ||
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen strchr(ctp->type, ';') || strchr(ctp->type, ' ') ||
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen strchr(ctp->type, '\t')) {
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen "Cannot get media subtype.");
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen return (NULL);
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen }
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen /* getting a subtype */
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen cp++;
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen mp = cp;
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen for (; *cp != ';' && *cp != '\0'; cp++)
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen continue;
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen ctp->subtype = apr_pstrndup(p, mp, cp - mp);
e9a182196c79b321365dbcd8800790e841e5e890Timo Sirainen ctp->subtype = zap_sp(ctp->subtype);
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen if ((ctp->subtype == NULL) || (*(ctp->subtype) == '\0') ||
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen strchr(ctp->subtype, ' ') || strchr(ctp->subtype, '\t')) {
6fb3d58f9a801488ddeda687cb9d5ff24d76aee3Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "Cannot get media subtype.");
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen return (NULL);
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen cp = zap_sp(cp);
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen if (cp == NULL || *cp == '\0') {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return (ctp);
20195ef995a4eb63a282283db63f1dc0605323e0Timo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* getting parameters */
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen cp++;
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen cp = zap_sp(cp);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (cp == NULL || *cp == '\0') {
02b78558dc03daa2e7da2010b63f247b49936a38Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
02b78558dc03daa2e7da2010b63f247b49936a38Timo Sirainen "Cannot get media parameter.");
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return (NULL);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
e8a59a1671127f87e2d22f42e84c572f28299d81Timo Sirainen mp = cp;
55773f17bccf6361d6599ffcbe072d7c9fe205bfTimo Sirainen attribute = NULL;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen value = NULL;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen while (cp != NULL && *cp != '\0') {
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen if (attribute == NULL) {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen if (is_token(*cp) > 0) {
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen cp++;
87490012895b4f371635ded00add04c9107dcfefJosef 'Jeff' Sipek continue;
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen }
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen else if (*cp == ' ' || *cp == '\t' || *cp == '\n') {
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainen cp++;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen continue;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen else if (*cp == '=') {
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen attribute = apr_pstrndup(p, mp, cp - mp);
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen attribute = zap_sp(attribute);
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen if (attribute == NULL || *attribute == '\0') {
1a18848722d5d20deee4c8aa099890addc53af90Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen "Cannot get media parameter.");
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen return (NULL);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen cp++;
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen cp = zap_sp(cp);
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen if (cp == NULL || *cp == '\0') {
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen "Cannot get media parameter.");
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen return (NULL);
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen }
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen mp = cp;
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen continue;
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen }
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen else {
5cda0bfea032000c4a51134c748d9efe6614870bTimo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen "Cannot get media parameter.");
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen return (NULL);
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen }
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen else {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mp == cp) {
a8607ffb56669140a2304c59e6edf9c973e123d6Timo Sirainen if (*cp == '"') {
a8607ffb56669140a2304c59e6edf9c973e123d6Timo Sirainen quoted = 1;
a249dd267f05d349f1b4aa27b40a56083c8ba392Timo Sirainen cp++;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
a8607ffb56669140a2304c59e6edf9c973e123d6Timo Sirainen else {
a8607ffb56669140a2304c59e6edf9c973e123d6Timo Sirainen quoted = 0;
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen }
942312f81841c0e3a8b5609c7530826afa5a7f3bTimo Sirainen }
9456a4a3e74929f9d3d5b00b93be6d8eb69bc52aTimo Sirainen if (quoted > 0) {
9456a4a3e74929f9d3d5b00b93be6d8eb69bc52aTimo Sirainen while (quoted && *cp != '\0') {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (is_qtext(*cp) > 0) {
2d1663351e67fd778ed34df09b8ad5fe29da23d9Timo Sirainen cp++;
2d1663351e67fd778ed34df09b8ad5fe29da23d9Timo Sirainen }
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen else if (is_quoted_pair(cp) > 0) {
97511ac4d7607e1ba64ce151eda3d9b5f9775519Timo Sirainen cp += 2;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen else if (*cp == '"') {
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen cp++;
0a1b1d2e55b19786b42810671e4245c5b8942375Timo Sirainen while (*cp == ' ' || *cp == '\t' || *cp == '\n') {
df459621b9124dfd88d56619ac84611f30fec854Stephan Bosch cp++;
0a1b1d2e55b19786b42810671e4245c5b8942375Timo Sirainen }
0a1b1d2e55b19786b42810671e4245c5b8942375Timo Sirainen if (*cp != ';' && *cp != '\0') {
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen "Cannot get media parameter.");
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen return(NULL);
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen quoted = 0;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen else {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen "Cannot get media parameter.");
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen return (NULL);
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen else {
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen while (1) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (is_token(*cp) > 0) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen cp++;
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen else if (*cp == '\0' || *cp == ';') {
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen break;
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen else {
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen "Cannot get media parameter.");
96541d31299bb40b5a6efdbf9b4cb3d4f4b4a069Timo Sirainen return (NULL);
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen }
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen value = apr_pstrndup(p, mp, cp - mp);
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen value = zap_sp(value);
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (value == NULL || *value == '\0') {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen "Cannot get media parameter.");
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen return (NULL);
afd6338f1c0b6ffcd33b6fde9741b52002835ba3Stephan Bosch }
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen pp = apr_palloc(p, sizeof(param));
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen pp->attr = attribute;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen pp->val = value;
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen pp->next = NULL;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (ctp->param == NULL) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen ctp->param = pp;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen else {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen npp = ctp->param;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen while (npp->next) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen npp = npp->next;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
884228e5496378bada39a932db67aa3d9478198fTimo Sirainen npp->next = pp;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen quoted = 0;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen attribute = NULL;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen value = NULL;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (*cp == '\0') {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen break;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen cp++;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen mp = cp;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen return (ctp);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen}
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen/*
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen * find_ct is the hook routine for determining content-type and other
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen * MIME-related metadata. It assumes that r->filename has already been
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * set and stat has been called for r->finfo. It also assumes that the
f760ffed7875afbf37adc93555821caa42eadf82Timo Sirainen * non-path base file name is not the empty string unless it is a dir.
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainenstatic int find_ct(request_rec *r)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen{
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen mime_dir_config *conf;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen apr_array_header_t *exception_list;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen char *ext;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen const char *fn, *type, *charset = NULL;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen int found_metadata = 0;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
bfe5d546f5ecc459d46dbc1c569d633de7c0516dTimo Sirainen if (r->finfo.filetype == APR_DIR) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_type = DIR_MAGIC_TYPE;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen return OK;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen conf = (mime_dir_config *) ap_get_module_config(r->per_dir_config,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen &mime_module);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen exception_list = apr_array_make(r->pool, 2, sizeof(char *));
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen /* Always drop the path leading up to the file name.
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if ((fn = strrchr(r->filename, '/')) == NULL)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen fn = r->filename;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen else
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen ++fn;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen /* The exception list keeps track of those filename components that
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen * are not associated with extensions indicating metadata.
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * The base name is always the first exception (i.e., "txt.html" has
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * a basename of "txt" even though it might look like an extension).
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen ext = ap_getword(r->pool, &fn, '.');
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen *((const char **) apr_array_push(exception_list)) = ext;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen
c147bff818798a979d93537f72f5c1f68f5d5ba8Aki Tuomi /* Parse filename extensions which can be in any order
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen while (*fn && (ext = ap_getword(r->pool, &fn, '.'))) {
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen extension_info *exinfo = NULL;
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen int found;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (*ext == '\0') /* ignore empty extensions "bad..html" */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen continue;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen found = 0;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen#ifdef CASE_BLIND_FILESYSTEM
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen /* We have a basic problem that folks on case-crippled systems
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen * expect anything and everything to succeed
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen */
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen ap_str_tolower(ext);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen#endif
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (conf->extension_mappings != NULL) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen exinfo = (extension_info*)apr_hash_get(conf->extension_mappings,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen ext, APR_HASH_KEY_STRING);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (exinfo == NULL) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if ((type = apr_hash_get(mime_type_extensions, ext,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen APR_HASH_KEY_STRING)) != NULL) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_type = type;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen found = 1;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen else {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (exinfo->forced_type) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_type = exinfo->forced_type;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen found = 1;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
33ca6770e891c9be2cf5eb577f2f9067a63d6f05Timo Sirainen if (exinfo->charset_type) {
33ca6770e891c9be2cf5eb577f2f9067a63d6f05Timo Sirainen charset = exinfo->charset_type;
463d6c35524a3b3fbed0c1612e74b5601b7953feTimo Sirainen found = 1;
33ca6770e891c9be2cf5eb577f2f9067a63d6f05Timo Sirainen }
31ed25f84a5cb6b6e3608e4cb841760910579aa2Timo Sirainen if (exinfo->language_type) {
31ed25f84a5cb6b6e3608e4cb841760910579aa2Timo Sirainen r->content_language = exinfo->language_type; /* back compat. */
31ed25f84a5cb6b6e3608e4cb841760910579aa2Timo Sirainen if (!r->content_languages)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_languages = apr_array_make(r->pool, 2,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen sizeof(char *));
31ed25f84a5cb6b6e3608e4cb841760910579aa2Timo Sirainen *((const char **) apr_array_push(r->content_languages)) =
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen exinfo->language_type;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen found = 1;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (exinfo->encoding_type) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (!r->content_encoding)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_encoding = exinfo->encoding_type;
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen else {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen /* XXX should eliminate duplicate entities */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->content_encoding = apr_pstrcat(r->pool,
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen r->content_encoding,
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen ", ",
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen exinfo->encoding_type,
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen NULL);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen found = 1;
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen }
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen /* The following extensions are not 'Found'. That is, they don't
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * make any contribution to metadata negotation, so they must have
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * been explicitly requested by name.
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen */
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (exinfo->handler && r->proxyreq == PROXYREQ_NONE) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen r->handler = exinfo->handler;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen /* XXX Two significant problems; 1, we don't check to see if we are
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * setting redundant filters. 2, we insert these in the types config
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen * hook, which may be too early (dunno.)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen */
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (exinfo->input_filters && r->proxyreq == PROXYREQ_NONE) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen const char *filter, *filters = exinfo->input_filters;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen while (*filters
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen && (filter = ap_getword(r->pool, &filters, ';'))) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen ap_add_input_filter(filter, NULL, r, r->connection);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (exinfo->output_filters && r->proxyreq == PROXYREQ_NONE) {
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen const char *filter, *filters = exinfo->output_filters;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen while (*filters
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen && (filter = ap_getword(r->pool, &filters, ';'))) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen ap_add_output_filter(filter, NULL, r, r->connection);
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen }
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen }
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen if (found)
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen found_metadata = 1;
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen else
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen *((const char **) apr_array_push(exception_list)) = ext;
4eebe979f6847b3b22782785dafda6ca1bbf6d9fTimo Sirainen }
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen /*
bb6a0eeab27569790d58a036f67dcd2a965fc539Timo Sirainen * Need to set a notes entry on r for unrecognized elements.
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen * Somebody better claim them! If we did absolutely nothing,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen * skip the notes to alert mod_negotiation we are clueless.
2ebeb22b9a8a8bb7fbe2f2e2908478a220792b87Timo Sirainen */
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (found_metadata) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen apr_table_setn(r->notes, "ap-mime-exceptions-list",
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen (void *)exception_list);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (r->content_type) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen content_type *ctp;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen char *ct;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen int override = 0;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen ct = (char *) apr_palloc(r->pool,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen sizeof(char) * (strlen(r->content_type) + 1));
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen strcpy(ct, r->content_type);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if ((ctp = analyze_ct(r, ct))) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen param *pp = ctp->param;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen r->content_type = apr_pstrcat(r->pool, ctp->type, "/",
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen ctp->subtype, NULL);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen while (pp != NULL) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (charset && !strcmp(pp->attr, "charset")) {
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen if (!override) {
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen r->content_type = apr_pstrcat(r->pool, r->content_type,
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen "; charset=", charset,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen NULL);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen override = 1;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen else {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen r->content_type = apr_pstrcat(r->pool, r->content_type,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "; ", pp->attr,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "=", pp->val,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen NULL);
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen pp = pp->next;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen if (charset && !override) {
c04f9a724a7b3cc649485a61b0a540868d25d71bTimo Sirainen r->content_type = apr_pstrcat(r->pool, r->content_type,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "; charset=", charset,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen NULL);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen }
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen }
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen /* Set default language, if none was specified by the extensions
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen * and we have a DefaultLanguage setting in force
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen */
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen if (!r->content_languages && conf->default_language) {
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen const char **new;
52fbebc87d7ae4fc4585863d38cb87f166a6521aTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen r->content_language = conf->default_language; /* back compat. only */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (!r->content_languages)
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi r->content_languages = apr_array_make(r->pool, 2, sizeof(char *));
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi new = (const char **) apr_array_push(r->content_languages);
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi *new = conf->default_language;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen /* Check for overrides with ForceType/SetHandler */
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (conf->type && strcmp(conf->type, "none"))
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen r->content_type = conf->type;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi if (conf->handler && strcmp(conf->handler, "none"))
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi r->handler = conf->handler;
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen if (!r->content_type)
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen return DECLINED;
7a54d58280aad8a64f266c61273ea1e8dff511a3Timo Sirainen
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi return OK;
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi}
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi
f977ec781fca91e320535f1562382433a9e63177Aki Tuomistatic void register_hooks(apr_pool_t *p)
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi{
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi ap_hook_post_config(mime_post_config,NULL,NULL,APR_HOOK_MIDDLE);
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi ap_hook_type_checker(find_ct,NULL,NULL,APR_HOOK_MIDDLE);
134987bc3b685d7ec71c04e9337f7125cff0698fTimo Sirainen /*
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi * this hook seems redundant ... is there any reason a type checker isn't
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi * allowed to do this already? I'd think that fixups in general would be
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi * the last opportunity to get the filters right.
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi * ap_hook_insert_filter(mime_insert_filters,NULL,NULL,APR_HOOK_MIDDLE);
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi */
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi}
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomimodule AP_MODULE_DECLARE_DATA mime_module = {
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi STANDARD20_MODULE_STUFF,
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi create_mime_dir_config, /* create per-directory config structure */
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi merge_mime_dir_configs, /* merge per-directory config structures */
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi NULL, /* create per-server config structure */
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi NULL, /* merge per-server config structures */
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi mime_cmds, /* command apr_table_t */
f977ec781fca91e320535f1562382433a9e63177Aki Tuomi register_hooks /* register hooks */
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi};
ae2bad232435e5f81f37dd4b8ddb631a564d3dc2Aki Tuomi