Safe Haskell | None |
---|
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.
- static :: Middleware
- staticPolicy :: Policy -> Middleware
- 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
- only :: [(String, String)] -> Policy
- tryPolicy :: Policy -> String -> Maybe String
Middlewares
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.
staticPolicy :: Policy -> MiddlewareSource
Serve static files subject to a Policy
Policies
Take an incoming URI and optionally modify or filter it. The result will be treated as a filepath.
(<|>) :: Policy -> Policy -> PolicySource
Choose between two policies. If the first fails, run the second.
(>->) :: Policy -> Policy -> PolicySource
Sequence two policies. They are run from left to right. (Note: this is mappend
)
addBase :: String -> PolicySource
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"
only :: [(String, String)] -> PolicySource
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