wai-middleware-static-0.8.0: WAI middleware that serves requests to static files.

Safe HaskellNone
LanguageHaskell2010

Network.Wai.Middleware.Static

Contents

Description

Serve static files, subject to a policy that can filter or modify incoming URIs. The flow is:

incoming request URI ==> policies ==> exists? ==> respond

If any of the polices fail, or the file doesn't exist, then the middleware gives up and calls the inner application. If the file is found, the middleware chooses a content type based on the file extension and returns the file contents as the response.

Synopsis

Middlewares

static :: Middleware Source

Serve static files out of the application root (current directory). If file is found, it is streamed to the client and no further middleware is run. Disables caching.

Note: for security reasons, this uses the noDots and isNotAbsolute policy by default.

staticPolicy :: Policy -> Middleware Source

Serve static files subject to a Policy. Disables caching.

Note: for security reasons, this uses the noDots and isNotAbsolute policy by default.

unsafeStaticPolicy :: Policy -> Middleware Source

Serve static files subject to a Policy. Unlike static and staticPolicy, this has no policies enabled by default, and is hence insecure. Disables caching.

static' :: CacheContainer -> Middleware Source

Serve static files out of the application root (current directory). If file is found, it is streamed to the client and no further middleware is run. Allows a CachingStrategy.

Note: for security reasons, this uses the noDots and isNotAbsolute policy by default.

staticPolicy' :: CacheContainer -> Policy -> Middleware Source

Serve static files subject to a Policy using a specified CachingStrategy

Note: for security reasons, this uses the noDots and isNotAbsolute policy by default.

unsafeStaticPolicy' :: CacheContainer -> Policy -> Middleware Source

Serve static files subject to a Policy. Unlike static and staticPolicy, this has no policies enabled by default, and is hence insecure. Also allows to set a CachingStrategy.

Cache Control

data CachingStrategy Source

A cache strategy which should be used to serve content matching a policy. Meta information is cached for a maxium of 100 seconds before being recomputed.

Constructors

NoCaching

Do not send any caching headers

PublicStaticCaching

Send common caching headers for public (non dynamic) static files

CustomCaching (FileMeta -> RequestHeaders)

Compute caching headers using the user specified function. See http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/ for a detailed guide

data FileMeta Source

Meta information about a file to calculate cache headers

initCaching :: CachingStrategy -> IO CacheContainer Source

Initialize caching. This should only be done once per application launch.

data CacheContainer Source

Container caching file meta information. Create using initCaching

Policies

data Policy Source

Take an incoming URI and optionally modify or filter it. The result will be treated as a filepath.

Instances

Monoid Policy Source

Note: mempty == policy Just (the always accepting policy) mappend == >-> (policy sequencing)

(<|>) :: Policy -> Policy -> Policy infixr 4 Source

Choose between two policies. If the first fails, run the second.

(>->) :: Policy -> Policy -> Policy infixr 5 Source

Sequence two policies. They are run from left to right. (Note: this is mappend)

policy :: (String -> Maybe String) -> Policy Source

Lift a function into a Policy

predicate :: (String -> Bool) -> Policy Source

Lift a predicate into a Policy

addBase :: String -> Policy Source

Add a base path to the URI

staticPolicy (addBase "/home/user/files")

GET "foo/bar" looks for "/home/user/files/foo/bar"

addSlash :: Policy Source

Add an initial slash to to the URI, if not already present.

staticPolicy addSlash

GET "foo/bar" looks for "/foo/bar"

contains :: String -> Policy Source

Accept only URIs containing given string

hasPrefix :: String -> Policy Source

Accept only URIs with given prefix

hasSuffix :: String -> Policy Source

Accept only URIs with given suffix

noDots :: Policy Source

Reject URIs containing ".."

isNotAbsolute :: Policy Source

Reject URIs that are absolute paths

only :: [(String, String)] -> Policy Source

Use URI as the key to an association list, rejecting those not found. The policy result is the matching value.

staticPolicy (only [("foo/bar", "/home/user/files/bar")])

GET "foo/bar" looks for "/home/user/files/bar" GET "baz/bar" doesn't match anything

Utilities

tryPolicy :: Policy -> String -> Maybe String Source

Run a policy

MIME types

getMimeType :: FilePath -> MimeType Source

Guess MIME type from file extension