1{-# LANGUAGE OverloadedStrings #-}
2module Network.HTTP.Client.HeadersSpec where
3
4import           Network.HTTP.Client.Internal
5import           Network.HTTP.Types
6import           Test.Hspec
7
8main :: IO ()
9main = hspec spec
10
11spec :: Spec
12spec = describe "HeadersSpec" $ do
13    it "simple response" $ do
14        let input =
15                [ "HTTP/"
16                , "1.1 200"
17                , " OK\r\nfoo"
18                , ": bar\r\n"
19                , "baz:bin\r\n\r"
20                , "\nignored"
21                ]
22        (connection, _, _) <- dummyConnection input
23        statusHeaders <- parseStatusHeaders connection Nothing Nothing
24        statusHeaders `shouldBe` StatusHeaders status200 (HttpVersion 1 1)
25            [ ("foo", "bar")
26            , ("baz", "bin")
27            ]
28
29    it "Expect: 100-continue (success)" $ do
30        let input =
31                [ "HTTP/1.1 100 Continue\r\n\r\n"
32                , "HTTP/1.1 200 OK\r\n"
33                , "foo: bar\r\n\r\n"
34                ]
35        (conn, out, _) <- dummyConnection input
36        let sendBody = connectionWrite conn "data"
37        statusHeaders <- parseStatusHeaders conn Nothing (Just sendBody)
38        statusHeaders `shouldBe` StatusHeaders status200 (HttpVersion 1 1) [ ("foo", "bar") ]
39        out >>= (`shouldBe` ["data"])
40
41    it "Expect: 100-continue (failure)" $ do
42        let input =
43                [ "HTTP/1.1 417 Expectation Failed\r\n\r\n"
44                ]
45        (conn, out, _) <- dummyConnection input
46        let sendBody = connectionWrite conn "data"
47        statusHeaders <- parseStatusHeaders conn Nothing (Just sendBody)
48        statusHeaders `shouldBe` StatusHeaders status417 (HttpVersion 1 1) []
49        out >>= (`shouldBe` [])
50
51    it "100 Continue without expectation is OK" $ do
52        let input =
53                [ "HTTP/1.1 100 Continue\r\n\r\n"
54                , "HTTP/1.1 200 OK\r\n"
55                , "foo: bar\r\n\r\n"
56                , "result"
57                ]
58        (conn, out, inp) <- dummyConnection input
59        statusHeaders <- parseStatusHeaders conn Nothing Nothing
60        statusHeaders `shouldBe` StatusHeaders status200 (HttpVersion 1 1) [ ("foo", "bar") ]
61        out >>= (`shouldBe` [])
62        inp >>= (`shouldBe` ["result"])
63