module Network.HTTP.Lucu.Headers ( Headers , HasHeaders(..) , emptyHeaders -- Headers ) where import qualified Data.ByteString.Lazy.Char8 as B import Data.ByteString.Lazy.Char8 (ByteString) import Data.Char import Data.List type Headers = [ (ByteString, ByteString) ] class HasHeaders a where getHeaders :: a -> Headers setHeaders :: a -> Headers -> a getHeader :: a -> ByteString -> Maybe ByteString getHeader a key = fmap snd $ find (noCaseEq key . fst) (getHeaders a) deleteHeader :: a -> ByteString -> a deleteHeader a key = setHeaders a $ filter (not . noCaseEq key . fst) (getHeaders a) addHeader :: a -> ByteString -> ByteString -> a addHeader a key val = setHeaders a $ (getHeaders a) ++ [(key, val)] setHeader :: a -> ByteString -> ByteString -> a setHeader a key val = let list = getHeaders a deleted = filter (not . noCaseEq key . fst) list added = deleted ++ [(key, val)] in setHeaders a added noCaseEq :: ByteString -> ByteString -> Bool noCaseEq a b = (B.map toLower a) == (B.map toLower b) emptyHeaders :: Headers emptyHeaders = []