on master help sign in
Replace use of ToByteString with HttpApiData for GetHeaders, fixes servant/#581
a1b2301Alex Mason
servant-mock/test/Servant/MockSpec.hs+5−4
@@ -8,9 +8,7 @@
8module Servant.MockSpec where
8module Servant.MockSpec where
9
9
10import Data.Aeson as Aeson
10import Data.Aeson as Aeson
11−import Data.ByteString.Conversion.To
12import Data.Proxy
11import Data.Proxy
13−import Data.String
14import GHC.Generics
12import GHC.Generics
15import Network.Wai
13import Network.Wai
16import Servant.API
14import Servant.API
@@ -40,8 +38,11 @@ data TestHeader
40 | ArbitraryHeader
38 | ArbitraryHeader
41 deriving (Show)
39 deriving (Show)
42
40
43−instance ToByteString TestHeader where
41+instance ToHttpApiData TestHeader where
44− builder = fromString . show
42+ toHeader = toHeader . show
43+ toUrlPiece _ = error "ToHttpApiData.toUrlPiece not implemented for TestHeader"
44+ toQueryParam _ = error "ToHttpApiData.toQueryParam not implemented for TestHeader"
45+
45
46
46instance Arbitrary TestHeader where
47instance Arbitrary TestHeader where
47 arbitrary = return ArbitraryHeader
48 arbitrary = return ArbitraryHeader
servant/CHANGELOG.md+1
@@ -2,6 +2,7 @@ next
2----
2----
3
3
4* Add `CaptureAll` combinator. Captures all of the remaining segments in a URL.
4* Add `CaptureAll` combinator. Captures all of the remaining segments in a URL.
5+* replace use of `ToByteString` with `HttpApiData` for `GetHeaders`
5
6
60.8
70.8
7---
8---
servant/servant.cabal+1−1
@@ -1,5 +1,5 @@
1name: servant
1name: servant
2−version: 0.8
2+version: 0.8.1
3synopsis: A family of combinators for defining webservices APIs
3synopsis: A family of combinators for defining webservices APIs
4description:
4description:
5 A family of combinators for defining webservices APIs and serving them
5 A family of combinators for defining webservices APIs and serving them
servant/src/Servant/API/ResponseHeaders.hs+8−7
@@ -31,8 +31,9 @@ module Servant.API.ResponseHeaders
31 ) where
31 ) where
32
32
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 Data.ByteString.Conversion (--ToByteString, toByteString',
35 FromByteString, fromByteString)
35 FromByteString, fromByteString)
36+import Web.HttpApiData (ToHttpApiData,toHeader)
36import qualified Data.CaseInsensitive as CI
37import qualified Data.CaseInsensitive as CI
37import Data.Proxy
38import Data.Proxy
38import GHC.TypeLits (KnownSymbol, symbolVal)
39import GHC.TypeLits (KnownSymbol, symbolVal)
@@ -88,18 +89,18 @@ class GetHeaders ls where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
89instance OVERLAPPING_ GetHeaders (HList '[]) where
89 getHeaders _ = []
90 getHeaders _ = []
90
91
91−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs) )
92+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData x, GetHeaders (HList xs) )
92 => GetHeaders (HList (Header h x ': xs)) where
93 => GetHeaders (HList (Header h x ': xs)) where
93 getHeaders hdrs = case hdrs of
94 getHeaders hdrs = case hdrs of
94− Header val `HCons` rest -> (headerName , toByteString' val):getHeaders rest
95+ Header val `HCons` rest -> (headerName , toHeader val):getHeaders rest
95− UndecodableHeader h `HCons` rest -> (headerName, h) : getHeaders rest
96+ UndecodableHeader h `HCons` rest -> (headerName, h) :getHeaders rest
96 MissingHeader `HCons` rest -> getHeaders rest
97 MissingHeader `HCons` rest -> getHeaders rest
97 where headerName = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
98 where headerName = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
98
99
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
100instance OVERLAPPING_ GetHeaders (Headers '[] a) where
100 getHeaders _ = []
101 getHeaders _ = []
101
102
102−instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToByteString v )
103+instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToHttpApiData v )
103 => GetHeaders (Headers (Header h v ': rest) a) where
104 => GetHeaders (Headers (Header h v ': rest) a) where
104 getHeaders hs = getHeaders $ getHeadersHList hs
105 getHeaders hs = getHeaders $ getHeadersHList hs
105
106
@@ -111,11 +112,11 @@ class AddHeader h v orig new
111 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
112 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
112
113
113
114
114−instance OVERLAPPING_ ( KnownSymbol h, ToByteString v )
115+instance OVERLAPPING_ ( KnownSymbol h, ToHttpApiData v )
115 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
116 => 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)
117 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
117
118
118−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString v
119+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData v
119 , new ~ (Headers '[Header h v] a) )
120 , new ~ (Headers '[Header h v] a) )
120 => AddHeader h v a new where
121 => AddHeader h v a new where
121 addHeader a resp = Headers resp (HCons (Header a) HNil)
122 addHeader a resp = Headers resp (HCons (Header a) HNil)