module Network.MoHWS.Server.Context where
import qualified Network.MoHWS.Server.Options as Options
import qualified Network.MoHWS.Server.Request as ServerRequest
import qualified Network.MoHWS.Configuration as Config
import qualified Network.MoHWS.Logger.Access as AccessLogger
import qualified Network.MoHWS.Logger.Error as ErrorLogger
import qualified Network.MoHWS.HTTP.MimeType as MimeType
import qualified Network.MoHWS.HTTP.Response as Response
import Network.BSD (HostEntry, )
import System.Time (TimeDiff, )
data T ext = Cons
{
options :: Options.T,
config :: Config.T ext,
hostName :: HostEntry,
mimeTypes :: MimeType.Dictionary,
errorLogger :: ErrorLogger.Handle,
accessLoggers :: [AccessLogger.Handle]
}
instance Functor T where
fmap f st = Cons {
options = options st,
config = fmap f $ config st,
hostName = hostName st,
mimeTypes = mimeTypes st,
errorLogger = errorLogger st,
accessLoggers = accessLoggers st
}
getMimeType :: T ext -> FilePath -> String
getMimeType st filename =
let def = Config.defaultType (config st)
in maybe def show (MimeType.fromFileName (mimeTypes st) filename)
instance ErrorLogger.HasHandle (T ext) where
getHandle = errorLogger
logAccess :: T ext -> ServerRequest.T body -> Response.T body -> TimeDiff -> IO ()
logAccess st req resp delay =
do msg <- AccessLogger.mkRequest req resp (hostName st) delay
mapM_ (\l -> AccessLogger.log l msg) (accessLoggers st)