<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.en.xsl"?>
<!-- $LastChangedRevision$ -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="filter.xml.meta">

  <title>Filters</title>

  <summary>
    <p>This document describes the use of filters in Apache.</p>
  </summary>

  <section id="filters">
    <title>Filters</title>
    <related>
      <modulelist>
        <module>mod_deflate</module>
        <module>mod_ext_filter</module>
        <module>mod_include</module>
      </modulelist>
      <directivelist>
        <directive module="mod_mime">AddInputFilter</directive>
        <directive module="mod_mime">AddOutputFilter</directive>
        <directive module="mod_mime">RemoveInputFilter</directive>
        <directive module="mod_mime">RemoveOutputFilter</directive>
        <directive module="mod_ext_filter">ExtFilterDefine</directive>
        <directive module="mod_ext_filter">ExtFilterOptions</directive>
        <directive module="core">SetInputFilter</directive>
        <directive module="core">SetOutputFilter</directive>
      </directivelist>
    </related>

    <p>A <em>filter</em> is a process that is applied to data that
    is sent or received by the server. Data sent by clients to the
    server is processed by <em>input filters</em> while data sent
    by the server to the client is processed by <em>output
    filters</em>. Multiple filters can be applied to the data, and
    the order of the filters can be explicitly specified.</p>

    <p>Filters are used internally by Apache to perform functions such
    as chunking and byte-range request handling. In addition, modules
    can provide filters that are selectable using run-time
    configuration directives. The set of filters that apply to data
    can be manipulated with the
    <directive module="core">SetInputFilter</directive>,
    <directive module="core">SetOutputFilter</directive>,
    <directive module="mod_mime">AddInputFilter</directive>,
    <directive module="mod_mime">AddOutputFilter</directive>,
    <directive module="mod_mime">RemoveInputFilter</directive>, and
    <directive module="mod_mime">RemoveOutputFilter</directive>
    directives.</p>

    <p>The following user-selectable filters are currently provided
    with the Apache HTTP Server distribution.</p>

    <dl>
      <dt>INCLUDES</dt>
      <dd>Server-Side Includes processing by <module>mod_include</module></dd>
      <dt>DEFLATE</dt>
      <dd>Compress output before sending it to the client using
          <module>mod_deflate</module>
      </dd>
    </dl>

    <p>In addition, the module <module>mod_ext_filter</module> allows
    for external programs to be defined as filters.</p>
  </section>
</manualpage>
