{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Network.Gitit.Server
( module Happstack.Server
, withExpiresHeaders
, setContentType
, setFilename
, lookupIPAddr
, getHost
, compressedResponseFilter
)
where
import Happstack.Server
import Happstack.Server.Compression (compressedResponseFilter)
import Network.Socket (getAddrInfo, defaultHints, addrAddress)
import Control.Monad.Reader
import Data.ByteString.UTF8 as U hiding (lines)
withExpiresHeaders :: ServerMonad m => m Response -> m Response
= forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (forall r. HasHeaders r => String -> String -> r -> r
setHeader String
"Cache-Control" String
"max-age=21600")
setContentType :: String -> Response -> Response
setContentType :: String -> Response -> Response
setContentType = forall r. HasHeaders r => String -> String -> r -> r
setHeader String
"Content-Type"
setFilename :: String -> Response -> Response
setFilename :: String -> Response -> Response
setFilename = forall r. HasHeaders r => String -> String -> r -> r
setHeader String
"Content-Disposition" forall b c a. (b -> c) -> (a -> b) -> a -> c
. \String
fname -> String
"attachment; filename=\"" forall a. [a] -> [a] -> [a]
++ String
fname forall a. [a] -> [a] -> [a]
++ String
"\""
lookupIPAddr :: String -> IO (Maybe String)
lookupIPAddr :: String -> IO (Maybe String)
lookupIPAddr String
hostname = do
[AddrInfo]
addrs <- Maybe AddrInfo -> Maybe String -> Maybe String -> IO [AddrInfo]
getAddrInfo (forall a. a -> Maybe a
Just AddrInfo
defaultHints) (forall a. a -> Maybe a
Just String
hostname) forall a. Maybe a
Nothing
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null [AddrInfo]
addrs
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Eq a => a -> a -> Bool
/=Char
':') forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ AddrInfo -> SockAddr
addrAddress forall a b. (a -> b) -> a -> b
$ case [AddrInfo]
addrs of
[] -> forall a. HasCallStack => String -> a
error String
"lookupIPAddr, no addrs"
(AddrInfo
x:[AddrInfo]
_) -> AddrInfo
x
getHost :: ServerMonad m => m (Maybe String)
getHost :: forall (m :: * -> *). ServerMonad m => m (Maybe String)
getHost = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> String
U.toString)) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *).
ServerMonad m =>
String -> m (Maybe ByteString)
getHeaderM String
"Host"