on master help sign in
Merge pull request #585 from axman6/axman6/get-headers-581

Replace use of ToByteString with HttpApiData for GetHeaders

commit29af0bbdf93f7c3005f26f335991ddfbeb9f39ab authorJulian Arni <jkarni@gmail.com> dateTue 6 Sep 2016, 20:59 (10 years ago) parentbf824a33e70436
9 files changed+20−25
servant-docs/servant-docs.cabal−2 servant-docs/src/Servant/Docs/Internal.hs+2−3 servant-mock/servant-mock.cabal−1 servant-mock/test/Servant/MockSpec.hs+5−4 servant-server/servant-server.cabal−1 servant-server/test/Servant/ServerSpec.hs−1 servant/CHANGELOG.md+1 servant/servant.cabal−1 servant/src/Servant/API/ResponseHeaders.hs+12−12
servant-docs/servant-docs.cabal−2
@@ -36,7 +36,6 @@ library
3636 , aeson
3737 , aeson-pretty
3838 , bytestring
39− , bytestring-conversion
4039 , case-insensitive
4140 , hashable
4241 , http-media >= 0.6
@@ -61,7 +60,6 @@ executable greet-docs
6160 build-depends:
6261 base
6362 , aeson
64− , bytestring-conversion
6563 , lens
6664 , servant
6765 , servant-docs
servant-docs/src/Servant/Docs/Internal.hs+2−3
@@ -25,7 +25,6 @@ import Control.Arrow (second)
2525import Control.Lens (makeLenses, mapped, over, traversed, view, (%~),
2626 (&), (.~), (<>~), (^.), (|>))
2727import qualified Control.Monad.Omega as Omega
28−import Data.ByteString.Conversion (ToByteString, toByteString)
2928import Data.ByteString.Lazy.Char8 (ByteString)
3029import qualified Data.ByteString.Char8 as BSC
3130import qualified Data.CaseInsensitive as CI
@@ -461,12 +460,12 @@ class AllHeaderSamples ls where
461460instance AllHeaderSamples '[] where
462461 allHeaderToSample _ = []
463462
464−instance (ToByteString l, AllHeaderSamples ls, ToSample l, KnownSymbol h)
463+instance (ToHttpApiData l, AllHeaderSamples ls, ToSample l, KnownSymbol h)
465464 => AllHeaderSamples (Header h l ': ls) where
466465 allHeaderToSample _ = mkHeader (toSample (Proxy :: Proxy l)) :
467466 allHeaderToSample (Proxy :: Proxy ls)
468467 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)
470469 mkHeader Nothing = (headerName, "<no header sample provided>")
471470
472471-- | 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
6969 servant-server,
7070 servant-mock,
7171 aeson,
72− bytestring-conversion,
7372 wai
servant-mock/test/Servant/MockSpec.hs+5−4
@@ -8,9 +8,7 @@
88module Servant.MockSpec where
99
1010import Data.Aeson as Aeson
11−import Data.ByteString.Conversion.To
1211import Data.Proxy
13−import Data.String
1412import GHC.Generics
1513import Network.Wai
1614import Servant.API
@@ -40,8 +38,11 @@ data TestHeader
4038 | ArbitraryHeader
4139 deriving (Show)
4240
43−instance ToByteString TestHeader where
44− builder = fromString . show
41+instance ToHttpApiData TestHeader where
42+ toHeader = toHeader . show
43+ toUrlPiece = toUrlPiece . show
44+ toQueryParam = toQueryParam . show
45+
4546
4647instance Arbitrary TestHeader where
4748 arbitrary = return ArbitraryHeader
servant-server/servant-server.cabal−1
@@ -114,7 +114,6 @@ test-suite spec
114114 , aeson
115115 , base64-bytestring
116116 , bytestring
117− , bytestring-conversion
118117 , directory
119118 , exceptions
120119 , hspec == 2.*
servant-server/test/Servant/ServerSpec.hs−1
@@ -17,7 +17,6 @@ import Control.Monad (forM_, when, unless)
1717import Control.Monad.Trans.Except (throwE)
1818import Data.Aeson (FromJSON, ToJSON, decode', encode)
1919import qualified Data.ByteString.Base64 as Base64
20−import Data.ByteString.Conversion ()
2120import Data.Char (toUpper)
2221import Data.Monoid
2322import Data.Proxy (Proxy (Proxy))
servant/CHANGELOG.md+1
@@ -2,6 +2,7 @@
22----
33
44* 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`
56
670.8
78---
servant/servant.cabal−1
@@ -54,7 +54,6 @@ library
5454 , aeson >= 0.7 && < 1.1
5555 , attoparsec >= 0.12 && < 0.14
5656 , bytestring >= 0.10 && < 0.11
57− , bytestring-conversion >= 0.3 && < 0.4
5857 , case-insensitive >= 1.2 && < 1.3
5958 , http-api-data >= 0.1 && < 0.3
6059 , http-media >= 0.4 && < 0.7
servant/src/Servant/API/ResponseHeaders.hs+12−12
@@ -31,8 +31,8 @@ module Servant.API.ResponseHeaders
3131 ) where
3232
3333import Data.ByteString.Char8 as BS (pack, unlines, init)
34−import Data.ByteString.Conversion (ToByteString, toByteString',
35− FromByteString, fromByteString)
34+import Web.HttpApiData (ToHttpApiData, toHeader,
35+ FromHttpApiData, parseHeader)
3636import qualified Data.CaseInsensitive as CI
3737import Data.Proxy
3838import GHC.TypeLits (KnownSymbol, symbolVal)
@@ -68,17 +68,17 @@ class BuildHeadersTo hs where
6868instance OVERLAPPING_ BuildHeadersTo '[] where
6969 buildHeadersTo _ = HNil
7070
71−instance OVERLAPPABLE_ ( FromByteString v, BuildHeadersTo xs, KnownSymbol h )
71+instance OVERLAPPABLE_ ( FromHttpApiData v, BuildHeadersTo xs, KnownSymbol h )
7272 => BuildHeadersTo ((Header h v) ': xs) where
7373 buildHeadersTo headers =
7474 let wantedHeader = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
7575 matching = snd <$> filter (\(h, _) -> h == wantedHeader) headers
7676 in case matching of
7777 [] -> MissingHeader `HCons` buildHeadersTo headers
78− xs -> case fromByteString (BS.init $ BS.unlines xs) of
79− Nothing -> UndecodableHeader (BS.init $ BS.unlines xs)
78+ xs -> case parseHeader (BS.init $ BS.unlines xs) of
79+ Left _err -> UndecodableHeader (BS.init $ BS.unlines xs)
8080 `HCons` buildHeadersTo headers
81− Just h -> Header h `HCons` buildHeadersTo headers
81+ Right h -> Header h `HCons` buildHeadersTo headers
8282
8383-- * Getting
8484
@@ -88,18 +88,18 @@ class GetHeaders ls where
8888instance OVERLAPPING_ GetHeaders (HList '[]) where
8989 getHeaders _ = []
9090
91−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs) )
91+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData x, GetHeaders (HList xs) )
9292 => GetHeaders (HList (Header h x ': xs)) where
9393 getHeaders hdrs = case hdrs of
94− Header val `HCons` rest -> (headerName , toByteString' val):getHeaders rest
95− UndecodableHeader h `HCons` rest -> (headerName, h) : getHeaders rest
94+ Header val `HCons` rest -> (headerName , toHeader val):getHeaders rest
95+ UndecodableHeader h `HCons` rest -> (headerName, h) :getHeaders rest
9696 MissingHeader `HCons` rest -> getHeaders rest
9797 where headerName = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
9898
9999instance OVERLAPPING_ GetHeaders (Headers '[] a) where
100100 getHeaders _ = []
101101
102−instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToByteString v )
102+instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToHttpApiData v )
103103 => GetHeaders (Headers (Header h v ': rest) a) where
104104 getHeaders hs = getHeaders $ getHeadersHList hs
105105
@@ -111,11 +111,11 @@ class AddHeader h v orig new
111111 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
112112
113113
114−instance OVERLAPPING_ ( KnownSymbol h, ToByteString v )
114+instance OVERLAPPING_ ( KnownSymbol h, ToHttpApiData v )
115115 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
116116 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
117117
118−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString v
118+instance OVERLAPPABLE_ ( KnownSymbol h, ToHttpApiData v
119119 , new ~ (Headers '[Header h v] a) )
120120 => AddHeader h v a new where
121121 addHeader a resp = Headers resp (HCons (Header a) HNil)