git.iko.soy/typeable/servant
on master help sign in
Merge pull request #585 from axman6/axman6/get-headers-581
29af0bbJulian Arni
servant-docs/servant-docs.cabal−2
@@ -36,7 +36,6 @@ library
36 , aeson
36 , aeson
37 , aeson-pretty
37 , aeson-pretty
38 , bytestring
38 , bytestring
39− , bytestring-conversion
40 , case-insensitive
39 , case-insensitive
41 , hashable
40 , hashable
42 , http-media >= 0.6
41 , http-media >= 0.6
@@ -61,7 +60,6 @@ executable greet-docs
61 build-depends:
60 build-depends:
62 base
61 base
63 , aeson
62 , aeson
64− , bytestring-conversion
65 , lens
63 , lens
66 , servant
64 , servant
67 , servant-docs
65 , servant-docs
servant-docs/src/Servant/Docs/Internal.hs+2−3
@@ -25,7 +25,6 @@ import Control.Arrow (second)
25import Control.Lens (makeLenses, mapped, over, traversed, view, (%~),
25import Control.Lens (makeLenses, mapped, over, traversed, view, (%~),
26 (&), (.~), (<>~), (^.), (|>))
26 (&), (.~), (<>~), (^.), (|>))
27import qualified Control.Monad.Omega as Omega
27import qualified Control.Monad.Omega as Omega
28−import Data.ByteString.Conversion (ToByteString, toByteString)
29import Data.ByteString.Lazy.Char8 (ByteString)
28import Data.ByteString.Lazy.Char8 (ByteString)
30import qualified Data.ByteString.Char8 as BSC
29import qualified Data.ByteString.Char8 as BSC
31import qualified Data.CaseInsensitive as CI
30import qualified Data.CaseInsensitive as CI
@@ -461,12 +460,12 @@ class AllHeaderSamples ls where
461instance AllHeaderSamples '[] where
460instance AllHeaderSamples '[] where
462 allHeaderToSample _ = []
461 allHeaderToSample _ = []
463
462
464−instance (ToByteString l, AllHeaderSamples ls, ToSample l, KnownSymbol h)
463+instance (ToHttpApiData l, AllHeaderSamples ls, ToSample l, KnownSymbol h)
465 => AllHeaderSamples (Header h l ': ls) where
464 => AllHeaderSamples (Header h l ': ls) where
466 allHeaderToSample _ = mkHeader (toSample (Proxy :: Proxy l)) :
465 allHeaderToSample _ = mkHeader (toSample (Proxy :: Proxy l)) :
467 allHeaderToSample (Proxy :: Proxy ls)
466 allHeaderToSample (Proxy :: Proxy ls)
468 where headerName = CI.mk . cs $ symbolVal (Proxy :: Proxy h)
467 where headerName = CI.mk . cs $ symbolVal (Proxy :: Proxy h)
469− mkHeader (Just x) = (headerName, cs $ toByteString x)
468+ mkHeader (Just x) = (headerName, cs $ toHeader x)
470 mkHeader Nothing = (headerName, "<no header sample provided>")
469 mkHeader Nothing = (headerName, "<no header sample provided>")
471
470
472-- | Synthesise a sample value of a type, encoded in the specified media types.
471-- | Synthesise a sample value of a type, encoded in the specified media types.
servant-mock/servant-mock.cabal−1
@@ -69,5 +69,4 @@ test-suite spec
69 servant-server,
69 servant-server,
70 servant-mock,
70 servant-mock,
71 aeson,
71 aeson,
72− bytestring-conversion,
73 wai
72 wai
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 = toUrlPiece . show
44+ toQueryParam = toQueryParam . show
45+
45
46
46instance Arbitrary TestHeader where
47instance Arbitrary TestHeader where
47 arbitrary = return ArbitraryHeader
48 arbitrary = return ArbitraryHeader
servant-server/servant-server.cabal−1
@@ -114,7 +114,6 @@ test-suite spec
114 , aeson
114 , aeson
115 , base64-bytestring
115 , base64-bytestring
116 , bytestring
116 , bytestring
117− , bytestring-conversion
118 , directory
117 , directory
119 , exceptions
118 , exceptions
120 , hspec == 2.*
119 , hspec == 2.*
servant-server/test/Servant/ServerSpec.hs−1
@@ -17,7 +17,6 @@ import Control.Monad (forM_, when, unless)
17import Control.Monad.Trans.Except (throwE)
17import Control.Monad.Trans.Except (throwE)
18import Data.Aeson (FromJSON, ToJSON, decode', encode)
18import Data.Aeson (FromJSON, ToJSON, decode', encode)
19import qualified Data.ByteString.Base64 as Base64
19import qualified Data.ByteString.Base64 as Base64
20−import Data.ByteString.Conversion ()
21import Data.Char (toUpper)
20import Data.Char (toUpper)
22import Data.Monoid
21import Data.Monoid
23import Data.Proxy (Proxy (Proxy))
22import Data.Proxy (Proxy (Proxy))
servant/CHANGELOG.md+1
@@ -2,6 +2,7 @@
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+* BACKWARDS INCOMPATIBLE replace use of `ToFromByteString` with `To/FromHttpApiData` for `GetHeaders/BuildHeadersTo`
5
6
60.8
70.8
7---
8---
servant/servant.cabal−1
@@ -54,7 +54,6 @@ library
54 , aeson >= 0.7 && < 1.1
54 , aeson >= 0.7 && < 1.1
55 , attoparsec >= 0.12 && < 0.14
55 , attoparsec >= 0.12 && < 0.14
56 , bytestring >= 0.10 && < 0.11
56 , bytestring >= 0.10 && < 0.11
57− , bytestring-conversion >= 0.3 && < 0.4
58 , case-insensitive >= 1.2 && < 1.3
57 , case-insensitive >= 1.2 && < 1.3
59 , http-api-data >= 0.1 && < 0.3
58 , http-api-data >= 0.1 && < 0.3
60 , http-media >= 0.4 && < 0.7
59 , http-media >= 0.4 && < 0.7
servant/src/Servant/API/ResponseHeaders.hs+12−12
@@ -31,8 +31,8 @@ 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 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
70
70
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
82
82
83-- * Getting
83-- * Getting
84
84
@@ -88,18 +88,18 @@ class GetHeaders ls where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
89 getHeaders _ = []
89 getHeaders _ = []
90
90
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)
98
98
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
100 getHeaders _ = []
100 getHeaders _ = []
101
101
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
105
105
@@ -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
112
112
113
113
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)
117
117
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)