@@ -74,7 +74,6 @@ import Network.HTTP.Client
7474 (HttpException (.. ), Manager , RequestBody (.. ), Response (.. ), getUri ,
7575 httpLbs , method , newManager , redirectCount , requestBody , requestHeaders ,
7676 setQueryString , setRequestIgnoreStatus )
77- import Network.HTTP.Client.TLS (tlsManagerSettings )
7877import Network.HTTP.Link.Parser (parseLinkHeaderBS )
7978import Network.HTTP.Link.Types (Link (.. ), LinkParam (.. ), href , linkParams )
8079import Network.HTTP.Types (Method , RequestHeaders , Status (.. ))
@@ -88,18 +87,43 @@ import qualified Data.Vector as V
8887import qualified Network.HTTP.Client as HTTP
8988import qualified Network.HTTP.Client.Internal as HTTP
9089
90+ #ifdef MIN_VERSION_http_client_tls
91+ import Network.HTTP.Client.TLS (tlsManagerSettings )
92+ #else
93+ import Network.HTTP.Client.OpenSSL (opensslManagerSettings , withOpenSSL )
94+
95+ import qualified OpenSSL.Session as SSL
96+ import qualified OpenSSL.X509.SystemStore as SSL
97+ #endif
98+
9199import GitHub.Auth (Auth , AuthMethod , endpoint , setAuthRequest )
92100import GitHub.Data (Error (.. ))
93101import GitHub.Data.PullRequests (MergeResult (.. ))
94102import GitHub.Data.Request
95103
104+ #ifdef MIN_VERSION_http_client_tls
105+ withOpenSSL :: IO a -> IO a
106+ withOpenSSL = id
107+ #else
108+ tlsManagerSettings :: HTTP. ManagerSettings
109+ tlsManagerSettings = opensslManagerSettings $ do
110+ ctx <- SSL. context
111+ SSL. contextAddOption ctx SSL. SSL_OP_NO_SSLv2
112+ SSL. contextAddOption ctx SSL. SSL_OP_NO_SSLv3
113+ SSL. contextAddOption ctx SSL. SSL_OP_NO_TLSv1
114+ SSL. contextSetCiphers ctx " ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
115+ SSL. contextLoadSystemCerts ctx
116+ SSL. contextSetVerificationMode ctx $ SSL. VerifyPeer True True Nothing
117+ return ctx
118+ #endif
119+
96120-- | Execute 'Request' in 'IO'
97121executeRequest
98122 :: (AuthMethod am , ParseResponse mt a )
99123 => am
100124 -> GenRequest mt rw a
101125 -> IO (Either Error a )
102- executeRequest auth req = do
126+ executeRequest auth req = withOpenSSL $ withOpenSSL $ do
103127 manager <- newManager tlsManagerSettings
104128 executeRequestWithMgr manager auth req
105129
@@ -137,7 +161,7 @@ executeRequestWithMgr mgr auth req = runExceptT $ do
137161
138162-- | Like 'executeRequest' but without authentication.
139163executeRequest' :: ParseResponse mt a => GenRequest mt 'RO a -> IO (Either Error a )
140- executeRequest' req = do
164+ executeRequest' req = withOpenSSL $ do
141165 manager <- newManager tlsManagerSettings
142166 executeRequestWithMgr' manager req
143167
0 commit comments