# 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 a cgitb-based output, 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`