mighttpd2-2.4.0: FileCGIApp.hs
{-# LANGUAGE OverloadedStrings #-}
module FileCGIApp (fileCgiApp) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Application.Classic
import Types
fileCgiApp :: ClassicAppSpec -> FileAppSpec -> RevProxyAppSpec -> RouteDB -> Application
fileCgiApp cspec filespec revproxyspec um req = case mmp of
Nothing -> return $ responseLBS statusPreconditionFailed
[("Content-Type", "text/plain")
,("Server", softwareName cspec)]
"Precondition Failed\r\n"
Just (RouteFile src dst) ->
fileApp cspec filespec (FileRoute (toP src) (toP dst)) req
Just (RouteCGI src dst) ->
cgiApp cspec (CgiRoute (toP src) (toP dst)) req
Just (RouteRevProxy src dst dom prt) ->
revProxyApp cspec revproxyspec (RevProxyRoute (toP src) (toP dst) dom prt) req
where
mmp = getBlock (serverName req) um >>= getRoute (rawPathInfo req)
toP = fromByteString
getBlock :: ByteString -> RouteDB -> Maybe [Route]
getBlock _ [] = Nothing
getBlock key (Block doms maps : ms)
| key `elem` doms = Just maps
| otherwise = getBlock key ms
getRoute :: ByteString -> [Route] -> Maybe Route
getRoute _ [] = Nothing
getRoute key (m@(RouteFile src _):ms)
| src `BS.isPrefixOf` key = Just m
| otherwise = getRoute key ms
getRoute key (m@(RouteCGI src _):ms)
| src `BS.isPrefixOf` key = Just m
| otherwise = getRoute key ms
getRoute key (m@(RouteRevProxy src _ _ _):ms)
| src `BS.isPrefixOf` key = Just m
| otherwise = getRoute key ms