@@ -14,7 +14,6 @@ import Data.Aeson.Parser
14import Data.Aeson.Types
14import Data.Aeson.Types
15import Data.Attoparsec.ByteString
15import Data.Attoparsec.ByteString
16import Data.ByteString.Lazy hiding (pack)
16import Data.ByteString.Lazy hiding (pack)
17−import qualified Data.ByteString.Char8 as BS
18import Data.String
17import Data.String
19import Data.String.Conversions
18import Data.String.Conversions
20import Data.Text
19import Data.Text
@@ -85,7 +84,7 @@ reqToRequest req (BaseUrl reqScheme reqHost reqPort) =
85 setrqb r = case (reqBody req) of
84 setrqb r = case (reqBody req) of
86 Nothing -> r
85 Nothing -> r
87 Just (b,t) -> r { requestBody = RequestBodyLBS b
86 Just (b,t) -> r { requestBody = RequestBodyLBS b
88− , requestHeaders = [(hContentType, BS.pack . show $ t)] }
87+ , requestHeaders = [(hContentType, cs . show $ t)] }
89 setQS = setQueryString $ queryTextToQuery (qs req)
88 setQS = setQueryString $ queryTextToQuery (qs req)
90 setheaders r = r { requestHeaders = requestHeaders r
89 setheaders r = r { requestHeaders = requestHeaders r
91 ++ Prelude.map toProperHeader (headers req) }
90 ++ Prelude.map toProperHeader (headers req) }
@@ -110,7 +109,7 @@ displayHttpRequest :: Method -> String
110displayHttpRequest httpmethod = "HTTP " ++ cs httpmethod ++ " request"
109displayHttpRequest httpmethod = "HTTP " ++ cs httpmethod ++ " request"
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)
114performRequest reqMethod req isWantedStatus reqHost = do
113performRequest reqMethod req isWantedStatus reqHost = do
115 partialRequest <- liftIO $ reqToRequest req reqHost
114 partialRequest <- liftIO $ reqToRequest req reqHost
@@ -129,7 +128,12 @@ performRequest reqMethod req isWantedStatus reqHost = do
129 let status = Client.responseStatus response
128 let status = Client.responseStatus response
130 unless (isWantedStatus (statusCode status)) $
129 unless (isWantedStatus (statusCode status)) $
131 left (displayHttpRequest reqMethod ++ " failed with status: " ++ showStatus status)
130 left (displayHttpRequest reqMethod ++ " failed with status: " ++ showStatus status)
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
132− return $ (statusCode status, Client.responseBody response)
136+ return $ (statusCode status, Client.responseBody response, ct)
134 showStatus (Status code message) =
138 showStatus (Status code message) =
135 show code ++ " - " ++ cs message
139 show code ++ " - " ++ cs message
@@ -138,7 +142,7 @@ performRequest reqMethod req isWantedStatus reqHost = do
138performRequestJSON :: FromJSON result =>
142performRequestJSON :: FromJSON result =>
139 Method -> Req -> Int -> BaseUrl -> EitherT String IO result
143 Method -> Req -> Int -> BaseUrl -> EitherT String IO result
140performRequestJSON reqMethod req wantedStatus reqHost = do
144performRequestJSON reqMethod req wantedStatus reqHost = do
141− (_status, respBody) <- performRequest reqMethod req (== wantedStatus) reqHost
145+ (_status, respBody, _) <- performRequest reqMethod req (== wantedStatus) reqHost
143 (\ message -> left (displayHttpRequest reqMethod ++ " returned invalid json: " ++ message))
147 (\ message -> left (displayHttpRequest reqMethod ++ " returned invalid json: " ++ message))