@@ -31,8 +31,8 @@ module Servant.API.ResponseHeaders
33import Data.ByteString.Char8 as BS (pack, unlines, init)
33import Data.ByteString.Char8 as BS (pack, unlines, init)
34−import Data.ByteString.Conversion (ToByteString, toByteString',
34+import Web.HttpApiData (ToHttpApiData, toHeader,
35− FromByteString, fromByteString)
35+ FromHttpApiData, parseHeader)
36import qualified Data.CaseInsensitive as CI
36import qualified Data.CaseInsensitive as CI
37import Data.Proxy
37import Data.Proxy
38import GHC.TypeLits (KnownSymbol, symbolVal)
38import GHC.TypeLits (KnownSymbol, symbolVal)
@@ -68,17 +68,17 @@ class BuildHeadersTo hs where
68instance OVERLAPPING_ BuildHeadersTo '[] where
68instance OVERLAPPING_ BuildHeadersTo '[] where
69 buildHeadersTo _ = HNil
69 buildHeadersTo _ = HNil
71−instance OVERLAPPABLE_ ( FromByteString v, BuildHeadersTo xs, KnownSymbol h )
71+instance OVERLAPPABLE_ ( FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h )
72 => BuildHeadersTo ((Header h v) ': xs) where
72 => BuildHeadersTo ((Header h v) ': xs) where
73 buildHeadersTo headers =
73 buildHeadersTo headers =
74 let wantedHeader = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
74 let wantedHeader = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
75 matching = snd <$> filter (\(h, _) -> h == wantedHeader) headers
75 matching = snd <$> filter (\(h, _) -> h == wantedHeader) headers
76 in case matching of
76 in case matching of
77 [] -> MissingHeader `HCons` buildHeadersTo headers
77 [] -> MissingHeader `HCons` buildHeadersTo headers
78− xs -> case fromByteString (BS.init $ BS.unlines xs) of
78+ xs -> case parseHeader (BS.init $ BS.unlines xs) of
79− Nothing -> UndecodableHeader (BS.init $ BS.unlines xs)
79+ Left _err -> UndecodableHeader (BS.init $ BS.unlines xs)
80 `HCons` buildHeadersTo headers
80 `HCons` buildHeadersTo headers
81− Just h -> Header h `HCons` buildHeadersTo headers
81+ Right h -> Header h `HCons` buildHeadersTo headers
83-- * Getting
83-- * Getting
@@ -88,18 +88,18 @@ class GetHeaders ls where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
89 getHeaders _ = []
89 getHeaders _ = []
91−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs) )
91+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData x, GetHeaders (HList xs) )
92 => GetHeaders (HList (Header h x ': xs)) where
92 => GetHeaders (HList (Header h x ': xs)) where
93 getHeaders hdrs = case hdrs of
93 getHeaders hdrs = case hdrs of
94− Header val `HCons` rest -> (headerName , toByteString' val):getHeaders rest
94+ Header val `HCons` rest -> (headerName , toHeader val):getHeaders rest
95− UndecodableHeader h `HCons` rest -> (headerName, h) : getHeaders rest
95+ UndecodableHeader h `HCons` rest -> (headerName, h) :getHeaders rest
96 MissingHeader `HCons` rest -> getHeaders rest
96 MissingHeader `HCons` rest -> getHeaders rest
97 where headerName = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
97 where headerName = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
100 getHeaders _ = []
100 getHeaders _ = []
102−instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToByteString v )
102+instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToHttpApiData v )
103 => GetHeaders (Headers (Header h v ': rest) a) where
103 => GetHeaders (Headers (Header h v ': rest) a) where
104 getHeaders hs = getHeaders $ getHeadersHList hs
104 getHeaders hs = getHeaders $ getHeadersHList hs
@@ -111,11 +111,11 @@ class AddHeader h v orig new
111 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
111 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
114−instance OVERLAPPING_ ( KnownSymbol h, ToByteString v )
114+instance OVERLAPPING_ ( KnownSymbol h, ToHttpApiData v )
115 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
115 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
116 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
116 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
118−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString v
118+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData v
119 , new ~ (Headers '[Header h v] a) )
119 , new ~ (Headers '[Header h v] a) )
120 => AddHeader h v a new where
120 => AddHeader h v a new where
121 addHeader a resp = Headers resp (HCons (Header a) HNil)
121 addHeader a resp = Headers resp (HCons (Header a) HNil)