From 90292e1f62152fcfe9489b10b40d01d39a897399 Mon Sep 17 00:00:00 2001 From: Gershom Date: Mon, 6 Nov 2017 11:37:00 -0500 Subject: [PATCH] move statuscheck earlier on streaming response to give good error --- .../Servant/Client/Core/Internal/HasClient.hs | 1 - .../src/Servant/Client/Internal/HttpClient.hs | 16 ++++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/servant-client-core/src/Servant/Client/Core/Internal/HasClient.hs b/servant-client-core/src/Servant/Client/Core/Internal/HasClient.hs index 29bafb13..797f1f77 100644 --- a/servant-client-core/src/Servant/Client/Core/Internal/HasClient.hs +++ b/servant-client-core/src/Servant/Client/Core/Internal/HasClient.hs @@ -267,7 +267,6 @@ instance OVERLAPPABLE_ } return . buildFromStream $ ResultStream $ \k -> runStreamingResponse sresp $ \(status,_headers,_httpversion,reader) -> do - when (H.statusCode status /= 200) $ error "bad status" -- TODO fixme let unrender = unrenderFrames (Proxy :: Proxy framing) (Proxy :: Proxy a) loop bs = do res <- BL.fromStrict <$> reader diff --git a/servant-client/src/Servant/Client/Internal/HttpClient.hs b/servant-client/src/Servant/Client/Internal/HttpClient.hs index 94086306..a0b8fcb1 100644 --- a/servant-client/src/Servant/Client/Internal/HttpClient.hs +++ b/servant-client/src/Servant/Client/Internal/HttpClient.hs @@ -111,7 +111,7 @@ performRequest req = do Right response -> do let status = Client.responseStatus response status_code = statusCode status - ourResponse = clientResponseToReponse response + ourResponse = clientResponseToResponse response unless (status_code >= 200 && status_code < 300) $ throwError $ FailureResponse ourResponse return ourResponse @@ -121,14 +121,18 @@ performStreamingRequest req = do m <- asks manager burl <- asks baseUrl let request = requestToClientRequest burl req - return $ StreamingResponse $ \k -> Client.withResponse request m $ - \r -> - k (Client.responseStatus r, fromList $ Client.responseHeaders r, Client.responseVersion r, Client.responseBody r) + \r -> do + let status = Client.responseStatus r + status_code = statusCode status + unless (status_code >= 200 && status_code < 300) $ do + b <- BSL.fromChunks <$> Client.brConsume (Client.responseBody r) + throw $ FailureResponse $ Response status b (fromList $ Client.responseHeaders r) (Client.responseVersion r) + k (status, fromList $ Client.responseHeaders r, Client.responseVersion r, Client.responseBody r) -clientResponseToReponse :: Client.Response BSL.ByteString -> Response -clientResponseToReponse r = Response +clientResponseToResponse :: Client.Response BSL.ByteString -> Response +clientResponseToResponse r = Response { responseStatusCode = Client.responseStatus r , responseBody = Client.responseBody r , responseHeaders = fromList $ Client.responseHeaders r