Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
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
- static :: Middleware
- staticPolicy :: Policy -> Middleware
- unsafeStaticPolicy :: Policy -> Middleware
- static' :: CacheContainer -> Middleware
- staticPolicy' :: CacheContainer -> Policy -> Middleware
- unsafeStaticPolicy' :: CacheContainer -> Policy -> Middleware
- staticWithOptions :: Options -> Middleware
- staticPolicyWithOptions :: Options -> Policy -> Middleware
- unsafeStaticPolicyWithOptions :: Options -> Policy -> Middleware
- data Options
- cacheContainer :: Options -> CacheContainer
- mimeTypes :: Options -> FilePath -> MimeType
- defaultOptions :: Options
- data CachingStrategy
- data FileMeta = FileMeta {}
- initCaching :: CachingStrategy -> IO CacheContainer
- data CacheContainer
- data Policy
- (<|>) :: Policy -> Policy -> Policy
- (>->) :: Policy -> Policy -> Policy
- policy :: (String -> Maybe String) -> Policy
- predicate :: (String -> Bool) -> Policy
- addBase :: String -> Policy
- addSlash :: Policy
- contains :: String -> Policy
- hasPrefix :: String -> Policy
- hasSuffix :: String -> Policy
- noDots :: Policy
- isNotAbsolute :: Policy
- only :: [(String, String)] -> Policy
- tryPolicy :: Policy -> String -> Maybe FilePath
- getMimeType :: FilePath -> MimeType
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 #
Deprecated: Use staticWithOptions
instead. This function will be removed in the next major release.
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 #
Deprecated: Use staticPolicyWithOptions
instead. This function will be removed in the next major release.
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 #
Deprecated: Use unsafeStaticPolicyWithOptions
instead. This function will be removed in the next major release.
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
.
staticWithOptions :: Options -> 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. Takes Options
.
Note: for security reasons, this uses the noDots
and isNotAbsolute
policy by default.
staticPolicyWithOptions :: Options -> Policy -> Middleware Source #
Serve static files subject to a Policy
using specified Options
Note: for security reasons, this uses the noDots
and isNotAbsolute
policy by default.
unsafeStaticPolicyWithOptions :: Options -> Policy -> Middleware Source #
Serve static files subject to a Policy
. Unlike staticWithOptions
and staticPolicyWithOptions
,
this has no policies enabled by default and is hence insecure. Takes Options
.
Options
Options for staticWithOptions
Middleware
.
Options can be set using record syntax on defaultOptions
with the fields below.
cacheContainer :: Options -> CacheContainer Source #
Cache container to use
defaultOptions :: Options Source #
Default options.
Options
{cacheContainer
=CacheContainerEmpty
-- no caching ,mimeTypes
=getMimeType
-- usedefaultMimeLookup
fromMime
}
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.
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 |
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
Take an incoming URI and optionally modify or filter it. The result will be treated as a filepath.
(<|>) :: 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
)
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"
Add an initial slash to to the URI, if not already present.
staticPolicy addSlash
GET "foo/bar" looks for "/foo/bar"
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
MIME types
getMimeType :: FilePath -> MimeType Source #
Guess MIME type from file extension