{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Network.HTTP.Client.ResponseSpec where import Test.Hspec import Network.HTTP.Client import Network.HTTP.Client.Internal import Network.HTTP.Types import Codec.Compression.GZip (compress) import qualified Data.ByteString.Lazy as L import Data.ByteString.Lazy.Char8 () import qualified Data.ByteString as S main :: IO () main = hspec spec spec :: Spec spec = describe "ResponseSpec" $ do let getResponse' conn = getResponse (const $ return ()) Nothing req conn Nothing req = parseRequest_ "http://localhost" it "basic" $ do (conn, _, _) <- dummyConnection [ "HTTP/1.1 200 OK\r\n" , "Key1: Value1\r\n" , "Content-length: 11\r\n\r\n" , "Hello" , " W" , "orld\r\nHTTP/1.1" ] Response {..} <- getResponse' conn responseStatus `shouldBe` status200 responseVersion `shouldBe` HttpVersion 1 1 responseHeaders `shouldBe` [ ("Key1", "Value1") , ("Content-length", "11") ] pieces <- brConsume responseBody pieces `shouldBe` ["Hello", " W", "orld"] it "no length" $ do (conn, _, _) <- dummyConnection [ "HTTP/1.1 200 OK\r\n" , "Key1: Value1\r\n\r\n" , "Hello" , " W" , "orld\r\nHTTP/1.1" ] Response {..} <- getResponse' conn responseStatus `shouldBe` status200 responseVersion `shouldBe` HttpVersion 1 1 responseHeaders `shouldBe` [ ("Key1", "Value1") ] pieces <- brConsume responseBody pieces `shouldBe` ["Hello", " W", "orld\r\nHTTP/1.1"] it "chunked" $ do (conn, _, _) <- dummyConnection [ "HTTP/1.1 200 OK\r\n" , "Key1: Value1\r\n" , "Transfer-encoding: chunked\r\n\r\n" , "5\r\nHello\r" , "\n2\r\n W" , "\r\n4 ignored\r\norld\r\n0\r\nHTTP/1.1" ] Response {..} <- getResponse' conn responseStatus `shouldBe` status200 responseVersion `shouldBe` HttpVersion 1 1 responseHeaders `shouldBe` [ ("Key1", "Value1") , ("Transfer-encoding", "chunked") ] pieces <- brConsume responseBody pieces `shouldBe` ["Hello", " W", "orld"] it "gzip" $ do (conn, _, _) <- dummyConnection $ "HTTP/1.1 200 OK\r\n" : "Key1: Value1\r\n" : "Content-Encoding: gzip\r\n\r\n" : L.toChunks (compress "Compressed Hello World") Response {..} <- getResponse' conn responseStatus `shouldBe` status200 responseVersion `shouldBe` HttpVersion 1 1 responseHeaders `shouldBe` [ ("Key1", "Value1") , ("Content-Encoding", "gzip") ] pieces <- brConsume responseBody S.concat pieces `shouldBe` "Compressed Hello World"