<html xmlns="http://www.w3.org/TR/xhtml1/strict"><head><!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
--><title>mod_isapi - Apache HTTP Server</title><link href="../style/manual.css" type="text/css" rel="stylesheet"/></head><body><blockquote><div align="center"><img alt="[APACHE DOCUMENTATION]" src="../images/sub.gif"/><h3>Apache HTTP Server Version 2.0</h3></div><h1 align="center">Apache Module mod_isapi</h1><table cellspacing="1" cellpadding="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td valign="top"><span class="help">Description:</span></td><td><description>ISAPI Extensions within Apache for Windows</description></td></tr><tr><td><a href="module-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="module-dict.html#ModuleIdentifier" class="help">Module&nbsp;Identifier:</a></td><td>isapi_module</td></tr><tr><td align="left" valign="top"><a href="module-dict.html#Compatibility" class="help">Compatibility:</a></td><td><compatibility>Win32 only</compatibility></td></tr></table></td></tr></table><h2>Summary</h2><summary>
    <p>This module implements the Internet Server extension API. It
    allows Internet Server extensions (<em>e.g.</em> ISAPI .dll
    modules) to be served by Apache for Windows, subject to the
    noted restrictions.</p>

    <p>ISAPI extension modules (.dll files) are written by third
    parties. The Apache Group does not author these modules, so we
    provide no support for them. Please contact the ISAPI's author
    directly if you are experiencing problems running their ISAPI
    extention. <strong>Please <em>do not</em> post such problems to
    Apache's lists or bug reporting pages.</strong></p>
</summary><h2>Directives</h2><ul><li><a href="#isapiappendlogtoerrors">ISAPIAppendLogToErrors</a></li><li><a href="#isapiappendlogtoquery">ISAPIAppendLogToQuery</a></li><li><a href="#isapifilechache">ISAPIFileChache</a></li><li><a href="#isapilognotsupported">ISAPILogNotSupported</a></li><li><a href="#isapireadaheadbuffer">ISAPIReadAheadBuffer</a></li></ul><h2>Usage</h2> <p>In the server configuration file, use
the <a href="mod_mime.html#addhandler" class="directive"><code class="directive">AddHandler</code></a> directive to
associate ISAPI files with the <code>isapi-isa</code> handler, and map
it to the with their file extensions. To enable any .dll file to be
processed as an ISAPI extention, edit the httpd.conf file and add the
following line:</p>
<blockquote><table cellpadding="10"><tr><td bgcolor="#eeeeee"><code>
    AddHandler isapi-isa .dll
</code></td></tr></table></blockquote>

    <p>There is no capability within the Apache server to leave a
    requested module loaded. However, you may preload and keep a
    specific module loaded by using the following syntax in your
    httpd.conf:</p>
<blockquote><table cellpadding="10"><tr><td bgcolor="#eeeeee"><code>
    ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll
</code></td></tr></table></blockquote>

    <p>Whether or not you have preloaded an ISAPI extension, all
    ISAPI extensions are governed by the same permissions and
    restrictions as CGI scripts. That is, <code>Options
    ExecCGI</code> must be set for the directory that contains the
    ISAPI .dll file.</p>

    <p>Review the <a href="#notes">Additional Notes</a> and the <a href="#journal">Programmer's Journal</a> for additional details
    and clarification of the specific ISAPI support offered by
    mod_isapi.</p>
<h2><a name="notes">Additional Notes</a></h2>

    <p>Apache's ISAPI implementation conforms to all of the ISAPI
    2.0 specification, except for some "Microsoft-specific"
    extensions dealing with asynchronous I/O. Apache's I/O model
    does not allow asynchronous reading and writing in a manner
    that the ISAPI could access. If an ISA tries to access
    unsupported features, including async I/O, a message is placed
    in the error log to help with debugging. Since these messages
    can become a flood, the directive <code>ISAPILogNotSupported
    Off</code> exists to quiet this noise.</p>

    <p>Some servers, like Microsoft IIS, load the ISAPI extension
    into the server and keep it loaded until memory usage is too
    high, or unless configuration options are specified. Apache
    currently loads and unloads the ISAPI extension each time it is
    requested, unless the ISAPICacheFile directive is specified.
    This is inefficient, but Apache's memory model makes this the
    most effective method. Many ISAPI modules are subtly
    incompatible with the Apache server, and unloading these
    modules helps to ensure the stability of the server.</p>

    <p>Also, remember that while Apache supports ISAPI Extensions,
    it <strong>does not support ISAPI Filters.</strong> Support for
    filters may be added at a later date, but no support is planned
    at this time.</p>
<h2><a name="journal">Programmer's Journal</a></h2>

    <p>If you are programming Apache 2.0 <code><a href="mod_isapi.html">mod_isapi</a></code>
    modules, you must limit your calls to ServerSupportFunction to the
    following directives:</p>

    <dl>
      <dt>HSE_REQ_SEND_URL_REDIRECT_RESP</dt>

      <dd>Redirect the user to another location.<br>
       This must be a fully qualified URL (e.g.
      http://server/location).</dd>

      <dt>HSE_REQ_SEND_URL</dt>

      <dd>Redirect the user to another location.<br>
       This cannot be a fully qualified URL, you are not allowed to
      pass the protocol or a server name (e.g. simply
      /location).<br>
       This redirection is handled by the server, not the
      browser.<br>
       <strong>Warning:</strong> in their recent documentation,
      Microsoft appears to have abandoned the distinction between
      the two HSE_REQ_SEND_URL functions. Apache continues to treat
      them as two distinct functions with different requirements
      and behaviors.</dd>

      <dt>HSE_REQ_SEND_RESPONSE_HEADER</dt>

      <dd>Apache accepts a response body following the header if it
      follows the blank line (two consecutive newlines) in the
      headers string argument. This body cannot contain NULLs,
      since the headers argument is NULL terminated.</dd>

      <dt>HSE_REQ_DONE_WITH_SESSION</dt>

      <dd>Apache considers this a no-op, since the session will be
      finished when the ISAPI returns from processing.</dd>

      <dt>HSE_REQ_MAP_URL_TO_PATH</dt>

      <dd>Apache will translate a virtual name to a physical
      name.</dd>

      <dt>HSE_APPEND_LOG_PARAMETER</dt>

      <dd>
        This logged message may be captured in any of the following
        logs: 

        <ul>
          <li>in the \"%{isapi-parameter}n\" component in a
          CustomLog directive</li>

          <li>in the %q log component with the
          ISAPIAppendLogToQuery On directive</li>

          <li>in the error log with the ISAPIAppendLogToErrors On
          directive</li>
        </ul>
        The first option, the %{isapi-parameter}n component, is
        always available and prefered.
      </dd>

      <dt>HSE_REQ_IS_KEEP_CONN</dt>

      <dd>Will return the negotiated Keep-Alive status.</dd>

      <dt>HSE_REQ_SEND_RESPONSE_HEADER_EX</dt>

      <dd>Will behave as documented, although the fKeepConn flag is
      ignored.</dd>

      <dt>HSE_REQ_IS_CONNECTED</dt>

      <dd>Will report false if the request has been aborted.</dd>
    </dl>

    <p>Apache returns FALSE to any unsupported call to
    ServerSupportFunction, and sets the GetLastError value to
    ERROR_INVALID_PARAMETER.</p>

    <p>ReadClient retrieves the request body exceeding the initial
    buffer (defined by ISAPIReadAheadBuffer). Based on the
    ISAPIReadAheadBuffer setting (number of bytes to buffer prior
    to calling the ISAPI handler) shorter requests are sent
    complete to the extension when it is invoked. If the request is
    longer, the ISAPI extension must use ReadClient to retrieve the
    remaining request body.</p>

    <p>WriteClient is supported, but only with the HSE_IO_SYNC flag
    or no option flag (value of 0). Any other WriteClient request
    will be rejected with a return value of FALSE, and a
    GetLastError value of ERROR_INVALID_PARAMETER.</p>

    <p>GetServerVariable is supported, although extended server
    variables do not exist (as defined by other servers.) All the
    usual Apache CGI environment variables are available from
    GetServerVariable, as well as the ALL_HTTP and ALL_RAW
    values.</p>

    <p>Apache 2.0 <code><a href="mod_isapi.html">mod_isapi</a></code> supports additional
    features introduced in later versions of the ISAPI specification,
    as well as limited emulation of async I/O and the TransmitFile
    semantics.  Apache also supports preloading ISAPI .dlls for
    performance, neither of which were not available under Apache 1.3
    mod_isapi.</p>
<hr/><h2><a name="ISAPIAppendLogToErrors">ISAPIAppendLogToErrors</a> <a name="isapiappendlogtoerrors">Directive</a></h2><table cellpadding="1" cellspacing="0" border="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td><strong>Description: </strong></td><td>Record HSE_APPEND_LOG_PARAMETER requests from ISAPI
extensions to the error log</td></tr><tr><td><a href="directive-dict.html#Syntax" class="help">Syntax:</a></td><td><syntax>ISAPIAppendLogToErrors on|off</syntax></td></tr><tr><td><a href="directive-dict.html#Default" class="help">Default:</a></td><td><code>ISAPIAppendLogToErrors off</code></td></tr><tr><td><a href="directive-dict.html#Context" class="help">Context:</a></td><td>server config</td></tr><tr><td><a href="directive-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="directive-dict.html#Module" class="help">Module:</a></td><td>mod_isapi</td></tr></table></td></tr></table><usage>
    <p>Record HSE_APPEND_LOG_PARAMETER requests from ISAPI
    extensions to the server error log.</p>
</usage><hr/><h2><a name="ISAPIAppendLogToQuery">ISAPIAppendLogToQuery</a> <a name="isapiappendlogtoquery">Directive</a></h2><table cellpadding="1" cellspacing="0" border="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td><strong>Description: </strong></td><td>Record HSE_APPEND_LOG_PARAMETER requests from ISAPI
extensions to the query field</td></tr><tr><td><a href="directive-dict.html#Syntax" class="help">Syntax:</a></td><td><syntax>ISAPIAppendLogToQuery on|off</syntax></td></tr><tr><td><a href="directive-dict.html#Default" class="help">Default:</a></td><td><code>ISAPIAppendLogToQuery off</code></td></tr><tr><td><a href="directive-dict.html#Context" class="help">Context:</a></td><td>server config</td></tr><tr><td><a href="directive-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="directive-dict.html#Module" class="help">Module:</a></td><td>mod_isapi</td></tr></table></td></tr></table><usage>
    <p>Record HSE_APPEND_LOG_PARAMETER requests from ISAPI
    extensions to the query field (appended to the CustomLog %q
    component).</p>
</usage><hr/><h2><a name="ISAPIFileChache">ISAPIFileChache</a> <a name="isapifilechache">Directive</a></h2><table cellpadding="1" cellspacing="0" border="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td><strong>Description: </strong></td><td>ISAPI .dll files to be loaded at startup</td></tr><tr><td><a href="directive-dict.html#Syntax" class="help">Syntax:</a></td><td><syntax>ISAPIFileCache <em>file-path</em> [<em>file-path</em>] ...</syntax></td></tr><tr><td><a href="directive-dict.html#Context" class="help">Context:</a></td><td>server config</td></tr><tr><td><a href="directive-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="directive-dict.html#Module" class="help">Module:</a></td><td>mod_isapi</td></tr></table></td></tr></table><usage>
    <p>Specifies a space-separated list of file names to be loaded
    when the Apache server is launched, and remain loaded until the
    server is shut down. This directive may be repeated for every
    ISAPI .dll file desired. The full path name of each file should
    be specified.</p>
</usage><hr/><h2><a name="ISAPILogNotSupported">ISAPILogNotSupported</a> <a name="isapilognotsupported">Directive</a></h2><table cellpadding="1" cellspacing="0" border="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td><strong>Description: </strong></td><td>Log unsupported feature requests from ISAPI
extensions</td></tr><tr><td><a href="directive-dict.html#Syntax" class="help">Syntax:</a></td><td><syntax>ISAPILogNotSupported on|off</syntax></td></tr><tr><td><a href="directive-dict.html#Default" class="help">Default:</a></td><td><code>ISAPILogNotSupported on</code></td></tr><tr><td><a href="directive-dict.html#Context" class="help">Context:</a></td><td>server config</td></tr><tr><td><a href="directive-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="directive-dict.html#Module" class="help">Module:</a></td><td>mod_isapi</td></tr></table></td></tr></table><usage>
    <p>Logs all requests for unsupported features from ISAPI
    extensions in the server error log. While this should be turned
    off once all desired ISAPI modules are functioning, it defaults
    to on to help administrators track down problems.</p>
</usage><hr/><h2><a name="ISAPIReadAheadBuffer">ISAPIReadAheadBuffer</a> <a name="isapireadaheadbuffer">Directive</a></h2><table cellpadding="1" cellspacing="0" border="0" bgcolor="#cccccc"><tr><td><table bgcolor="#ffffff"><tr><td><strong>Description: </strong></td><td>Size of the Read Ahead Buffer sent to ISAPI 
extensions</td></tr><tr><td><a href="directive-dict.html#Syntax" class="help">Syntax:</a></td><td><syntax>ISAPIReadAheadBuffer <em>size</em></syntax></td></tr><tr><td><a href="directive-dict.html#Default" class="help">Default:</a></td><td><code>ISAPIReadAheadBuffer 49152</code></td></tr><tr><td><a href="directive-dict.html#Context" class="help">Context:</a></td><td>server config</td></tr><tr><td><a href="directive-dict.html#Status" class="help">Status:</a></td><td>Base</td></tr><tr><td><a href="directive-dict.html#Module" class="help">Module:</a></td><td>mod_isapi</td></tr></table></td></tr></table><usage>
    <p>Defines the maximum size of the Read Ahead Buffer sent to
    ISAPI extensions when they are initially invoked. All remaining
    data must be retrieved using the ReadClient callback; some
    ISAPI extensions may not support the ReadClient function. Refer
    questions to the ISAPI extension's author.</p>
</usage><hr/><h3 align="center">Apache HTTP Server Version 2.0</h3><a href="./"><img alt="Index" src="../images/index.gif"/></a><a href="../"><img alt="Home" src="../images/home.gif"/></a></blockquote></body></html>