Skip to content

Commit f9561c4

Browse files
authored
Merge pull request #38 from aviaviavi/skip-tls-check
skip-tls-check option
2 parents 9fa5f26 + b802d67 commit f9561c4

File tree

6 files changed

+56
-35
lines changed

6 files changed

+56
-35
lines changed

app/Main.hs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ import Testing.CurlRunnings.Types
3030

3131
-- | Command line flags
3232
data CurlRunnings = CurlRunnings
33-
{ file :: FilePath
34-
, grep :: Maybe T.Text
35-
, upgrade :: Bool
33+
{ file :: FilePath
34+
, grep :: Maybe T.Text
35+
, upgrade :: Bool
36+
, skip_tls_check :: Bool
3637
} deriving (Show, Data, Typeable, Eq)
3738

3839
-- | cmdargs object
@@ -42,6 +43,7 @@ argParser =
4243
{ file = def &= typFile &= help "File to run"
4344
, grep = def &= help "Regex to filter test cases by name"
4445
, upgrade = def &= help "Pull the latest version of curl runnings"
46+
, skip_tls_check = def &= help "Don't perform a TLS check (USE WITH CAUTION. Only use this if you signed your own certs)"
4547
} &=
4648
summary ("curl-runnings " ++ showVersion version) &=
4749
program "curl-runnings" &=
@@ -72,17 +74,17 @@ instance FromJSON GithubReleasesResponse
7274
setGithubReqHeaders :: Request -> Request
7375
setGithubReqHeaders = setRequestHeaders [("User-Agent", "aviaviavi")]
7476

75-
runFile :: FilePath -> Verbosity -> Maybe T.Text -> IO ()
76-
runFile "" _ _ =
77+
runFile :: FilePath -> Verbosity -> Maybe T.Text -> TLSCheckType -> IO ()
78+
runFile "" _ _ _ =
7779
putStrLn
7880
"Please specify an input file with the --file (-f) flag or use --help for more information"
79-
runFile path verbosityLevel regexp = do
81+
runFile path verbosityLevel regexp tlsType = do
8082
home <- getEnv "HOME"
8183
suite <- decodeFile . T.unpack $ T.replace "~" (T.pack home) (T.pack path)
8284
case suite of
8385
Right s -> do
8486
results <-
85-
runSuite (s {suiteCaseFilter = regexp}) $ toLogLevel verbosityLevel
87+
runSuite (s {suiteCaseFilter = regexp}) (toLogLevel verbosityLevel) $ tlsType
8688
if any isFailing results
8789
then putStrLn (T.unpack $ makeRed "Some tests failed") >>
8890
exitWith (ExitFailure 1)
@@ -188,6 +190,7 @@ main :: IO ()
188190
main = do
189191
userArgs <- cmdArgs argParser
190192
verbosityLevel <- getVerbosity
193+
let tlsCheckType = if skip_tls_check userArgs then SkipTLSCheck else DoTLSCheck
191194
if upgrade userArgs
192195
then upgradeCurlRunnings
193-
else runFile (file userArgs) verbosityLevel (grep userArgs)
196+
else runFile (file userArgs) verbosityLevel (grep userArgs) tlsCheckType

curl-runnings.cabal

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
-- This file has been generated from package.yaml by hpack version 0.28.2.
1+
cabal-version: 1.12
2+
3+
-- This file has been generated from package.yaml by hpack version 0.31.0.
24
--
35
-- see: https://github.com/sol/hpack
46
--
5-
-- hash: 0e66b58842dd3cfc4bba11992201740113a8539e45270702205df083d4feb579
7+
-- hash: 189771adeec42ac2e6e8c4262b0b81286359f74f9b96f05112a73a634b960615
68

79
name: curl-runnings
810
version: 0.9.2
@@ -17,13 +19,12 @@ copyright: 2018 Avi Press
1719
license: MIT
1820
license-file: LICENSE
1921
build-type: Simple
20-
cabal-version: >= 1.10
2122
extra-source-files:
23+
README.md
2224
examples/example-spec.json
2325
examples/example-spec.yaml
2426
examples/importable.yaml
2527
examples/interpolation-spec.yaml
26-
README.md
2728

2829
source-repository head
2930
type: git
@@ -34,12 +35,14 @@ library
3435
src
3536
build-depends:
3637
aeson >=1.2.4.0
37-
, base >=4.7 && <5
38+
, base >=4.0 && <5
3839
, bytestring >=0.10.8.2
3940
, case-insensitive >=0.2.1
41+
, connection >=0.2.8
4042
, directory >=1.3.0.2
4143
, hspec >=2.4.4
4244
, hspec-expectations >=0.8.2
45+
, http-client-tls >=0.3.5.3
4346
, http-conduit >=2.2.4
4447
, http-types >=0.9.1
4548
, megaparsec >=6.3.0
@@ -85,7 +88,7 @@ test-suite curl-runnings-test
8588
test
8689
ghc-options: -threaded -rtsopts -with-rtsopts=-N
8790
build-depends:
88-
base >=4.7 && <5
91+
base >=4.0 && <5
8992
, curl-runnings
9093
, directory >=1.3.0.2
9194
, hspec >=2.4.4

package.yaml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,10 @@ extra-source-files:
1212
- README.md
1313
- examples/*
1414

15-
# Metadata used when publishing your package
16-
# synopsis: Short description of your package
17-
# category: Web
18-
19-
# To avoid duplicated efforts in documentation and dealing with the
20-
# complications of embedding Haddock markup inside cabal files, it is
21-
# common to point users to the README.md file.
2215
description: Please see the README on Github at <https://github.com/aviaviavi/curl-runnings#readme>
2316

2417
dependencies:
25-
- base >= 4.7 && < 5
18+
- base >= 4.0 && < 5
2619

2720
library:
2821
source-dirs: src
@@ -41,6 +34,8 @@ library:
4134
- http-conduit >=2.2.4
4235
- http-types >=0.9.1
4336
- megaparsec >=6.3.0
37+
- connection >=0.2.8
38+
- http-client-tls >=0.3.5.3
4439
- pretty-simple >=2.0.2.1
4540
- regex-posix >=0.95.2
4641
- text >=1.2.2.2

src/Testing/CurlRunnings.hs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import Data.Monoid
2424
import qualified Data.Text as T
2525
import qualified Data.Vector as V
2626
import qualified Data.Yaml.Include as YI
27+
import Network.Connection (TLSSettings (..))
28+
import Network.HTTP.Client.TLS (mkManagerSettings)
2729
import Network.HTTP.Conduit
2830
import Network.HTTP.Simple
2931
import qualified Network.HTTP.Types.Header as HTTP
@@ -35,6 +37,7 @@ import Testing.CurlRunnings.Types
3537
import Text.Printf
3638
import Text.Regex.Posix
3739

40+
3841
-- | decode a json or yaml file into a suite object
3942
decodeFile :: FilePath -> IO (Either String CurlSuite)
4043
decodeFile specPath =
@@ -48,10 +51,22 @@ decodeFile specPath =
4851
_ -> return . Left $ printf "Invalid spec path %s" specPath
4952
else return . Left $ printf "%s not found" specPath
5053

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+
5166
-- | Run a single test case, and returns the result. IO is needed here since this method is responsible
5267
-- for actually curling the test case endpoint and parsing the result.
5368
runCase :: CurlRunningsState -> CurlCase -> IO CaseResult
54-
runCase state curlCase = do
69+
runCase state@(CurlRunningsState _ _ _ tlsCheckType) curlCase = do
5570
let eInterpolatedUrl = interpolateQueryString state $ url curlCase
5671
eInterpolatedHeaders =
5772
interpolateHeaders state $ fromMaybe (HeaderSet []) (headers curlCase)
@@ -66,9 +81,11 @@ runCase state curlCase = do
6681
return $ CaseFail curlCase Nothing Nothing [QueryFailure curlCase l]
6782
Right replacedJSON -> do
6883
initReq <- parseRequest $ T.unpack interpolatedUrl
84+
manager <- newManager noVerifyTlsManagerSettings
6985
let request =
7086
setRequestBodyJSON (fromMaybe emptyObject replacedJSON) .
71-
setRequestHeaders (toHTTPHeaders interpolatedHeaders) $
87+
setRequestHeaders (toHTTPHeaders interpolatedHeaders) .
88+
(if tlsCheckType == DoTLSCheck then id else (setRequestManager manager)) $
7289
initReq {method = B8S.pack . show $ requestMethod curlCase}
7390
logger state DEBUG (pShow request)
7491
logger
@@ -183,8 +200,8 @@ printR :: Show a => a -> IO a
183200
printR x = print x >> return x
184201

185202
-- | 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
188205
fullEnv <- getEnvironment
189206
let envMap = H.fromList $ map (\(x, y) -> (T.pack x, T.pack y)) fullEnv
190207
filterNameByRegexp curlCase =
@@ -198,12 +215,12 @@ runSuite (CurlSuite cases filterRegex) logLevel = do
198215
Just CaseFail {} -> return prevResults
199216
Just CasePass {} -> do
200217
result <-
201-
runCase (CurlRunningsState envMap prevResults logLevel) curlCase >>=
218+
runCase (CurlRunningsState envMap prevResults logLevel tlsType) curlCase >>=
202219
printR
203220
return $ prevResults ++ [result]
204221
Nothing -> do
205222
result <-
206-
runCase (CurlRunningsState envMap [] logLevel) curlCase >>= printR
223+
runCase (CurlRunningsState envMap [] logLevel tlsType) curlCase >>= printR
207224
return [result])
208225
[]
209226
(filter filterNameByRegexp cases)
@@ -367,14 +384,14 @@ getStringValueForQuery state i@(InterpolatedQuery rawText (Query _)) =
367384
Left l -> Left l
368385
Right (String s) -> Right $ rawText <> s
369386
(Right o) -> Left $ QueryTypeMismatch "Expected a string" o
370-
getStringValueForQuery (CurlRunningsState env _ _) (InterpolatedQuery rawText (EnvironmentVariable v)) =
387+
getStringValueForQuery (CurlRunningsState env _ _ _) (InterpolatedQuery rawText (EnvironmentVariable v)) =
371388
Right $ rawText <> H.lookupDefault "" v env
372389

373390
-- | Lookup the value for the specified query
374391
getValueForQuery ::
375392
CurlRunningsState -> InterpolatedQuery -> Either QueryError Value
376393
getValueForQuery _ (LiteralText rawText) = Right $ String rawText
377-
getValueForQuery (CurlRunningsState _ previousResults _) full@(NonInterpolatedQuery (Query indexes)) =
394+
getValueForQuery (CurlRunningsState _ previousResults _ _) full@(NonInterpolatedQuery (Query indexes)) =
378395
case head indexes of
379396
(CaseResultIndex i) ->
380397
let maybeCase = arrayGet previousResults $ fromInteger i
@@ -417,7 +434,7 @@ getValueForQuery (CurlRunningsState _ previousResults _) full@(NonInterpolatedQu
417434
T.pack $
418435
"'$< ... >' queries must start with a RESPONSES[index] query: " ++
419436
show full
420-
getValueForQuery (CurlRunningsState env _ _) (NonInterpolatedQuery (EnvironmentVariable var)) =
437+
getValueForQuery (CurlRunningsState env _ _ _) (NonInterpolatedQuery (EnvironmentVariable var)) =
421438
Right . String $ H.lookupDefault "" var env
422439
getValueForQuery state (InterpolatedQuery _ q) =
423440
case getValueForQuery state (NonInterpolatedQuery q) of

src/Testing/CurlRunnings/Types.hs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module Testing.CurlRunnings.Types
2323
, FullQueryText
2424
, SingleQueryText
2525
, CurlRunningsState(..)
26+
, TLSCheckType(..)
2627

2728
, isFailing
2829
, isPassing
@@ -391,14 +392,16 @@ isFailing = not . isPassing
391392
-- | A map of the system environment
392393
type Environment = H.HashMap T.Text T.Text
393394

395+
data TLSCheckType = SkipTLSCheck | DoTLSCheck deriving (Show, Eq)
396+
394397
-- | The state of a suite. Tracks environment variables, and all the test results so far
395-
data CurlRunningsState = CurlRunningsState Environment [CaseResult] LogLevel
398+
data CurlRunningsState = CurlRunningsState Environment [CaseResult] LogLevel TLSCheckType
396399

397400
logger :: CurlRunningsState -> CurlRunningsLogger
398-
logger (CurlRunningsState _ _ l) = makeLogger l
401+
logger (CurlRunningsState _ _ l _) = makeLogger l
399402

400403
unsafeLogger :: Show a => CurlRunningsState -> CurlRunningsUnsafeLogger a
401-
unsafeLogger (CurlRunningsState _ _ l) = makeUnsafeLogger l
404+
unsafeLogger (CurlRunningsState _ _ l _) = makeUnsafeLogger l
402405

403406
-- | A single lookup operation in a json query
404407
data Index

stack.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# resolver:
1616
# name: custom-snapshot
1717
# location: "./custom-snapshot.yaml"
18-
resolver: lts-10.8
18+
resolver: lts-12.14
1919

2020
# User packages to be built.
2121
# Various formats can be used as shown in the example below.

0 commit comments

Comments
 (0)