@@ -24,6 +24,8 @@ import Data.Monoid
24
24
import qualified Data.Text as T
25
25
import qualified Data.Vector as V
26
26
import qualified Data.Yaml.Include as YI
27
+ import Network.Connection (TLSSettings (.. ))
28
+ import Network.HTTP.Client.TLS (mkManagerSettings )
27
29
import Network.HTTP.Conduit
28
30
import Network.HTTP.Simple
29
31
import qualified Network.HTTP.Types.Header as HTTP
@@ -35,6 +37,7 @@ import Testing.CurlRunnings.Types
35
37
import Text.Printf
36
38
import Text.Regex.Posix
37
39
40
+
38
41
-- | decode a json or yaml file into a suite object
39
42
decodeFile :: FilePath -> IO (Either String CurlSuite )
40
43
decodeFile specPath =
@@ -48,10 +51,22 @@ decodeFile specPath =
48
51
_ -> return . Left $ printf " Invalid spec path %s" specPath
49
52
else return . Left $ printf " %s not found" specPath
50
53
54
+
55
+ noVerifyTlsManagerSettings :: ManagerSettings
56
+ noVerifyTlsManagerSettings = mkManagerSettings noVerifyTlsSettings Nothing
57
+
58
+ noVerifyTlsSettings :: TLSSettings
59
+ noVerifyTlsSettings =
60
+ TLSSettingsSimple
61
+ { settingDisableCertificateValidation = True
62
+ , settingDisableSession = True
63
+ , settingUseServerName = False
64
+ }
65
+
51
66
-- | Run a single test case, and returns the result. IO is needed here since this method is responsible
52
67
-- for actually curling the test case endpoint and parsing the result.
53
68
runCase :: CurlRunningsState -> CurlCase -> IO CaseResult
54
- runCase state curlCase = do
69
+ runCase state@ ( CurlRunningsState _ _ _ tlsCheckType) curlCase = do
55
70
let eInterpolatedUrl = interpolateQueryString state $ url curlCase
56
71
eInterpolatedHeaders =
57
72
interpolateHeaders state $ fromMaybe (HeaderSet [] ) (headers curlCase)
@@ -66,9 +81,11 @@ runCase state curlCase = do
66
81
return $ CaseFail curlCase Nothing Nothing [QueryFailure curlCase l]
67
82
Right replacedJSON -> do
68
83
initReq <- parseRequest $ T. unpack interpolatedUrl
84
+ manager <- newManager noVerifyTlsManagerSettings
69
85
let request =
70
86
setRequestBodyJSON (fromMaybe emptyObject replacedJSON) .
71
- setRequestHeaders (toHTTPHeaders interpolatedHeaders) $
87
+ setRequestHeaders (toHTTPHeaders interpolatedHeaders) .
88
+ (if tlsCheckType == DoTLSCheck then id else (setRequestManager manager)) $
72
89
initReq {method = B8S. pack . show $ requestMethod curlCase}
73
90
logger state DEBUG (pShow request)
74
91
logger
@@ -183,8 +200,8 @@ printR :: Show a => a -> IO a
183
200
printR x = print x >> return x
184
201
185
202
-- | Runs the test cases in order and stop when an error is hit. Returns all the results
186
- runSuite :: CurlSuite -> LogLevel -> IO [CaseResult ]
187
- runSuite (CurlSuite cases filterRegex) logLevel = do
203
+ runSuite :: CurlSuite -> LogLevel -> TLSCheckType -> IO [CaseResult ]
204
+ runSuite (CurlSuite cases filterRegex) logLevel tlsType = do
188
205
fullEnv <- getEnvironment
189
206
let envMap = H. fromList $ map (\ (x, y) -> (T. pack x, T. pack y)) fullEnv
190
207
filterNameByRegexp curlCase =
@@ -198,12 +215,12 @@ runSuite (CurlSuite cases filterRegex) logLevel = do
198
215
Just CaseFail {} -> return prevResults
199
216
Just CasePass {} -> do
200
217
result <-
201
- runCase (CurlRunningsState envMap prevResults logLevel) curlCase >>=
218
+ runCase (CurlRunningsState envMap prevResults logLevel tlsType ) curlCase >>=
202
219
printR
203
220
return $ prevResults ++ [result]
204
221
Nothing -> do
205
222
result <-
206
- runCase (CurlRunningsState envMap [] logLevel) curlCase >>= printR
223
+ runCase (CurlRunningsState envMap [] logLevel tlsType ) curlCase >>= printR
207
224
return [result])
208
225
[]
209
226
(filter filterNameByRegexp cases)
@@ -367,14 +384,14 @@ getStringValueForQuery state i@(InterpolatedQuery rawText (Query _)) =
367
384
Left l -> Left l
368
385
Right (String s) -> Right $ rawText <> s
369
386
(Right o) -> Left $ QueryTypeMismatch " Expected a string" o
370
- getStringValueForQuery (CurlRunningsState env _ _) (InterpolatedQuery rawText (EnvironmentVariable v)) =
387
+ getStringValueForQuery (CurlRunningsState env _ _ _ ) (InterpolatedQuery rawText (EnvironmentVariable v)) =
371
388
Right $ rawText <> H. lookupDefault " " v env
372
389
373
390
-- | Lookup the value for the specified query
374
391
getValueForQuery ::
375
392
CurlRunningsState -> InterpolatedQuery -> Either QueryError Value
376
393
getValueForQuery _ (LiteralText rawText) = Right $ String rawText
377
- getValueForQuery (CurlRunningsState _ previousResults _) full@ (NonInterpolatedQuery (Query indexes)) =
394
+ getValueForQuery (CurlRunningsState _ previousResults _ _ ) full@ (NonInterpolatedQuery (Query indexes)) =
378
395
case head indexes of
379
396
(CaseResultIndex i) ->
380
397
let maybeCase = arrayGet previousResults $ fromInteger i
@@ -417,7 +434,7 @@ getValueForQuery (CurlRunningsState _ previousResults _) full@(NonInterpolatedQu
417
434
T. pack $
418
435
" '$< ... >' queries must start with a RESPONSES[index] query: " ++
419
436
show full
420
- getValueForQuery (CurlRunningsState env _ _) (NonInterpolatedQuery (EnvironmentVariable var)) =
437
+ getValueForQuery (CurlRunningsState env _ _ _ ) (NonInterpolatedQuery (EnvironmentVariable var)) =
421
438
Right . String $ H. lookupDefault " " var env
422
439
getValueForQuery state (InterpolatedQuery _ q) =
423
440
case getValueForQuery state (NonInterpolatedQuery q) of
0 commit comments