wai-middleware-static-0.8.2: 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

Semigroup Policy Source #

Note: '(<>)' == >-> (policy sequencing)

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