packages feed

freckle-app-1.15.1.0: library/Freckle/App/Http/Header.hs

module Freckle.App.Http.Header
  ( HasHeaders (..)
  , getHeaderCsv
  , lookupHeader

    -- * Utilities
  , splitHeader
  ) where

import Freckle.App.Prelude

import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS8
import Data.Char (isSpace)
import Network.HTTP.Client (Request, Response, requestHeaders, responseHeaders)
import Network.HTTP.Simple (getRequestHeader, getResponseHeader)
import Network.HTTP.Types.Header (Header, HeaderName)

class HasHeaders a where
  getHeaders :: a -> [Header]

  getHeader :: HeaderName -> a -> [ByteString]
  getHeader h = map snd . filter ((== h) . fst) . getHeaders

instance HasHeaders [Header] where
  getHeaders = id

instance HasHeaders Request where
  getHeaders = requestHeaders
  getHeader = getRequestHeader

instance HasHeaders (Response body) where
  getHeaders = responseHeaders
  getHeader = getResponseHeader

getHeaderCsv :: HasHeaders a => HeaderName -> a -> [ByteString]
getHeaderCsv hn = concatMap splitHeader . getHeader hn

splitHeader :: ByteString -> [ByteString]
splitHeader = map trimSpace . BS8.split ','

trimSpace :: ByteString -> ByteString
trimSpace = BS8.dropWhile isSpace . BS8.dropWhileEnd isSpace

lookupHeader :: HasHeaders a => HeaderName -> a -> Maybe ByteString
lookupHeader h = listToMaybe . getHeader h