@@ -14,7 +14,6 @@ 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
1817import Data.String
1918import Data.String.Conversions
2019import Data.Text
@@ -85,7 +84,7 @@ reqToRequest req (BaseUrl reqScheme reqHost reqPort) =
8584 setrqb r = case (reqBody req) of
8685 Nothing -> r
8786 Just (b,t) -> r { requestBody = RequestBodyLBS b
88− , requestHeaders = [(hContentType, BS.pack . show $ t)] }
87+ , requestHeaders = [(hContentType, cs . show $ t)] }
8988 setQS = setQueryString $ queryTextToQuery (qs req)
9089 setheaders r = r { requestHeaders = requestHeaders r
9190 ++ Prelude.map toProperHeader (headers req) }
@@ -110,7 +109,7 @@ displayHttpRequest :: Method -> String
110109displayHttpRequest httpmethod = "HTTP " ++ cs httpmethod ++ " request"
111110
112111
113−performRequest :: Method -> Req -> (Int -> Bool) -> BaseUrl -> EitherT String IO (Int, ByteString)
112+performRequest :: Method -> Req -> (Int -> Bool) -> BaseUrl -> EitherT String IO (Int, ByteString, MediaType)
114113performRequest reqMethod req isWantedStatus reqHost = do
115114 partialRequest <- liftIO $ reqToRequest req reqHost
116115
@@ -129,7 +128,12 @@ performRequest reqMethod req isWantedStatus reqHost = do
129128 let status = Client.responseStatus response
130129 unless (isWantedStatus (statusCode status)) $
131130 left (displayHttpRequest reqMethod ++ " failed with status: " ++ showStatus status)
132− return $ (statusCode status, Client.responseBody response)
131+ ct <- case lookup "Content-Type" $ Client.responseHeaders response of
132+ Nothing -> pure $ "application"//"octet-stream"
133+ Just t -> case parseAccept t of
134+ Nothing -> left $ "invalid Content-Type header: " <> cs t
135+ Just t' -> pure t'
136+ return $ (statusCode status, Client.responseBody response, ct)
133137 where
134138 showStatus (Status code message) =
135139 show code ++ " - " ++ cs message
@@ -138,7 +142,7 @@ performRequest reqMethod req isWantedStatus reqHost = do
138142performRequestJSON :: FromJSON result =>
139143 Method -> Req -> Int -> BaseUrl -> EitherT String IO result
140144performRequestJSON reqMethod req wantedStatus reqHost = do
141− (_status, respBody) <- performRequest reqMethod req (== wantedStatus) reqHost
145+ (_status, respBody, _) <- performRequest reqMethod req (== wantedStatus) reqHost
142146 either
143147 (\ message -> left (displayHttpRequest reqMethod ++ " returned invalid json: " ++ message))
144148 return