@@ -74,7 +74,6 @@ import Network.HTTP.Client
74
74
(HttpException (.. ), Manager , RequestBody (.. ), Response (.. ), getUri ,
75
75
httpLbs , method , newManager , redirectCount , requestBody , requestHeaders ,
76
76
setQueryString , setRequestIgnoreStatus )
77
- import Network.HTTP.Client.TLS (tlsManagerSettings )
78
77
import Network.HTTP.Link.Parser (parseLinkHeaderBS )
79
78
import Network.HTTP.Link.Types (Link (.. ), LinkParam (.. ), href , linkParams )
80
79
import Network.HTTP.Types (Method , RequestHeaders , Status (.. ))
@@ -88,18 +87,43 @@ import qualified Data.Vector as V
88
87
import qualified Network.HTTP.Client as HTTP
89
88
import qualified Network.HTTP.Client.Internal as HTTP
90
89
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
+
91
99
import GitHub.Auth (Auth , AuthMethod , endpoint , setAuthRequest )
92
100
import GitHub.Data (Error (.. ))
93
101
import GitHub.Data.PullRequests (MergeResult (.. ))
94
102
import GitHub.Data.Request
95
103
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
+
96
120
-- | Execute 'Request' in 'IO'
97
121
executeRequest
98
122
:: (AuthMethod am , ParseResponse mt a )
99
123
=> am
100
124
-> GenRequest mt rw a
101
125
-> IO (Either Error a )
102
- executeRequest auth req = do
126
+ executeRequest auth req = withOpenSSL $ withOpenSSL $ do
103
127
manager <- newManager tlsManagerSettings
104
128
executeRequestWithMgr manager auth req
105
129
@@ -137,7 +161,7 @@ executeRequestWithMgr mgr auth req = runExceptT $ do
137
161
138
162
-- | Like 'executeRequest' but without authentication.
139
163
executeRequest' :: ParseResponse mt a => GenRequest mt 'RO a -> IO (Either Error a )
140
- executeRequest' req = do
164
+ executeRequest' req = withOpenSSL $ do
141
165
manager <- newManager tlsManagerSettings
142
166
executeRequestWithMgr' manager req
143
167
0 commit comments