purescript-httpurple/src/HTTPure/Headers.purs
2017-09-25 23:08:07 -07:00

57 lines
1.8 KiB
Haskell

module HTTPure.Headers
( Headers
, headers
, read
, write
) where
import Prelude
import Control.Monad.Eff as Eff
import Data.Maybe as Maybe
import Data.String as StringUtil
import Data.StrMap as StrMap
import Data.TraversableWithIndex as TraversableWithIndex
import Data.Tuple as Tuple
import Node.HTTP as HTTP
import HTTPure.Lookup as Lookup
-- | The Headers type is just sugar for a StrMap of Strings that represents the
-- | set of headers sent or received in an HTTP request or response.
newtype Headers = Headers (StrMap.StrMap String)
-- | Given a string, return the matching headers. This search is
-- | case-insensitive.
instance lookupHeaders :: Lookup.Lookup Headers String String where
lookup (Headers headers') =
Maybe.fromMaybe "" <<< flip StrMap.lookup headers' <<< StringUtil.toLower
-- | Allow a headers set to be represented as a string.
instance showHeaders :: Show Headers where
show (Headers headers') =
StrMap.foldMap showField headers' <> "\n"
where
showField key value = key <> ": " <> value <> "\n"
-- | Compare two Headers objects by comparing the underlying StrMaps.
instance eqHeaders :: Eq Headers where
eq (Headers a) (Headers b) = eq a b
-- | Get the headers out of a HTTP Request object.
read :: HTTP.Request -> Headers
read = HTTP.requestHeaders >>> Headers
-- | Given an HTTP Response and a Headers object, return an effect that will
-- | write the Headers to the Response.
write :: forall e.
HTTP.Response ->
Headers ->
Eff.Eff (http :: HTTP.HTTP | e) Unit
write response (Headers headers') = void $
TraversableWithIndex.traverseWithIndex (HTTP.setHeader response) headers'
-- | Convert an Array of Tuples of 2 Strings to a Headers object.
headers :: Array (Tuple.Tuple String String) -> Headers
headers = StrMap.fromFoldable >>> Headers