on 526a33a help sign in
.github/workflows/ci.yaml+13−14
since splitsnapshots
unifiedsplit
@@ -11,25 +11,27 @@ jobs:
11 ormolu:
11 ormolu:
12 runs-on: ubuntu-latest
12 runs-on: ubuntu-latest
13 steps:
13 steps:
14− - uses: actions/checkout@v4
14+ - uses: actions/checkout@v3
15− - uses: haskell-actions/run-ormolu@v17
15+ - uses: haskell-actions/run-ormolu@v12
16 build:
16 build:
17 runs-on: ubuntu-latest
17 runs-on: ubuntu-latest
18 needs: ormolu
18 needs: ormolu
19 strategy:
19 strategy:
20 matrix:
20 matrix:
21− cabal: ["3.12"]
21+ cabal: ["3.8"]
22− ghc: ["9.6.3", "9.8.2", "9.10.1"]
22+ ghc: ["9.0.2", "9.2.5", "9.4.4"]
23+ env:
24+ CONFIG: "--enable-tests --enable-benchmarks --flags=dev"
23 steps:
25 steps:
24− - uses: actions/checkout@v4
26+ - uses: actions/checkout@v3
25− - uses: haskell-actions/setup@v2
27+ - uses: haskell/actions/setup@v2
26 id: setup-haskell-cabal
28 id: setup-haskell-cabal
27 with:
29 with:
28 ghc-version: ${{ matrix.ghc }}
30 ghc-version: ${{ matrix.ghc }}
29 cabal-version: ${{ matrix.cabal }}
31 cabal-version: ${{ matrix.cabal }}
30 - run: cabal update
32 - run: cabal update
31− - run: cabal freeze
33+ - run: cabal freeze $CONFIG
32− - uses: actions/cache@v4.2.3
34+ - uses: actions/cache@v3.2.5
33 with:
35 with:
34 path: |
36 path: |
35 ${{ steps.setup-haskell-cabal.outputs.cabal-store }}
37 ${{ steps.setup-haskell-cabal.outputs.cabal-store }}
@@ -38,10 +40,7 @@ jobs:
38 restore-keys: |
40 restore-keys: |
39 ${{ runner.os }}-${{ matrix.ghc }}-
41 ${{ runner.os }}-${{ matrix.ghc }}-
40 - run: cabal format && git diff --exit-code --color=always
42 - run: cabal format && git diff --exit-code --color=always
41− - run: cabal build
43+ - run: cabal build $CONFIG
42− - run: |
43− docker pull kennethreitz/httpbin
44− docker run -p 1234:80 kennethreitz/httpbin &
45− cabal test
44+ - run: cabal test $CONFIG
46− - run: cabal haddock
45+ - run: cabal haddock $CONFIG
47 - run: cabal sdist
46 - run: cabal sdist
.gitignore−1
@@ -25,6 +25,5 @@ cabal.project.local
25cabal.sandbox.config
25cabal.sandbox.config
26dist-*/
26dist-*/
27dist/
27dist/
28−hie.yaml
29stack.yaml
28stack.yaml
30stack.yaml.lock
29stack.yaml.lock
CHANGELOG.md+1−19
@@ -1,20 +1,4 @@
1−## Req 3.13.4
1+## Unreleased
2−
3−* Fixed empty ciphersuite list when compiling against `tls < 2.0.6`
4− (see [PR 175](https://github.com/mrkkrp/req/pull/175)). As a side effect, now
5− compatible with older versions of `crypton-connection` (>= 0.3).
6−
7−## Req 3.13.3
8−
9−* Works with `crypton-connection-0.4` and newer.
10−
11−## Req 3.13.2
12−
13−* Disable the problematic `httpbin-tests` test suite by default. Only enable
14− it when the `dev` flag is enabled. In that case it is expected that an
15− httpbin server is run locally at `localhost:1234`.
16−
17−## Req 3.13.1
18
2
19* Switched the non-pure test suite to use https://httpbun.org instead of
3* Switched the non-pure test suite to use https://httpbun.org instead of
20 https://httpbin.org since the latter proved to be highly unreliable
4 https://httpbin.org since the latter proved to be highly unreliable
@@ -22,8 +6,6 @@
22
6
23* Switched from `connection` to `crypton-connection`.
7* Switched from `connection` to `crypton-connection`.
24
8
25−* Builds with GHC 9.6.1.
26−
27## Req 3.13.0
9## Req 3.13.0
28
10
29* Add `headerRedacted` function to add header fields, which will be with
11* Add `headerRedacted` function to add header fields, which will be with
Network/HTTP/Req.hs+49−39
@@ -1,9 +1,19 @@
1+{-# LANGUAGE BangPatterns #-}
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
4+{-# LANGUAGE DeriveGeneric #-}
5+{-# LANGUAGE DeriveLift #-}
6+{-# LANGUAGE FlexibleInstances #-}
7+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
2{-# LANGUAGE LambdaCase #-}
8{-# LANGUAGE LambdaCase #-}
9+{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE OverloadedStrings #-}
10{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE QuasiQuotes #-}
11{-# LANGUAGE QuasiQuotes #-}
12+{-# LANGUAGE RankNTypes #-}
5{-# LANGUAGE RecordWildCards #-}
13{-# LANGUAGE RecordWildCards #-}
6{-# LANGUAGE RoleAnnotations #-}
14{-# LANGUAGE RoleAnnotations #-}
15+{-# LANGUAGE ScopedTypeVariables #-}
16+{-# LANGUAGE StandaloneDeriving #-}
7{-# LANGUAGE TemplateHaskellQuotes #-}
17{-# LANGUAGE TemplateHaskellQuotes #-}
8{-# LANGUAGE TypeFamilies #-}
18{-# LANGUAGE TypeFamilies #-}
9{-# LANGUAGE UndecidableInstances #-}
19{-# LANGUAGE UndecidableInstances #-}
@@ -203,7 +213,7 @@ module Network.HTTP.Req
203 )
213 )
204where
214where
205
215
206−import Blaze.ByteString.Builder qualified as BB
216+import qualified Blaze.ByteString.Builder as BB
207import Control.Applicative
217import Control.Applicative
208import Control.Arrow (first, second)
218import Control.Arrow (first, second)
209import Control.Exception hiding (Handler (..), TypeError)
219import Control.Exception hiding (Handler (..), TypeError)
@@ -219,56 +229,55 @@ import Control.Monad.Trans.Control
219import Control.Monad.Trans.Except (ExceptT)
229import Control.Monad.Trans.Except (ExceptT)
220import Control.Monad.Trans.Identity (IdentityT)
230import Control.Monad.Trans.Identity (IdentityT)
221import Control.Monad.Trans.Maybe (MaybeT)
231import Control.Monad.Trans.Maybe (MaybeT)
222−import Control.Monad.Trans.RWS.CPS qualified as RWS.CPS
232+import qualified Control.Monad.Trans.RWS.CPS as RWS.CPS
223−import Control.Monad.Trans.RWS.Lazy qualified as RWS.Lazy
233+import qualified Control.Monad.Trans.RWS.Lazy as RWS.Lazy
224−import Control.Monad.Trans.RWS.Strict qualified as RWS.Strict
234+import qualified Control.Monad.Trans.RWS.Strict as RWS.Strict
225import Control.Monad.Trans.Select (SelectT)
235import Control.Monad.Trans.Select (SelectT)
226−import Control.Monad.Trans.State.Lazy qualified as State.Lazy
236+import qualified Control.Monad.Trans.State.Lazy as State.Lazy
227−import Control.Monad.Trans.State.Strict qualified as State.Strict
237+import qualified Control.Monad.Trans.State.Strict as State.Strict
228−import Control.Monad.Trans.Writer.CPS qualified as Writer.CPS
238+import qualified Control.Monad.Trans.Writer.CPS as Writer.CPS
229−import Control.Monad.Trans.Writer.Lazy qualified as Writer.Lazy
239+import qualified Control.Monad.Trans.Writer.Lazy as Writer.Lazy
230−import Control.Monad.Trans.Writer.Strict qualified as Writer.Strict
240+import qualified Control.Monad.Trans.Writer.Strict as Writer.Strict
231import Control.Retry
241import Control.Retry
232import Data.Aeson (FromJSON (..), ToJSON (..))
242import Data.Aeson (FromJSON (..), ToJSON (..))
233−import Data.Aeson qualified as A
243+import qualified Data.Aeson as A
234import Data.ByteString (ByteString)
244import Data.ByteString (ByteString)
235−import Data.ByteString qualified as B
245+import qualified Data.ByteString as B
236−import Data.ByteString.Lazy qualified as BL
246+import qualified Data.ByteString.Lazy as BL
237−import Data.CaseInsensitive qualified as CI
247+import qualified Data.CaseInsensitive as CI
238import Data.Data (Data)
248import Data.Data (Data)
239−import Data.Default.Class (def)
240import Data.Function (on)
249import Data.Function (on)
241import Data.IORef
250import Data.IORef
242import Data.Kind (Constraint, Type)
251import Data.Kind (Constraint, Type)
243import Data.List (foldl', nubBy)
252import Data.List (foldl', nubBy)
244import Data.List.NonEmpty (NonEmpty (..))
253import Data.List.NonEmpty (NonEmpty (..))
245−import Data.List.NonEmpty qualified as NE
254+import qualified Data.List.NonEmpty as NE
246import Data.Maybe (fromMaybe)
255import Data.Maybe (fromMaybe)
247import Data.Proxy
256import Data.Proxy
248import Data.Semigroup (Endo (..))
257import Data.Semigroup (Endo (..))
249−import Data.Set qualified as S
258+import qualified Data.Set as S
250import Data.Text (Text)
259import Data.Text (Text)
251−import Data.Text qualified as T
260+import qualified Data.Text as T
252−import Data.Text.Encoding qualified as T
261+import qualified Data.Text.Encoding as T
253import Data.Typeable (Typeable, cast)
262import Data.Typeable (Typeable, cast)
254import GHC.Generics
263import GHC.Generics
255import GHC.TypeLits
264import GHC.TypeLits
256−import Language.Haskell.TH qualified as TH
265+import qualified Language.Haskell.TH as TH
257−import Language.Haskell.TH.Quote qualified as TH
266+import qualified Language.Haskell.TH.Quote as TH
258−import Language.Haskell.TH.Syntax qualified as TH
267+import qualified Language.Haskell.TH.Syntax as TH
259−import Network.Connection qualified as NC
268+import qualified Network.Connection as NC
260−import Network.HTTP.Client qualified as L
269+import qualified Network.HTTP.Client as L
261−import Network.HTTP.Client.Internal qualified as LI
270+import qualified Network.HTTP.Client.Internal as LI
262−import Network.HTTP.Client.MultipartFormData qualified as LM
271+import qualified Network.HTTP.Client.MultipartFormData as LM
263−import Network.HTTP.Client.TLS qualified as L
272+import qualified Network.HTTP.Client.TLS as L
264−import Network.HTTP.Types qualified as Y
273+import qualified Network.HTTP.Types as Y
265import System.IO.Unsafe (unsafePerformIO)
274import System.IO.Unsafe (unsafePerformIO)
266import Text.URI (URI)
275import Text.URI (URI)
267−import Text.URI qualified as URI
276+import qualified Text.URI as URI
268−import Text.URI.QQ qualified as QQ
277+import qualified Text.URI.QQ as QQ
269−import Web.Authenticate.OAuth qualified as OAuth
278+import qualified Web.Authenticate.OAuth as OAuth
270import Web.FormUrlEncoded (FromForm (..), ToForm (..))
279import Web.FormUrlEncoded (FromForm (..), ToForm (..))
271−import Web.FormUrlEncoded qualified as Form
280+import qualified Web.FormUrlEncoded as Form
272import Web.HttpApiData (ToHttpApiData (..))
281import Web.HttpApiData (ToHttpApiData (..))
273
282
274----------------------------------------------------------------------------
283----------------------------------------------------------------------------
@@ -585,10 +594,10 @@ req' method url body options m = do
585 withReqManager (m request)
594 withReqManager (m request)
586
595
587-- | Perform an action using the global implicit 'L.Manager' that the rest
596-- | Perform an action using the global implicit 'L.Manager' that the rest
588−-- of the library uses. This allows us to reuse connections that the
597+-- of the library uses. This allows to reuse connections that the
589-- 'L.Manager' controls.
598-- 'L.Manager' controls.
590withReqManager :: (MonadIO m) => (L.Manager -> m a) -> m a
599withReqManager :: (MonadIO m) => (L.Manager -> m a) -> m a
591−withReqManager m = m globalManager
600+withReqManager m = liftIO (readIORef globalManager) >>= m
592
601
593-- | The global 'L.Manager' that 'req' uses. Here we just go with the
602-- | The global 'L.Manager' that 'req' uses. Here we just go with the
594-- default settings, so users don't need to deal with this manager stuff at
603-- default settings, so users don't need to deal with this manager stuff at
@@ -601,16 +610,16 @@ withReqManager m = m globalManager
601-- manager. From that moment on the 'IORef' will be just reused—exactly the
610-- manager. From that moment on the 'IORef' will be just reused—exactly the
602-- behavior we want here in order to maximize connection sharing. GHC could
611-- behavior we want here in order to maximize connection sharing. GHC could
603-- spoil the plan by inlining the definition, hence the @NOINLINE@ pragma.
612-- spoil the plan by inlining the definition, hence the @NOINLINE@ pragma.
604−globalManager :: L.Manager
613+globalManager :: IORef L.Manager
605globalManager = unsafePerformIO $ do
614globalManager = unsafePerformIO $ do
606 context <- NC.initConnectionContext
615 context <- NC.initConnectionContext
607 let settings =
616 let settings =
608 L.mkManagerSettingsContext
617 L.mkManagerSettingsContext
609 (Just context)
618 (Just context)
610− def
619+ (NC.TLSSettingsSimple False False False)
611 Nothing
620 Nothing
612 manager <- L.newManager settings
621 manager <- L.newManager settings
613− return manager
622+ newIORef manager
614{-# NOINLINE globalManager #-}
623{-# NOINLINE globalManager #-}
615
624
616----------------------------------------------------------------------------
625----------------------------------------------------------------------------
@@ -716,6 +725,7 @@ data HttpConfig = HttpConfig
716 -- @since 3.6.0
725 -- @since 3.6.0
717 httpConfigBodyPreviewLength :: forall a. (Num a) => a
726 httpConfigBodyPreviewLength :: forall a. (Num a) => a
718 }
727 }
728+ deriving (Typeable)
719
729
720-- | The default value of 'HttpConfig'.
730-- | The default value of 'HttpConfig'.
721--
731--
@@ -1024,7 +1034,7 @@ instance (HttpMethod method) => RequestComponent (Tagged "method" method) where
1024-- > -- https://%D1%8E%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4.%D1%80%D1%84
1034-- > -- https://%D1%8E%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4.%D1%80%D1%84
1025data Url (scheme :: Scheme) = Url Scheme (NonEmpty Text)
1035data Url (scheme :: Scheme) = Url Scheme (NonEmpty Text)
1026 -- NOTE The second value is the path segments in reversed order.
1036 -- NOTE The second value is the path segments in reversed order.
1027− deriving (Eq, Ord, Show, Data, Generic)
1037+ deriving (Eq, Ord, Show, Data, Typeable, Generic)
1028
1038
1029type role Url nominal
1039type role Url nominal
1030
1040
@@ -2011,7 +2021,7 @@ data HttpException
2011 | -- | A wrapper with Aeson-produced 'String' describing why decoding
2021 | -- | A wrapper with Aeson-produced 'String' describing why decoding
2012 -- failed
2022 -- failed
2013 JsonHttpException String
2023 JsonHttpException String
2014− deriving (Show, Generic)
2024+ deriving (Show, Typeable, Generic)
2015
2025
2016instance Exception HttpException
2026instance Exception HttpException
2017
2027
@@ -2048,4 +2058,4 @@ data Scheme
2048 Http
2058 Http
2049 | -- | HTTPS
2059 | -- | HTTPS
2050 Https
2060 Https
2051− deriving (Eq, Ord, Show, Data, Generic, TH.Lift)
2061+ deriving (Eq, Ord, Show, Data, Typeable, Generic, TH.Lift)
README.md+1−1
@@ -4,7 +4,7 @@
4[![Hackage](https://img.shields.io/hackage/v/req.svg?style=flat)](https://hackage.haskell.org/package/req)
4[![Hackage](https://img.shields.io/hackage/v/req.svg?style=flat)](https://hackage.haskell.org/package/req)
5[![Stackage Nightly](http://stackage.org/package/req/badge/nightly)](http://stackage.org/nightly/package/req)
5[![Stackage Nightly](http://stackage.org/package/req/badge/nightly)](http://stackage.org/nightly/package/req)
6[![Stackage LTS](http://stackage.org/package/req/badge/lts)](http://stackage.org/lts/package/req)
6[![Stackage LTS](http://stackage.org/package/req/badge/lts)](http://stackage.org/lts/package/req)
7−[![CI](https://github.com/mrkkrp/req/actions/workflows/ci.yaml/badge.svg)](https://github.com/mrkkrp/req/actions/workflows/ci.yaml)
7+![CI](https://github.com/mrkkrp/req/workflows/CI/badge.svg?branch=master)
8
8
9* [Related packages](#related-packages)
9* [Related packages](#related-packages)
10* [Blog posts](#blog-posts)
10* [Blog posts](#blog-posts)
Setup.hsnew file+6
@@ -0,0 +1,6 @@
1+module Main (main) where
2+
3+import Distribution.Simple
4+
5+main :: IO ()
6+main = defaultMain
cabal.projectdeleted−4
@@ -1,4 +0,0 @@
1−packages: .
2−tests: True
3−benchmarks: True
4−constraints: req +dev
httpbin-data/robots.txt → httpbun-data/robots.txtrenamed

The content is the same.

httpbin-data/utf8.html → httpbun-data/utf8.htmlrenamed

The content is the same.

httpbin-tests/Network/HTTP/ReqSpec.hs → httpbun-tests/Network/HTTP/ReqSpec.hsrenamed+91−156
@@ -11,22 +11,21 @@ import Control.Exception
11import Control.Monad (forM_)
11import Control.Monad (forM_)
12import Control.Monad.Trans.Control
12import Control.Monad.Trans.Control
13import Data.Aeson (ToJSON (..), Value (..), object, (.=))
13import Data.Aeson (ToJSON (..), Value (..), object, (.=))
14−import Data.Aeson qualified as A
14+import qualified Data.Aeson as A
15−import Data.Aeson.KeyMap qualified as Aeson.KeyMap
15+import qualified Data.Aeson.KeyMap as Aeson.KeyMap
16−import Data.ByteString qualified as B
16+import qualified Data.ByteString as B
17−import Data.ByteString.Lazy qualified as BL
17+import qualified Data.ByteString.Lazy as BL
18import Data.Functor.Identity (runIdentity)
18import Data.Functor.Identity (runIdentity)
19import Data.Maybe (fromJust)
19import Data.Maybe (fromJust)
20import Data.Proxy
20import Data.Proxy
21import Data.Text (Text)
21import Data.Text (Text)
22−import Data.Text qualified as T
22+import qualified Data.Text as T
23−import Data.Text.Encoding qualified as T
23+import qualified Data.Text.Encoding as T
24−import Data.Text.IO qualified as TIO
24+import qualified Data.Text.IO as TIO
25−import Network.HTTP.Client qualified as L
25+import qualified Network.HTTP.Client as L
26−import Network.HTTP.Client.MultipartFormData qualified as LM
26+import qualified Network.HTTP.Client.MultipartFormData as LM
27−import Network.HTTP.Req hiding (req)
27+import Network.HTTP.Req
28−import Network.HTTP.Req qualified as Req
29−import Network.HTTP.Types qualified as Y
28+import qualified Network.HTTP.Types as Y
30import Test.Hspec
29import Test.Hspec
31import Test.QuickCheck
30import Test.QuickCheck
32
31
@@ -34,25 +33,25 @@ spec :: Spec
34spec = do
33spec = do
35 describe "exception throwing on non-2xx status codes" $
34 describe "exception throwing on non-2xx status codes" $
36 it "throws indeed for non-2xx" $
35 it "throws indeed for non-2xx" $
37− req GET (httpbin /: "foo") NoReqBody ignoreResponse mempty
36+ req GET (httpbun /: "foo") NoReqBody ignoreResponse mempty
38 `shouldThrow` selector404
37 `shouldThrow` selector404
39
38
40 describe "exception throwing on non-2xx status codes (Req monad)" $
39 describe "exception throwing on non-2xx status codes (Req monad)" $
41 it "throws indeed for non-2xx" $
40 it "throws indeed for non-2xx" $
42 asIO . runReq defaultHttpConfig $
41 asIO . runReq defaultHttpConfig $
43 liftBaseWith $ \run ->
42 liftBaseWith $ \run ->
44− run (req GET (httpbin /: "foo") NoReqBody ignoreResponse mempty)
43+ run (req GET (httpbun /: "foo") NoReqBody ignoreResponse mempty)
45 `shouldThrow` selector404
44 `shouldThrow` selector404
46
45
47 describe "response check via httpConfigCheckResponse" $
46 describe "response check via httpConfigCheckResponse" $
48 context "if it's set to always throw" $
47 context "if it's set to always throw" $
49 it "throws indeed" $
48 it "throws indeed" $
50− blindlyThrowing (req GET httpbin NoReqBody ignoreResponse mempty)
49+ blindlyThrowing (req GET httpbun NoReqBody ignoreResponse mempty)
51 `shouldThrow` anyException
50 `shouldThrow` anyException
52
51
53 describe "isStatusCodeException" $
52 describe "isStatusCodeException" $
54 it "extracts non-2xx response" $
53 it "extracts non-2xx response" $
55− req GET (httpbin /: "foo") NoReqBody ignoreResponse mempty
54+ req GET (httpbun /: "foo") NoReqBody ignoreResponse mempty
56 `shouldThrow` selector404ByStatusCodeException
55 `shouldThrow` selector404ByStatusCodeException
57
56
58 describe "receiving user-agent header back" $
57 describe "receiving user-agent header back" $
@@ -60,7 +59,7 @@ spec = do
60 r <-
59 r <-
61 req
60 req
62 GET
61 GET
63− (httpbin /: "user-agent")
62+ (httpbun /: "user-agent")
64 NoReqBody
63 NoReqBody
65 jsonResponse
64 jsonResponse
66 (header "user-agent" "Req")
65 (header "user-agent" "Req")
@@ -75,7 +74,7 @@ spec = do
75 r <-
74 r <-
76 req
75 req
77 GET
76 GET
78− (httpbin /: "headers")
77+ (httpbun /: "headers")
79 NoReqBody
78 NoReqBody
80 jsonResponse
79 jsonResponse
81 (header "Foo" "bar" <> header "Baz" "quux")
80 (header "Foo" "bar" <> header "Baz" "quux")
@@ -93,11 +92,12 @@ spec = do
93
92
94 describe "receiving GET data back" $
93 describe "receiving GET data back" $
95 it "works" $ do
94 it "works" $ do
96− r <- req GET (httpbin /: "get") NoReqBody jsonResponse mempty
95+ r <- req GET (httpbun /: "get") NoReqBody jsonResponse mempty
97 (stripFunnyHeaders . stripOrigin) (responseBody r)
96 (stripFunnyHeaders . stripOrigin) (responseBody r)
98 `shouldBe` object
97 `shouldBe` object
99 [ "args" .= emptyObject,
98 [ "args" .= emptyObject,
100− "url" .= ("http://localhost:1234/get" :: Text),
99+ "url" .= ("https://httpbun.org/get" :: Text),
100+ "method" .= ("GET" :: Text),
101 "headers"
101 "headers"
102 .= object
102 .= object
103 [ "Accept-Encoding" .= ("gzip" :: Text)
103 [ "Accept-Encoding" .= ("gzip" :: Text)
@@ -111,13 +111,14 @@ spec = do
111 it "works" $ do
111 it "works" $ do
112 let text = "foo" :: Text
112 let text = "foo" :: Text
113 reflected = reflectJSON text
113 reflected = reflectJSON text
114− r <- req POST (httpbin /: "post") (ReqBodyJson text) jsonResponse mempty
114+ r <- req POST (httpbun /: "post") (ReqBodyJson text) jsonResponse mempty
115 (stripFunnyHeaders . stripOrigin) (responseBody r)
115 (stripFunnyHeaders . stripOrigin) (responseBody r)
116 `shouldBe` object
116 `shouldBe` object
117 [ "args" .= emptyObject,
117 [ "args" .= emptyObject,
118 "json" .= text,
118 "json" .= text,
119 "data" .= reflected,
119 "data" .= reflected,
120− "url" .= ("http://localhost:1234/post" :: Text),
120+ "url" .= ("https://httpbun.org/post" :: Text),
121+ "method" .= ("POST" :: Text),
121 "headers"
122 "headers"
122 .= object
123 .= object
123 [ "Content-Type" .= ("application/json; charset=utf-8" :: Text),
124 [ "Content-Type" .= ("application/json; charset=utf-8" :: Text),
@@ -138,14 +139,15 @@ spec = do
138 [ LM.partBS "foo" "foo data!",
139 [ LM.partBS "foo" "foo data!",
139 LM.partBS "bar" "bar data!"
140 LM.partBS "bar" "bar data!"
140 ]
141 ]
141− r <- req POST (httpbin /: "post") body jsonResponse mempty
142+ r <- req POST (httpbun /: "post") body jsonResponse mempty
142 let contentType = fromJust (getRequestContentType body)
143 let contentType = fromJust (getRequestContentType body)
143 (stripFunnyHeaders . stripOrigin) (responseBody r)
144 (stripFunnyHeaders . stripOrigin) (responseBody r)
144 `shouldBe` object
145 `shouldBe` object
145 [ "args" .= emptyObject,
146 [ "args" .= emptyObject,
146 "json" .= Null,
147 "json" .= Null,
147 "data" .= ("" :: Text),
148 "data" .= ("" :: Text),
148− "url" .= ("http://localhost:1234/post" :: Text),
149+ "url" .= ("https://httpbun.org/post" :: Text),
150+ "method" .= ("POST" :: Text),
149 "headers"
151 "headers"
150 .= object
152 .= object
151 [ "Content-Type" .= T.decodeUtf8 contentType,
153 [ "Content-Type" .= T.decodeUtf8 contentType,
@@ -166,15 +168,16 @@ spec = do
166 describe "receiving PATCHed file back" $
168 describe "receiving PATCHed file back" $
167 it "works" $ do
169 it "works" $ do
168 let file :: FilePath
170 let file :: FilePath
169− file = "httpbin-data/robots.txt"
171+ file = "httpbun-data/robots.txt"
170 contents <- TIO.readFile file
172 contents <- TIO.readFile file
171− r <- req PATCH (httpbin /: "patch") (ReqBodyFile file) jsonResponse mempty
173+ r <- req PATCH (httpbun /: "patch") (ReqBodyFile file) jsonResponse mempty
172 (stripFunnyHeaders . stripOrigin) (responseBody r)
174 (stripFunnyHeaders . stripOrigin) (responseBody r)
173 `shouldBe` object
175 `shouldBe` object
174 [ "args" .= emptyObject,
176 [ "args" .= emptyObject,
175 "json" .= Null,
177 "json" .= Null,
176 "data" .= contents,
178 "data" .= contents,
177− "url" .= ("http://localhost:1234/patch" :: Text),
179+ "url" .= ("https://httpbun.org/patch" :: Text),
180+ "method" .= ("PATCH" :: Text),
178 "headers"
181 "headers"
179 .= object
182 .= object
180 [ "Accept-Encoding" .= ("gzip" :: Text),
183 [ "Accept-Encoding" .= ("gzip" :: Text),
@@ -193,13 +196,14 @@ spec = do
193 "foo" =: ("bar" :: Text)
196 "foo" =: ("bar" :: Text)
194 <> "baz" =: (5 :: Int)
197 <> "baz" =: (5 :: Int)
195 <> queryFlag "quux"
198 <> queryFlag "quux"
196− r <- req PUT (httpbin /: "put") (ReqBodyUrlEnc params) jsonResponse mempty
199+ r <- req PUT (httpbun /: "put") (ReqBodyUrlEnc params) jsonResponse mempty
197 (stripFunnyHeaders . stripOrigin) (responseBody r)
200 (stripFunnyHeaders . stripOrigin) (responseBody r)
198 `shouldBe` object
201 `shouldBe` object
199 [ "args" .= emptyObject,
202 [ "args" .= emptyObject,
200 "json" .= Null,
203 "json" .= Null,
201 "data" .= ("" :: Text),
204 "data" .= ("" :: Text),
202− "url" .= ("http://localhost:1234/put" :: Text),
205+ "url" .= ("https://httpbun.org/put" :: Text),
206+ "method" .= ("PUT" :: Text),
203 "headers"
207 "headers"
204 .= object
208 .= object
205 [ "Content-Type" .= ("application/x-www-form-urlencoded" :: Text),
209 [ "Content-Type" .= ("application/x-www-form-urlencoded" :: Text),
@@ -218,24 +222,19 @@ spec = do
218 responseStatusCode r `shouldBe` 200
222 responseStatusCode r `shouldBe` 200
219 responseStatusMessage r `shouldBe` "OK"
223 responseStatusMessage r `shouldBe` "OK"
220
224
221− -- TODO /delete
222−
223− describe "receiving UTF-8 encoded Unicode data" $
225+ -- describe "receiving UTF-8 encoded Unicode data" $
224− it "works" $ do
226+ -- it "works" $ do
225− r <-
227+ -- r <-
226− req
228+ -- req
227− GET
229+ -- GET
228− (httpbin /: "encoding" /: "utf8")
230+ -- (httpbun /: "encoding" /: "utf8")
229− NoReqBody
231+ -- NoReqBody
230− bsResponse
232+ -- bsResponse
231− mempty
233+ -- mempty
232− utf8data <- B.readFile "httpbin-data/utf8.html"
234+ -- utf8data <- B.readFile "httpbun-data/utf8.html"
233− responseBody r `shouldBe` utf8data
235+ -- responseBody r `shouldBe` utf8data
234− responseStatusCode r `shouldBe` 200
236+ -- responseStatusCode r `shouldBe` 200
235− responseStatusMessage r `shouldBe` "OK"
237+ -- responseStatusMessage r `shouldBe` "OK"
236−
237− -- TODO /gzip
238− -- TODO /deflate
239
238
240 describe "retrying" $
239 describe "retrying" $
241 it "retries as many times as specified" $ do
240 it "retries as many times as specified" $ do
@@ -246,7 +245,7 @@ spec = do
246 prepareForShit $
245 prepareForShit $
247 req
246 req
248 GET
247 GET
249− (httpbin /: "status" /~ status)
248+ (httpbun /: "status" /~ status)
250 NoReqBody
249 NoReqBody
251 ignoreResponse
250 ignoreResponse
252 mempty
251 mempty
@@ -258,25 +257,18 @@ spec = do
258 forM_ [400 .. 431] checkStatusCode
257 forM_ [400 .. 431] checkStatusCode
259 forM_ [500 .. 511] checkStatusCode
258 forM_ [500 .. 511] checkStatusCode
260
259
261− -- TODO /response-headers
262− -- TODO /redirect
263−
264 describe "redirects" $
260 describe "redirects" $
265 it "follows redirects" $ do
261 it "follows redirects" $ do
266 r <-
262 r <-
267 req
263 req
268 GET
264 GET
269− (httpbin /: "redirect-to")
265+ (httpbun /: "redirect-to")
270 NoReqBody
266 NoReqBody
271 ignoreResponse
267 ignoreResponse
272− ("url" =: ("https://httpbin.org" :: Text))
268+ ("url" =: ("https://httpbun.org" :: Text))
273 responseStatusCode r `shouldBe` 200
269 responseStatusCode r `shouldBe` 200
274 responseStatusMessage r `shouldBe` "OK"
270 responseStatusMessage r `shouldBe` "OK"
275
271
276− -- TODO /relative-redicet
277− -- TODO /absolute-redirect
278− -- TODO /cookies
279−
280 describe "basicAuth" $ do
272 describe "basicAuth" $ do
281 let user, password :: Text
273 let user, password :: Text
282 user = "Scooby"
274 user = "Scooby"
@@ -287,43 +279,32 @@ spec = do
287 prepareForShit $
279 prepareForShit $
288 req
280 req
289 GET
281 GET
290− (httpbin /: "basic-auth" /~ user /~ password)
282+ (httpbun /: "basic-auth" /~ user /~ password)
291 NoReqBody
283 NoReqBody
292 ignoreResponse
284 ignoreResponse
293 mempty
285 mempty
294 responseStatusCode r `shouldBe` 401
286 responseStatusCode r `shouldBe` 401
295− responseStatusMessage r `shouldBe` "UNAUTHORIZED"
287+ responseStatusMessage r `shouldBe` "Unauthorized"
296 context "when we provide appropriate basic auth data" $
288 context "when we provide appropriate basic auth data" $
297 it "succeeds" $ do
289 it "succeeds" $ do
298 r <-
290 r <-
299 req
291 req
300 GET
292 GET
301− (httpbin /: "basic-auth" /~ user /~ password)
293+ (httpbun /: "basic-auth" /~ user /~ password)
302 NoReqBody
294 NoReqBody
303 ignoreResponse
295 ignoreResponse
304− (basicAuthUnsafe (T.encodeUtf8 user) (T.encodeUtf8 password))
296+ (basicAuth (T.encodeUtf8 user) (T.encodeUtf8 password))
305 responseStatusCode r `shouldBe` 200
297 responseStatusCode r `shouldBe` 200
306 responseStatusMessage r `shouldBe` "OK"
298 responseStatusMessage r `shouldBe` "OK"
307
299
308− -- TODO /hidden-basic-auth
309− -- TODO /digest-auth
310− -- TODO /stream
311− -- TODO /delay
312− -- TODO /drip
313− -- TODO /range
314− -- TODO /html
315−
316 describe "robots.txt" $
300 describe "robots.txt" $
317 it "works" $ do
301 it "works" $ do
318− r <- req GET (httpbin /: "robots.txt") NoReqBody bsResponse mempty
302+ r <- req GET (httpbun /: "robots.txt") NoReqBody bsResponse mempty
319− robots <- B.readFile "httpbin-data/robots.txt"
303+ robots <- B.readFile "httpbun-data/robots.txt"
320 responseBody r `shouldBe` robots
304 responseBody r `shouldBe` robots
321 responseStatusCode r `shouldBe` 200
305 responseStatusCode r `shouldBe` 200
322 responseStatusMessage r `shouldBe` "OK"
306 responseStatusMessage r `shouldBe` "OK"
323
307
324− -- TODO /deny
325− -- TODO /cache
326−
327 describe "getting random bytes" $ do
308 describe "getting random bytes" $ do
328 it "works" $
309 it "works" $
329 property $ \n' -> do
310 property $ \n' -> do
@@ -332,7 +313,7 @@ spec = do
332 r <-
313 r <-
333 req
314 req
334 GET
315 GET
335− (httpbin /: "bytes" /~ n)
316+ (httpbun /: "bytes" /~ n)
336 NoReqBody
317 NoReqBody
337 lbsResponse
318 lbsResponse
338 mempty
319 mempty
@@ -348,36 +329,27 @@ spec = do
348 n = 1000
329 n = 1000
349 req
330 req
350 GET
331 GET
351− (httpbin /: "bytes" /~ n)
332+ (httpbun /: "bytes" /~ n)
352 NoReqBody
333 NoReqBody
353 (Proxy :: Proxy (JsonResponse Value))
334 (Proxy :: Proxy (JsonResponse Value))
354 mempty
335 mempty
355 `shouldThrow` selector
336 `shouldThrow` selector
356
337
357− describe "streaming random bytes" $
338+-- describe "streaming random bytes" $
358− it "works" $
339+-- it "works" $
359− property $ \n' -> do
340+-- property $ \n' -> do
360− let n :: Word
341+-- let n :: Word
361− n = getSmall n'
342+-- n = getSmall n'
362− r <-
343+-- r <-
363− req
344+-- req
364− GET
345+-- GET
365− (httpbin /: "stream-bytes" /~ n)
346+-- (httpbun /: "stream-bytes" /~ n)
366− NoReqBody
347+-- NoReqBody
367− bsResponse
348+-- bsResponse
368− mempty
349+-- mempty
369− responseBody r `shouldSatisfy` ((== n) . fromIntegral . B.length)
350+-- responseBody r `shouldSatisfy` ((== n) . fromIntegral . B.length)
370− responseStatusCode r `shouldBe` 200
351+-- responseStatusCode r `shouldBe` 200
371− responseStatusMessage r `shouldBe` "OK"
352+-- responseStatusMessage r `shouldBe` "OK"
372−
373−-- TODO /links
374−-- TODO /image
375−-- TODO /image/png
376−-- TODO /image/jpeg
377−-- TODO /image/webp
378−-- TODO /image/svg
379−-- TODO /forms/post
380−-- TODO /xml
381
353
382----------------------------------------------------------------------------
354----------------------------------------------------------------------------
383-- Instances
355-- Instances
@@ -400,29 +372,9 @@ blindlyThrowing = runReq defaultHttpConfig {httpConfigCheckResponse = doit}
400 where
372 where
401 doit _ _ = error "Oops!"
373 doit _ _ = error "Oops!"
402
374
403−-- | 'Url' representing <https://httpbin.org>.
375+-- | 'Url' representing <https://httpbun.org>.
404−httpbin :: Url 'Http
376+httpbun :: Url 'Https
405−httpbin = http "localhost"
377+httpbun = https "httpbun.org"
406−
407−req ::
408− ( MonadHttp m,
409− HttpMethod method,
410− HttpBody body,
411− HttpResponse response,
412− HttpBodyAllowed (AllowsBody method) (ProvidesBody body)
413− ) =>
414− method ->
415− Url scheme ->
416− body ->
417− Proxy response ->
418− Option scheme ->
419− m response
420−req method url body responseProxy options =
421− Req.req method url body responseProxy (options <> defaultOptions)
422−
423−-- | Options to apply by default.
424−defaultOptions :: Option scheme
425−defaultOptions = port 1234
426
378
427-- | Remove “origin” field from JSON value. Origin may change, we don't want
379-- | Remove “origin” field from JSON value. Origin may change, we don't want
428-- to depend on that.
380-- to depend on that.
@@ -432,38 +384,21 @@ stripOrigin value = value
432
384
433-- | Remove funny headers that might break the tests.
385-- | Remove funny headers that might break the tests.
434stripFunnyHeaders :: Value -> Value
386stripFunnyHeaders :: Value -> Value
435−stripFunnyHeaders = \case
387+stripFunnyHeaders (Object m) =
436− Object m ->
437− Object
438− ( runIdentity
439− ( Aeson.KeyMap.alterF
440− (pure . fmap stripFunnyHeaders')
441− "headers"
442− m
443− )
444− )
445− value -> value
446−
447−-- | Similar to 'stripFunnyHeaders', but acts directly on the argument
448−-- without trying to access its "headers" field.
449−stripFunnyHeaders' :: Value -> Value
450−stripFunnyHeaders' = \case
451− Object p ->
452− Object $
453− Aeson.KeyMap.filterWithKey
388+ let f (Object p) = Object $ Aeson.KeyMap.filterWithKey (\k _ -> k `elem` hs) p
454− (\k _ -> k `elem` whitelistedHeaders)
455− p
456− value -> value
389+ f value = value
457− where
390+ hs =
458− whitelistedHeaders =
459− [ "Content-Type",
391+ [ "Content-Type",
460− "Accept-Encoding",
392+ "Accept-Encoding",
393+ "Host",
461− "Content-Length",
394+ "Content-Length",
462− "Foo",
395+ "Foo",
463− "Baz"
396+ "Baz"
464− ]
397+ ]
465−
398+ in Object (runIdentity (Aeson.KeyMap.alterF (pure . fmap f) "headers" m))
399+stripFunnyHeaders value = value
400+
466−-- | This is a complete test case that makes use of <https://httpbin.org> to
401+-- | This is a complete test case that makes use of <https://httpbun.org> to
467-- get various response status codes.
402-- get various response status codes.
468checkStatusCode :: Int -> SpecWith ()
403checkStatusCode :: Int -> SpecWith ()
469checkStatusCode code =
404checkStatusCode code =
@@ -473,7 +408,7 @@ checkStatusCode code =
473 prepareForShit $
408 prepareForShit $
474 req
409 req
475 GET
410 GET
476− (httpbin /: "status" /~ code)
411+ (httpbun /: "status" /~ code)
477 NoReqBody
412 NoReqBody
478 ignoreResponse
413 ignoreResponse
479 mempty
414 mempty
httpbin-tests/Spec.hs → httpbun-tests/Spec.hsrenamed

The content is the same.

pure-tests/Network/HTTP/ReqSpec.hs+17−17
@@ -13,41 +13,41 @@
13
13
14module Network.HTTP.ReqSpec (spec) where
14module Network.HTTP.ReqSpec (spec) where
15
15
16−import Blaze.ByteString.Builder qualified as BB
16+import qualified Blaze.ByteString.Builder as BB
17import Control.Exception (throwIO)
17import Control.Exception (throwIO)
18import Control.Monad
18import Control.Monad
19import Control.Retry
19import Control.Retry
20import Data.Aeson (ToJSON (..))
20import Data.Aeson (ToJSON (..))
21−import Data.Aeson qualified as A
21+import qualified Data.Aeson as A
22import Data.ByteString (ByteString)
22import Data.ByteString (ByteString)
23−import Data.ByteString qualified as B
23+import qualified Data.ByteString as B
24−import Data.ByteString.Char8 qualified as B8
24+import qualified Data.ByteString.Char8 as B8
25−import Data.ByteString.Lazy qualified as BL
25+import qualified Data.ByteString.Lazy as BL
26−import Data.CaseInsensitive qualified as CI
26+import qualified Data.CaseInsensitive as CI
27import Data.Either (isRight)
27import Data.Either (isRight)
28−import Data.List.NonEmpty qualified as NE
28+import qualified Data.List.NonEmpty as NE
29import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
29import Data.Maybe (fromJust, fromMaybe, isJust, isNothing)
30import Data.Proxy
30import Data.Proxy
31import Data.Text (Text)
31import Data.Text (Text)
32−import Data.Text qualified as T
32+import qualified Data.Text as T
33−import Data.Text.Encoding qualified as T
33+import qualified Data.Text.Encoding as T
34import Data.Time
34import Data.Time
35import Data.Typeable (Typeable, eqT)
35import Data.Typeable (Typeable, eqT)
36import GHC.Exts (IsList (..))
36import GHC.Exts (IsList (..))
37import GHC.Generics
37import GHC.Generics
38−import Language.Haskell.TH qualified as TH
38+import qualified Language.Haskell.TH as TH
39−import Language.Haskell.TH.Quote qualified as TH
39+import qualified Language.Haskell.TH.Quote as TH
40−import Network.HTTP.Client qualified as L
40+import qualified Network.HTTP.Client as L
41import Network.HTTP.Req
41import Network.HTTP.Req
42−import Network.HTTP.Types qualified as Y
42+import qualified Network.HTTP.Types as Y
43−import Network.HTTP.Types.Header qualified as Y
43+import qualified Network.HTTP.Types.Header as Y
44import Test.Hspec
44import Test.Hspec
45import Test.Hspec.Core.Spec (SpecM)
45import Test.Hspec.Core.Spec (SpecM)
46import Test.QuickCheck
46import Test.QuickCheck
47import Text.URI (URI)
47import Text.URI (URI)
48−import Text.URI qualified as URI
48+import qualified Text.URI as URI
49−import Text.URI.QQ qualified as QQ
49+import qualified Text.URI.QQ as QQ
50−import Web.FormUrlEncoded qualified as F
50+import qualified Web.FormUrlEncoded as F
51
51
52spec :: Spec
52spec :: Spec
53spec = do
53spec = do
req.cabal+45−44
@@ -1,11 +1,11 @@
1cabal-version: 2.4
1cabal-version: 2.4
2name: req
2name: req
3−version: 3.13.4
3+version: 3.13.0
4license: BSD-3-Clause
4license: BSD-3-Clause
5license-file: LICENSE.md
5license-file: LICENSE.md
6maintainer: Mark Karpov <markkarpov92@gmail.com>
6maintainer: Mark Karpov <markkarpov92@gmail.com>
7author: Mark Karpov <markkarpov92@gmail.com>
7author: Mark Karpov <markkarpov92@gmail.com>
8−tested-with: ghc ==9.6.3 ghc ==9.8.2 ghc ==9.10.1
8+tested-with: ghc ==9.0.2 ghc ==9.2.5 ghc ==9.4.4
9homepage: https://github.com/mrkkrp/req
9homepage: https://github.com/mrkkrp/req
10bug-reports: https://github.com/mrkkrp/req/issues
10bug-reports: https://github.com/mrkkrp/req/issues
11synopsis: HTTP client library
11synopsis: HTTP client library
@@ -13,8 +13,8 @@ description: HTTP client library.
13category: Network, Web
13category: Network, Web
14build-type: Simple
14build-type: Simple
15data-files:
15data-files:
16− httpbin-data/utf8.html
16+ httpbun-data/utf8.html
17− httpbin-data/robots.txt
17+ httpbun-data/robots.txt
18
18
19extra-doc-files:
19extra-doc-files:
20 CHANGELOG.md
20 CHANGELOG.md
@@ -31,97 +31,98 @@ flag dev
31
31
32library
32library
33 exposed-modules: Network.HTTP.Req
33 exposed-modules: Network.HTTP.Req
34− default-language: GHC2021
34+ default-language: Haskell2010
35 build-depends:
35 build-depends:
36 aeson >=0.9 && <3,
36 aeson >=0.9 && <3,
37 authenticate-oauth >=1.5 && <1.8,
37 authenticate-oauth >=1.5 && <1.8,
38− base >=4.15 && <5,
38+ base >=4.15 && <5.0,
39 blaze-builder >=0.3 && <0.5,
39 blaze-builder >=0.3 && <0.5,
40− bytestring >=0.10.8 && <0.13,
40+ bytestring >=0.10.8 && <0.12,
41 case-insensitive >=0.2 && <1.3,
41 case-insensitive >=0.2 && <1.3,
42− containers >=0.5 && <0.8,
42+ containers >=0.5 && <0.7,
43− crypton-connection >=0.4.2 && <0.5,
43+ crypton-connection >=0.2.2 && <0.4,
44− data-default-class >=0.2.0.0,
45 exceptions >=0.6 && <0.11,
44 exceptions >=0.6 && <0.11,
46− http-api-data >=0.2 && <0.7,
45+ http-api-data >=0.2 && <0.6,
47 http-client >=0.7.13.1 && <0.8,
46 http-client >=0.7.13.1 && <0.8,
48 http-client-tls >=0.3.2 && <0.4,
47 http-client-tls >=0.3.2 && <0.4,
49− http-types >=0.8 && <10,
48+ http-types >=0.8 && <10.0,
50 modern-uri >=0.3 && <0.4,
49 modern-uri >=0.3 && <0.4,
51 monad-control >=1.0 && <1.1,
50 monad-control >=1.0 && <1.1,
52 mtl >=2.0 && <3.0,
51 mtl >=2.0 && <3.0,
53 retry >=0.8 && <0.10,
52 retry >=0.8 && <0.10,
54− template-haskell >=2.19 && <2.23,
53+ template-haskell >=2.14 && <2.20,
55− text >=0.2 && <2.2,
54+ text >=0.2 && <2.1,
55+ time >=1.2 && <1.13,
56 transformers >=0.5.3.0 && <0.7,
56 transformers >=0.5.3.0 && <0.7,
57 transformers-base,
57 transformers-base,
58 unliftio-core >=0.1.1 && <0.3
58 unliftio-core >=0.1.1 && <0.3
59
59
60 if flag(dev)
60 if flag(dev)
61− ghc-options:
61+ ghc-options: -O0 -Wall -Werror
62− -Wall -Werror -Wpartial-fields -Wunused-packages
63− -Wno-unused-imports
64
62
65 else
63 else
66 ghc-options: -O2 -Wall
64 ghc-options: -O2 -Wall
67
65
66+ if flag(dev)
67+ ghc-options:
68+ -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns
69+ -Wnoncanonical-monad-instances
70+
68test-suite pure-tests
71test-suite pure-tests
69 type: exitcode-stdio-1.0
72 type: exitcode-stdio-1.0
70 main-is: Spec.hs
73 main-is: Spec.hs
71− build-tool-depends: hspec-discover:hspec-discover >=2 && <3
74+ build-tool-depends: hspec-discover:hspec-discover >=2.0 && <3.0
72 hs-source-dirs: pure-tests
75 hs-source-dirs: pure-tests
73 other-modules: Network.HTTP.ReqSpec
76 other-modules: Network.HTTP.ReqSpec
74− default-language: GHC2021
77+ default-language: Haskell2010
75 build-depends:
78 build-depends:
76− QuickCheck >=2.7 && <3,
79+ QuickCheck >=2.7 && <3.0,
77 aeson >=0.9 && <3,
80 aeson >=0.9 && <3,
78 base >=4.15 && <5.0,
81 base >=4.15 && <5.0,
79 blaze-builder >=0.3 && <0.5,
82 blaze-builder >=0.3 && <0.5,
80− bytestring >=0.10.8 && <0.13,
83+ bytestring >=0.10.8 && <0.12,
81 case-insensitive >=0.2 && <1.3,
84 case-insensitive >=0.2 && <1.3,
82− hspec >=2.0 && <3,
85+ hspec >=2.0 && <3.0,
83− hspec-core >=2.0 && <3,
86+ hspec-core >=2.0 && <3.0,
84− http-api-data >=0.2 && <0.7,
87+ http-api-data >=0.2 && <0.6,
85 http-client >=0.7 && <0.8,
88 http-client >=0.7 && <0.8,
86− http-types >=0.8 && <10,
89+ http-types >=0.8 && <10.0,
87 modern-uri >=0.3 && <0.4,
90 modern-uri >=0.3 && <0.4,
91+ mtl >=2.0 && <3.0,
88 req,
92 req,
89 retry >=0.8 && <0.10,
93 retry >=0.8 && <0.10,
90− template-haskell >=2.19 && <2.23,
94+ template-haskell >=2.14 && <2.20,
91− text >=0.2 && <2.2,
95+ text >=0.2 && <2.1,
92− time >=1.2 && <1.15
96+ time >=1.2 && <1.13
93
97
94 if flag(dev)
98 if flag(dev)
95− ghc-options:
99+ ghc-options: -O0 -Wall -Werror
96− -Wall -Werror -Wredundant-constraints -Wpartial-fields
97− -Wunused-packages
98
100
99 else
101 else
100 ghc-options: -O2 -Wall
102 ghc-options: -O2 -Wall
101
103
102−test-suite httpbin-tests
104+test-suite httpbun-tests
103 type: exitcode-stdio-1.0
105 type: exitcode-stdio-1.0
104 main-is: Spec.hs
106 main-is: Spec.hs
105− build-tool-depends: hspec-discover:hspec-discover >=2 && <3
107+ build-tool-depends: hspec-discover:hspec-discover >=2.0 && <3.0
106− hs-source-dirs: httpbin-tests
108+ hs-source-dirs: httpbun-tests
107 other-modules: Network.HTTP.ReqSpec
109 other-modules: Network.HTTP.ReqSpec
108− default-language: GHC2021
110+ default-language: Haskell2010
109 build-depends:
111 build-depends:
110− QuickCheck >=2.7 && <3,
112+ QuickCheck >=2.7 && <3.0,
111 aeson >=2 && <3,
113 aeson >=2 && <3,
112− base >=4.15 && <5,
114+ base >=4.15 && <5.0,
113− bytestring >=0.10.8 && <0.13,
115+ bytestring >=0.10.8 && <0.12,
114 hspec >=2.0 && <3.0,
116 hspec >=2.0 && <3.0,
115 http-client >=0.7 && <0.8,
117 http-client >=0.7 && <0.8,
116− http-types >=0.8 && <10,
118+ http-types >=0.8 && <10.0,
117 monad-control >=1.0 && <1.1,
119 monad-control >=1.0 && <1.1,
120+ mtl >=2.0 && <3.0,
118 req,
121 req,
119− text >=0.2 && <2.2
122+ text >=0.2 && <2.1
120
123
121 if flag(dev)
124 if flag(dev)
122− ghc-options:
125+ ghc-options: -O0 -Wall -Werror
123− -Wall -Werror -Wredundant-constraints -Wpartial-fields
124− -Wunused-packages
125
126
126 else
127 else
127− buildable: False
128+ ghc-options: -O2 -Wall