# Features

## Testing

- A fixture for testing WSGI applications conveniently and in-process, in `paste.fixture.TestApp`

- A fixture for testing command-line applications, also in `paste.fixture.TestFileEnvironment`

- Check components for WSGI-compliance in `paste.lint`

- Check filesystem changes, with `paste.debug.fsdiff`

## Server

- A threaded HTTP server in `paste.httpserver`

- A tool for seeing and killing errant threads in the HTTP server, in `paste.debug.watchthreads`

## Dispatching

- Chain and cascade WSGI applications (returning the first non-error response) in `paste.cascade`

- Dispatch to several WSGI applications based on URL prefixes, in `paste.urlmap`

- Allow applications to make subrequests and forward requests internally, in `paste.recursive`

- Redirect error pages (e.g., 404 Not Found) to custom error pages, in `paste.errordocument`.

## Web Application

- Easily deal with incoming requests and sending a response in `paste.wsgiwrappers`

- Work directly with the WSGI environment in `paste.request`

- Run CGI programs as WSGI applications in `paste.cgiapp`

- Traverse files and load WSGI applications from `.py` files (or static files), in `paste.urlparser`

- Serve static directories of files, also in `paste.urlparser`; also serve using the Setuptools `pkg_resources` resource API.

- Proxy to other servers, treating external HTTP servers as WSGI applications, in `paste.proxy`.

- Serve files (with support for `If-Modified-Since`, etc) in `paste.fileapp`

## Tools

- Catch HTTP-related exceptions (e.g., `HTTPNotFound`) and turn them into proper responses in `paste.httpexceptions`

- Manage HTTP header fields with `paste.httpheaders`

- Handle authentication/identification of requests in `paste.auth`

- Create sessions in `paste.session` and `paste.flup_session`

- Gzip responses in `paste.gzipper`

- A wide variety of routines for manipulating WSGI requests and producing responses, in `paste.request`, `paste.response` and `paste.wsgilib`.

- Create Apache-style logs in `paste.translogger`

- Handy request and response wrappers in `paste.wsgiwrappers`

- Handling of request-local module globals sanely in `paste.registry`

## Authentication

- Authentication using cookies in `paste.auth.cookie` and `paste.auth.auth_tkt`; login form in `paste.auth.form`

- Authentication using OpenID in `paste.auth.open_id`, using CAS in `paste.auth.cas`

- HTTP authentication in `paste.auth.basic` and `paste.auth.digest`

- Dispatch to different authentication methods based on User-Agent, in `paste.auth.multi`

- Grant roles based on IP addresses, in `paste.auth.grantip`

## Debugging Filters

- Catch (optionally email) errors with extended tracebacks (using Zope/ZPT conventions) in `paste.exceptions`

- During debugging, show tracebacks with information about each stack frame, including an interactive prompt that runs in the individual stack frames, in `paste.evalexception`.

- Catch errors presenting traceback in `paste.cgitb_catcher`.

- Profile each request and append profiling information to the HTML, in `paste.debug.profile`

- Capture `print` output and present it in the browser for debugging, in `paste.debug.prints`

- Validate all HTML output from applications using the WDG Validator, appending any errors or warnings to the page, in `paste.debug.wdg_validator`

## Other Tools

- A file monitor to allow restarting the server when files have been updated (for automatic restarting when editing code) in `paste.reloader`

- A class for generating and traversing URLs, and creating associated HTML code, in `paste.url`

- A small templating language (for internal use) in `paste.util.template`

- A class to help with loops in templates, in `paste.util.looper`

- Import modules and objects given a string, in `paste.util.import_string`

- Ordered dictionary that can have multiple values with the same key, in `paste.util.multidict`