http-client-rustls 0.0.1.0 → 0.0.2.0
raw patch · 4 files changed
+32/−37 lines, 4 filesdep ~networkdep ~rustlsPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: network, rustls
API changes (from Hackage documentation)
+ Network.HTTP.Client.Rustls: newRustlsManager :: MonadIO m => m Manager
Files
- CHANGELOG.md +4/−0
- http-client-rustls.cabal +3/−3
- src/Network/HTTP/Client/Rustls.hs +13/−24
- test/Main.hs +12/−10
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for http-client-rustls +## 0.0.2.0 -- 24.09.2024++ * Support rustls-0.2+ ## 0.0.1.0 -- 06.04.2024 * Support rustls-0.1
http-client-rustls.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: http-client-rustls-version: 0.0.1.0+version: 0.0.2.0 synopsis: http-client TLS backend using Rustls description: Make HTTPS connections using [http-client](https://hackage.haskell.org/package/http-client)@@ -48,9 +48,9 @@ base >=4.16 && <5, bytestring >=0.10 && <0.13, http-client ^>=0.7.11,- network ^>=3.1,+ network >=3.1 && <3.3, resourcet ^>=1.2 || ^>=1.3,- rustls ^>=0.1,+ rustls ^>=0.2, text >=2.0 && <2.2, test-suite tasty
src/Network/HTTP/Client/Rustls.hs view
@@ -2,42 +2,24 @@ -- [http-client](https://hackage.haskell.org/package/http-client) and -- [Rustls](https://github.com/rustls/rustls). ----- >>> import qualified Rustls -- >>> import qualified Network.HTTP.Client as HTTP--- >>> :{--- newRustlsManager :: IO HTTP.Manager--- newRustlsManager = do--- clientConfig <---- Rustls.buildClientConfig $--- Rustls.defaultClientConfigBuilder serverCertVerifier--- HTTP.newManager $ rustlsManagerSettings clientConfig--- where--- -- For now, rustls-ffi does not provide a built-in way to access--- -- the OS certificate store.--- serverCertVerifier =--- Rustls.ServerCertVerifier--- { Rustls.serverCertVerifierCertificates =--- pure $--- Rustls.PemCertificatesFromFile--- "/etc/ssl/certs/ca-certificates.crt"--- Rustls.PEMCertificateParsingStrict,--- Rustls.serverCertVerifierCRLs = []--- }--- >>> :}---+-- >>> import qualified Network.HTTP.Client.Rustls as HTTP -- >>> :{+-- example :: IO () -- example = do--- mgr <- newRustlsManager -- this should be shared across multiple requests+-- mgr <- HTTP.newRustlsManager -- this should be shared across multiple requests -- req <- HTTP.parseUrlThrow "https://example.org" -- res <- HTTP.httpLbs req mgr -- print $ HTTP.responseBody res -- :} module Network.HTTP.Client.Rustls- ( rustlsManagerSettings,+ ( newRustlsManager,+ rustlsManagerSettings, ) where import Control.Exception qualified as E+import Control.Monad.IO.Class (MonadIO (..)) import Data.Acquire (ReleaseType (..)) import Data.Acquire.Internal (Acquire (..), Allocated (..)) import Data.ByteString.Builder.Extra qualified as B@@ -46,6 +28,13 @@ import Network.HTTP.Client.Internal qualified as HTTP import Network.Socket qualified as NS import Rustls qualified++-- | Create a new 'HTTP.Manager' using good TLS defaults and the OS certificate+-- store.+newRustlsManager :: (MonadIO m) => m HTTP.Manager+newRustlsManager = liftIO do+ clientConfig <- Rustls.buildClientConfig =<< Rustls.defaultClientConfigBuilder+ HTTP.newManager $ rustlsManagerSettings clientConfig -- | Get TLS-enabled HTTP 'HTTP.ManagerSettings' from a Rustls -- 'Rustls.ClientConfig', consumable via 'HTTP.newManager'.
test/Main.hs view
@@ -62,19 +62,21 @@ let cp = Process.proc "minica" ["-domains", "example.org"] _ <- Process.readCreateProcess (cp {Process.cwd = Just tmpDir}) ""+ builder <- Rustls.defaultClientConfigBuilder mgr <- HTTP.newManager . rustlsManagerSettings =<< Rustls.buildClientConfig- ( Rustls.defaultClientConfigBuilder- Rustls.ServerCertVerifier- { Rustls.serverCertVerifierCertificates =- pure $- Rustls.PemCertificatesFromFile- (tmpDir </> "minica.pem")- Rustls.PEMCertificateParsingStrict,- Rustls.serverCertVerifierCRLs = []- }- )+ builder+ { Rustls.clientConfigServerCertVerifier =+ Rustls.ServerCertVerifier+ { Rustls.serverCertVerifierCertificates =+ pure $+ Rustls.PemCertificatesFromFile+ (tmpDir </> "minica.pem")+ Rustls.PEMCertificateParsingStrict,+ Rustls.serverCertVerifierCRLs = []+ }+ } B.writeFile (tmpDir </> "file") $ B.replicate fileLength fileByte procInfo <- Process.createProcess $