salvia-protocol-1.0.0: src/Network/Protocol/Http/Headers.hs
{-# LANGUAGE TypeOperators #-}
module Network.Protocol.Http.Headers where {- doc ok -}
import Control.Category
import Control.Monad
import Data.Record.Label
import Network.Protocol.Http.Data
import Network.Protocol.Uri.Query
import Prelude hiding ((.), id)
import Safe
-- | Access the /Content-Length/ header field.
contentLength :: (Read i, Integral i) => Http a :-> Maybe i
contentLength = (join . fmap readMay <-> fmap show) `iso` header "Content-Length"
-- | Access the /Connection/ header field.
connection :: Http a :-> Maybe String
connection = header "Connection"
-- | Access the /Accept/ header field.
accept :: Http a :-> Maybe Parameters
accept = lmap (keyValues "," ";") `iso` header "Accept"
-- | Access the /Accept-Encoding/ header field.
acceptEncoding :: Http a :-> Maybe [String]
acceptEncoding = lmap (values ",") `iso` header "Accept-Encoding"
-- | Access the /Accept-Language/ header field.
acceptLanguage :: Http a :-> Maybe [String]
acceptLanguage = lmap (values ",") `iso` header "Accept-Language"
-- | Access the /Connection/ header field.
cacheControl :: Http a :-> Maybe String
cacheControl = header "Cache-Control"
-- | Access the /Keep-Alive/ header field.
keepAlive :: (Read i, Integral i) => Http a :-> Maybe i
keepAlive = (join . fmap readMay <-> fmap show) `iso` header "Keep-Alive"
-- | Access the /Cookie/ header field.
cookie :: Http Request :-> Maybe String
cookie = header "Cookie"
-- | Access the /Set-Cookie/ header field.
setCookie :: Http Response :-> Maybe String
setCookie = header "Set-Cookie"
-- | Access the /Location/ header field.
location :: Http a :-> Maybe String
location = header "Location"
-- | Access the /Content-Type/ header field. The content-type will be parsed
-- into a mimetype and optional charset.
contentType :: Http a :-> Maybe (String, Maybe String)
contentType =
(parser <-> fmap printer)
`iso` lmap (keyValues ";" "=")
`iso` header "Content-Type"
where
printer (x, y) = (x, Nothing) : maybe [] (\z -> [("charset", Just z)]) y
parser (Just ((m, Nothing):("charset", c):_)) = Just (m, c)
parser _ = Nothing
-- | Access the /Date/ header field.
date :: Http a :-> Maybe String
date = header "Date"
-- | Access the /Host/ header field.
hostname :: Http a :-> Maybe String
hostname = header "Host"
-- | Access the /Server/ header field.
server :: Http a :-> Maybe String
server = header "Server"
-- | Access the /User-Agent/ header field.
userAgent :: Http a :-> Maybe String
userAgent = header "User-Agent"
-- | Access the /Upgrade/ header field.
upgrade :: Http a :-> Maybe String
upgrade = header "Upgrade"
-- | Access the /Last-Modified/ header field.
lastModified :: Http a :-> Maybe Value
lastModified = header "Last-Modified"
-- | Access the /Accept-Ranges/ header field.
acceptRanges :: Http a :-> Maybe Value
acceptRanges = header "Accept-Ranges"
-- | Access the /ETag/ header field.
eTag :: Http a :-> Maybe Value
eTag = header "ETag"