# Apache's Handler Use

## What is a Handler

A "handler" is an internal Apache representation of the action to be performed when a file is called. Generally, files have implicit handlers, based on the file type. Normally, all files are simply served by the server, but certain file typed are "handled" seperately. For example, you may use a type of "application/x-httpd-cgi" to invoke CGI scripts.

Apache 1.1 adds the additional ability to use handlers explicitly. Either based on filename extensions or on location, these handlers are unrelated to file type. This is advantageous both because it is a more elegant solution, but it also allows for both a type and a handler to be associated with a file.

Handlers can either be built into the server or to a module, or they can be added with the Action directive. The built-in handlers in the standard distribution are as follows:

- send-as-is: Send file with HTTP headers as is.
- cgi-script: Treat the file as a CGI script.
- imap-file: Imagemap rule file.
- server-info: Get the server's configuration info
- server-parsed: Parse for server-side includes
- server-status: Get the server's status report
- type-map: Parse as a type map file for content negotation

## Directives

- AddHandler
- SetHandler

## AddHandler

Syntax: <AddHandler handler-name extention>
Context: server config, virtual host, directory, .htaccess
Status: Base
Module: mod_mime

AddHandler maps the filename extension extension to the handler handler-name. For example, to activate CGI scripts with the file extension "`.cgi`", you might use:

        AddHandler cgi-script cgi

Once that has been put into your srm.conf or httpd.conf file, any file ending with "`.cgi`" will be treated as a CGI program.

## SetHandler

Syntax: <SetHandler handler-name>
Context: directory, .htaccess
Status: Base
Module: mod_mime

When placed into an `.htaccess` file or a `<Directory>` or `<Location` section, this directive forces all matching files to be parsed through the handler given by handler-name. For example, if you had a directory you wanted to be parsed entirely as imagemap rule files, regardless of extension, you might put the following into an `.htaccess` file in that directory:

        SetHandler imap-file

Another example: if you wanted to have the server display a status report whenever a URL of `http://servername/status` was called, you might put the following into access.conf:

        <Location /status>
        SetHandler server-status
        </Location>

## Programmer's Note

In order to implement the handler features, an addition has been made to the Apache API that you may wish to make use of. Specifically, a new record has been added to the `request_rec` structure:

        char *handler

If you wish to have your module engage a handler, you need only to set `r->handler` to the name of the handler at any time prior to the `invoke_handler` stage of the request. Handlers are implemented as they were before, albiet using the handler name instead of a content type. While it is not neccessary, the naming convention for handlers is to use a dash-seperated word, with no slashes, so as to not invade the media type namespace.