on master help sign in
Correctly set the content type for ReqBody
commit7a1eac4e8662c41f279f447c7a44f3a8974c7581 authorTimo von Holtz <tvh@anchor.com.au> dateTue 17 Feb 2015, 10:05 (12 years ago) parent8ef4b5d
3 files changed+15−7
servant-client.cabal+1 src/Servant/Client.hs+2−1 src/Servant/Common/Req.hs+12−6
servant-client.cabal+1
@@ -45,6 +45,7 @@ library
4545 , exceptions
4646 , http-client
4747 , http-client-tls
48+ , http-media
4849 , http-types
4950 , network-uri >= 2.6
5051 , safe
src/Servant/Client.hs+2−1
@@ -22,6 +22,7 @@ import Data.Proxy
2222import Data.String.Conversions
2323import Data.Text (unpack)
2424import GHC.TypeLits
25+import Network.HTTP.Media
2526import qualified Network.HTTP.Types as H
2627import Servant.API
2728import Servant.Common.BaseUrl
@@ -443,7 +444,7 @@ instance (ToJSON a, HasClient sublayout)
443444
444445 clientWithRoute Proxy req body =
445446 clientWithRoute (Proxy :: Proxy sublayout) $
446− setRQBody (encode body) req
447+ setRQBody (encode body) ("application" // "json" /: ("charset", "utf-8")) req
447448
448449-- | Make the querying function append @path@ to the request path.
449450instance (KnownSymbol path, HasClient sublayout) => HasClient (path :> sublayout) where
src/Servant/Common/Req.hs+12−6
@@ -14,12 +14,14 @@ import Data.Aeson.Parser
1414import Data.Aeson.Types
1515import Data.Attoparsec.ByteString
1616import Data.ByteString.Lazy hiding (pack)
17+import qualified Data.ByteString.Char8 as BS
1718import Data.String
1819import Data.String.Conversions
1920import Data.Text
2021import Data.Text.Encoding
2122import Network.HTTP.Client
2223import Network.HTTP.Client.TLS
24+import Network.HTTP.Media
2325import Network.HTTP.Types
2426import Network.URI
2527import Servant.Common.BaseUrl
@@ -31,12 +33,12 @@ import qualified Network.HTTP.Client as Client
3133data Req = Req
3234 { reqPath :: String
3335 , qs :: QueryText
34− , reqBody :: ByteString
36+ , reqBody :: Maybe (ByteString, MediaType)
3537 , headers :: [(String, Text)]
3638 }
3739
3840defReq :: Req
39−defReq = Req "" [] "" []
41+defReq = Req "" [] Nothing []
4042
4143appendToPath :: String -> Req -> Req
4244appendToPath p req =
@@ -62,8 +64,8 @@ addHeader name val req = req { headers = headers req
6264 ++ [(name, toText val)]
6365 }
6466
65−setRQBody :: ByteString -> Req -> Req
66−setRQBody b req = req { reqBody = b }
67+setRQBody :: ByteString -> MediaType -> Req -> Req
68+setRQBody b t req = req { reqBody = Just (b, t) }
6769
6870reqToRequest :: (Functor m, MonadThrow m) => Req -> BaseUrl -> m Request
6971reqToRequest req (BaseUrl reqScheme reqHost reqPort) =
@@ -80,9 +82,13 @@ reqToRequest req (BaseUrl reqScheme reqHost reqPort) =
8082 , uriPath = reqPath req
8183 }
8284
83− setrqb r = r { requestBody = RequestBodyLBS (reqBody req) }
85+ setrqb r = case (reqBody req) of
86+ Nothing -> r
87+ Just (b,t) -> r { requestBody = RequestBodyLBS b
88+ , requestHeaders = [(hContentType, BS.pack . show $ t)] }
8489 setQS = setQueryString $ queryTextToQuery (qs req)
85− setheaders r = r { requestHeaders = Prelude.map toProperHeader (headers req) }
90+ setheaders r = r { requestHeaders = requestHeaders r
91+ ++ Prelude.map toProperHeader (headers req) }
8692
8793 toProperHeader (name, val) =
8894 (fromString name, encodeUtf8 val)