{-# LANGUAGE OverloadedStrings #-}
module Keter.Types.V04 where
import Control.Applicative
import Data.Aeson
import Data.Bool
import Data.Conduit.Network (HostPreference)
import Data.Default
import qualified Data.Set as Set
import Data.String (fromString)
import Data.Yaml.FilePath
import qualified System.FilePath as F
import Keter.Types.Common
import Network.HTTP.ReverseProxy.Rewrite
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.Wai.Handler.WarpTLS as WarpTLS
import qualified Network.TLS.SessionManager as TLSSession
import Prelude hiding (FilePath)
data AppConfig = AppConfig
{ AppConfig -> FilePath
configExec :: F.FilePath
, AppConfig -> [Text]
configArgs :: [Text]
, AppConfig -> Text
configHost :: Text
, AppConfig -> Bool
configSsl :: Bool
, :: Set Text
, AppConfig -> Object
configRaw :: Object
}
instance ParseYamlFile AppConfig where
parseYamlFile :: BaseDir -> Value -> Parser AppConfig
parseYamlFile BaseDir
basedir = FilePath
-> (Object -> Parser AppConfig) -> Value -> Parser AppConfig
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"AppConfig" ((Object -> Parser AppConfig) -> Value -> Parser AppConfig)
-> (Object -> Parser AppConfig) -> Value -> Parser AppConfig
forall a b. (a -> b) -> a -> b
$ \Object
o -> FilePath
-> [Text] -> Text -> Bool -> Set Text -> Object -> AppConfig
AppConfig
(FilePath
-> [Text] -> Text -> Bool -> Set Text -> Object -> AppConfig)
-> Parser FilePath
-> Parser
([Text] -> Text -> Bool -> Set Text -> Object -> AppConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BaseDir -> Object -> Text -> Parser FilePath
forall a. ParseYamlFile a => BaseDir -> Object -> Text -> Parser a
lookupBase BaseDir
basedir Object
o Text
"exec"
Parser ([Text] -> Text -> Bool -> Set Text -> Object -> AppConfig)
-> Parser [Text]
-> Parser (Text -> Bool -> Set Text -> Object -> AppConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [Text])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"args" Parser (Maybe [Text]) -> [Text] -> Parser [Text]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
Parser (Text -> Bool -> Set Text -> Object -> AppConfig)
-> Parser Text -> Parser (Bool -> Set Text -> Object -> AppConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"host"
Parser (Bool -> Set Text -> Object -> AppConfig)
-> Parser Bool -> Parser (Set Text -> Object -> AppConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"ssl" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
Parser (Set Text -> Object -> AppConfig)
-> Parser (Set Text) -> Parser (Object -> AppConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Set Text))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"extra-hosts" Parser (Maybe (Set Text)) -> Set Text -> Parser (Set Text)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Set Text
forall a. Set a
Set.empty
Parser (Object -> AppConfig) -> Parser Object -> Parser AppConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object -> Parser Object
forall (m :: * -> *) a. Monad m => a -> m a
return Object
o
data BundleConfig = BundleConfig
{ BundleConfig -> Maybe AppConfig
bconfigApp :: Maybe AppConfig
, BundleConfig -> Set StaticHost
bconfigStaticHosts :: Set StaticHost
, BundleConfig -> Set Redirect
bconfigRedirects :: Set Redirect
}
instance ParseYamlFile BundleConfig where
parseYamlFile :: BaseDir -> Value -> Parser BundleConfig
parseYamlFile BaseDir
basedir = FilePath
-> (Object -> Parser BundleConfig) -> Value -> Parser BundleConfig
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"BundleConfig" ((Object -> Parser BundleConfig) -> Value -> Parser BundleConfig)
-> (Object -> Parser BundleConfig) -> Value -> Parser BundleConfig
forall a b. (a -> b) -> a -> b
$ \Object
o -> Maybe AppConfig -> Set StaticHost -> Set Redirect -> BundleConfig
BundleConfig
(Maybe AppConfig -> Set StaticHost -> Set Redirect -> BundleConfig)
-> Parser (Maybe AppConfig)
-> Parser (Set StaticHost -> Set Redirect -> BundleConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((AppConfig -> Maybe AppConfig
forall a. a -> Maybe a
Just (AppConfig -> Maybe AppConfig)
-> Parser AppConfig -> Parser (Maybe AppConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BaseDir -> Value -> Parser AppConfig
forall a. ParseYamlFile a => BaseDir -> Value -> Parser a
parseYamlFile BaseDir
basedir (Object -> Value
Object Object
o)) Parser (Maybe AppConfig)
-> Parser (Maybe AppConfig) -> Parser (Maybe AppConfig)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe AppConfig -> Parser (Maybe AppConfig)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe AppConfig
forall a. Maybe a
Nothing)
Parser (Set StaticHost -> Set Redirect -> BundleConfig)
-> Parser (Set StaticHost) -> Parser (Set Redirect -> BundleConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BaseDir -> Object -> Text -> Parser (Maybe (Set StaticHost))
forall a.
ParseYamlFile a =>
BaseDir -> Object -> Text -> Parser (Maybe a)
lookupBaseMaybe BaseDir
basedir Object
o Text
"static-hosts" Parser (Maybe (Set StaticHost))
-> Set StaticHost -> Parser (Set StaticHost)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Set StaticHost
forall a. Set a
Set.empty
Parser (Set Redirect -> BundleConfig)
-> Parser (Set Redirect) -> Parser BundleConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Set Redirect))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"redirects" Parser (Maybe (Set Redirect))
-> Set Redirect -> Parser (Set Redirect)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Set Redirect
forall a. Set a
Set.empty
data StaticHost = StaticHost
{ StaticHost -> Text
shHost :: Text
, StaticHost -> FilePath
shRoot :: FilePath
}
deriving (StaticHost -> StaticHost -> Bool
(StaticHost -> StaticHost -> Bool)
-> (StaticHost -> StaticHost -> Bool) -> Eq StaticHost
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StaticHost -> StaticHost -> Bool
$c/= :: StaticHost -> StaticHost -> Bool
== :: StaticHost -> StaticHost -> Bool
$c== :: StaticHost -> StaticHost -> Bool
Eq, Eq StaticHost
Eq StaticHost
-> (StaticHost -> StaticHost -> Ordering)
-> (StaticHost -> StaticHost -> Bool)
-> (StaticHost -> StaticHost -> Bool)
-> (StaticHost -> StaticHost -> Bool)
-> (StaticHost -> StaticHost -> Bool)
-> (StaticHost -> StaticHost -> StaticHost)
-> (StaticHost -> StaticHost -> StaticHost)
-> Ord StaticHost
StaticHost -> StaticHost -> Bool
StaticHost -> StaticHost -> Ordering
StaticHost -> StaticHost -> StaticHost
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: StaticHost -> StaticHost -> StaticHost
$cmin :: StaticHost -> StaticHost -> StaticHost
max :: StaticHost -> StaticHost -> StaticHost
$cmax :: StaticHost -> StaticHost -> StaticHost
>= :: StaticHost -> StaticHost -> Bool
$c>= :: StaticHost -> StaticHost -> Bool
> :: StaticHost -> StaticHost -> Bool
$c> :: StaticHost -> StaticHost -> Bool
<= :: StaticHost -> StaticHost -> Bool
$c<= :: StaticHost -> StaticHost -> Bool
< :: StaticHost -> StaticHost -> Bool
$c< :: StaticHost -> StaticHost -> Bool
compare :: StaticHost -> StaticHost -> Ordering
$ccompare :: StaticHost -> StaticHost -> Ordering
$cp1Ord :: Eq StaticHost
Ord)
instance ParseYamlFile StaticHost where
parseYamlFile :: BaseDir -> Value -> Parser StaticHost
parseYamlFile BaseDir
basedir = FilePath
-> (Object -> Parser StaticHost) -> Value -> Parser StaticHost
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"StaticHost" ((Object -> Parser StaticHost) -> Value -> Parser StaticHost)
-> (Object -> Parser StaticHost) -> Value -> Parser StaticHost
forall a b. (a -> b) -> a -> b
$ \Object
o -> Text -> FilePath -> StaticHost
StaticHost
(Text -> FilePath -> StaticHost)
-> Parser Text -> Parser (FilePath -> StaticHost)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"host"
Parser (FilePath -> StaticHost)
-> Parser FilePath -> Parser StaticHost
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> BaseDir -> Object -> Text -> Parser FilePath
forall a. ParseYamlFile a => BaseDir -> Object -> Text -> Parser a
lookupBase BaseDir
basedir Object
o Text
"root"
data Redirect = Redirect
{ Redirect -> Text
redFrom :: Text
, Redirect -> Text
redTo :: Text
}
deriving (Redirect -> Redirect -> Bool
(Redirect -> Redirect -> Bool)
-> (Redirect -> Redirect -> Bool) -> Eq Redirect
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Redirect -> Redirect -> Bool
$c/= :: Redirect -> Redirect -> Bool
== :: Redirect -> Redirect -> Bool
$c== :: Redirect -> Redirect -> Bool
Eq, Eq Redirect
Eq Redirect
-> (Redirect -> Redirect -> Ordering)
-> (Redirect -> Redirect -> Bool)
-> (Redirect -> Redirect -> Bool)
-> (Redirect -> Redirect -> Bool)
-> (Redirect -> Redirect -> Bool)
-> (Redirect -> Redirect -> Redirect)
-> (Redirect -> Redirect -> Redirect)
-> Ord Redirect
Redirect -> Redirect -> Bool
Redirect -> Redirect -> Ordering
Redirect -> Redirect -> Redirect
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Redirect -> Redirect -> Redirect
$cmin :: Redirect -> Redirect -> Redirect
max :: Redirect -> Redirect -> Redirect
$cmax :: Redirect -> Redirect -> Redirect
>= :: Redirect -> Redirect -> Bool
$c>= :: Redirect -> Redirect -> Bool
> :: Redirect -> Redirect -> Bool
$c> :: Redirect -> Redirect -> Bool
<= :: Redirect -> Redirect -> Bool
$c<= :: Redirect -> Redirect -> Bool
< :: Redirect -> Redirect -> Bool
$c< :: Redirect -> Redirect -> Bool
compare :: Redirect -> Redirect -> Ordering
$ccompare :: Redirect -> Redirect -> Ordering
$cp1Ord :: Eq Redirect
Ord)
instance FromJSON Redirect where
parseJSON :: Value -> Parser Redirect
parseJSON (Object Object
o) = Text -> Text -> Redirect
Redirect
(Text -> Text -> Redirect)
-> Parser Text -> Parser (Text -> Redirect)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"from"
Parser (Text -> Redirect) -> Parser Text -> Parser Redirect
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"to"
parseJSON Value
_ = FilePath -> Parser Redirect
forall (m :: * -> *) a. MonadFail m => FilePath -> m a
fail FilePath
"Wanted an object"
data KeterConfig = KeterConfig
{ KeterConfig -> FilePath
kconfigDir :: F.FilePath
, KeterConfig -> PortSettings
kconfigPortMan :: PortSettings
, KeterConfig -> HostPreference
kconfigHost :: HostPreference
, KeterConfig -> Port
kconfigPort :: Port
, KeterConfig -> Maybe TLSConfig
kconfigSsl :: Maybe TLSConfig
, KeterConfig -> Maybe Text
kconfigSetuid :: Maybe Text
, KeterConfig -> Set ReverseProxyConfig
kconfigReverseProxy :: Set ReverseProxyConfig
, :: Bool
, KeterConfig -> Port
kconfigConnectionTimeBound :: Int
}
instance Default KeterConfig where
def :: KeterConfig
def = KeterConfig :: FilePath
-> PortSettings
-> HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig
KeterConfig
{ kconfigDir :: FilePath
kconfigDir = FilePath
"."
, kconfigPortMan :: PortSettings
kconfigPortMan = PortSettings
forall a. Default a => a
def
, kconfigHost :: HostPreference
kconfigHost = HostPreference
"*"
, kconfigPort :: Port
kconfigPort = Port
80
, kconfigSsl :: Maybe TLSConfig
kconfigSsl = Maybe TLSConfig
forall a. Maybe a
Nothing
, kconfigSetuid :: Maybe Text
kconfigSetuid = Maybe Text
forall a. Maybe a
Nothing
, kconfigReverseProxy :: Set ReverseProxyConfig
kconfigReverseProxy = Set ReverseProxyConfig
forall a. Set a
Set.empty
, kconfigIpFromHeader :: Bool
kconfigIpFromHeader = Bool
False
, kconfigConnectionTimeBound :: Port
kconfigConnectionTimeBound = Port
fiveMinutes
}
fiveMinutes :: Int
fiveMinutes :: Port
fiveMinutes = Port
5 Port -> Port -> Port
forall a. Num a => a -> a -> a
* Port
60 Port -> Port -> Port
forall a. Num a => a -> a -> a
* Port
1000
instance ParseYamlFile KeterConfig where
parseYamlFile :: BaseDir -> Value -> Parser KeterConfig
parseYamlFile BaseDir
basedir = FilePath
-> (Object -> Parser KeterConfig) -> Value -> Parser KeterConfig
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"KeterConfig" ((Object -> Parser KeterConfig) -> Value -> Parser KeterConfig)
-> (Object -> Parser KeterConfig) -> Value -> Parser KeterConfig
forall a b. (a -> b) -> a -> b
$ \Object
o -> FilePath
-> PortSettings
-> HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig
KeterConfig
(FilePath
-> PortSettings
-> HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
-> Parser FilePath
-> Parser
(PortSettings
-> HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> BaseDir -> Object -> Text -> Parser FilePath
forall a. ParseYamlFile a => BaseDir -> Object -> Text -> Parser a
lookupBase BaseDir
basedir Object
o Text
"root"
Parser
(PortSettings
-> HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
-> Parser PortSettings
-> Parser
(HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe PortSettings)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"port-manager" Parser (Maybe PortSettings) -> PortSettings -> Parser PortSettings
forall a. Parser (Maybe a) -> a -> Parser a
.!= PortSettings
forall a. Default a => a
def
Parser
(HostPreference
-> Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
-> Parser HostPreference
-> Parser
(Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((FilePath -> HostPreference)
-> Maybe FilePath -> Maybe HostPreference
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FilePath -> HostPreference
forall a. IsString a => FilePath -> a
fromString (Maybe FilePath -> Maybe HostPreference)
-> Parser (Maybe FilePath) -> Parser (Maybe HostPreference)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe FilePath)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"host") Parser (Maybe HostPreference)
-> HostPreference -> Parser HostPreference
forall a. Parser (Maybe a) -> a -> Parser a
.!= KeterConfig -> HostPreference
kconfigHost KeterConfig
forall a. Default a => a
def
Parser
(Port
-> Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
-> Parser Port
-> Parser
(Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Port)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"port" Parser (Maybe Port) -> Port -> Parser Port
forall a. Parser (Maybe a) -> a -> Parser a
.!= KeterConfig -> Port
kconfigPort KeterConfig
forall a. Default a => a
def
Parser
(Maybe TLSConfig
-> Maybe Text
-> Set ReverseProxyConfig
-> Bool
-> Port
-> KeterConfig)
-> Parser (Maybe TLSConfig)
-> Parser
(Maybe Text
-> Set ReverseProxyConfig -> Bool -> Port -> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Object
o Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"ssl" Parser (Maybe Value)
-> (Maybe Value -> Parser (Maybe TLSConfig))
-> Parser (Maybe TLSConfig)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser (Maybe TLSConfig)
-> (Value -> Parser (Maybe TLSConfig))
-> Maybe Value
-> Parser (Maybe TLSConfig)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Maybe TLSConfig -> Parser (Maybe TLSConfig)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe TLSConfig
forall a. Maybe a
Nothing) ((TLSConfig -> Maybe TLSConfig)
-> Parser TLSConfig -> Parser (Maybe TLSConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TLSConfig -> Maybe TLSConfig
forall a. a -> Maybe a
Just (Parser TLSConfig -> Parser (Maybe TLSConfig))
-> (Value -> Parser TLSConfig) -> Value -> Parser (Maybe TLSConfig)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BaseDir -> Value -> Parser TLSConfig
forall a. ParseYamlFile a => BaseDir -> Value -> Parser a
parseYamlFile BaseDir
basedir))
Parser
(Maybe Text
-> Set ReverseProxyConfig -> Bool -> Port -> KeterConfig)
-> Parser (Maybe Text)
-> Parser (Set ReverseProxyConfig -> Bool -> Port -> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"setuid"
Parser (Set ReverseProxyConfig -> Bool -> Port -> KeterConfig)
-> Parser (Set ReverseProxyConfig)
-> Parser (Bool -> Port -> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Set ReverseProxyConfig))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"reverse-proxy" Parser (Maybe (Set ReverseProxyConfig))
-> Set ReverseProxyConfig -> Parser (Set ReverseProxyConfig)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Set ReverseProxyConfig
forall a. Set a
Set.empty
Parser (Bool -> Port -> KeterConfig)
-> Parser Bool -> Parser (Port -> KeterConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"ip-from-header" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
Parser (Port -> KeterConfig) -> Parser Port -> Parser KeterConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Port)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"connection-time-bound" Parser (Maybe Port) -> Port -> Parser Port
forall a. Parser (Maybe a) -> a -> Parser a
.!= Port
fiveMinutes
data TLSConfig = TLSConfig !Warp.Settings !FilePath !FilePath (Maybe TLSSession.Config)
instance ParseYamlFile TLSConfig where
parseYamlFile :: BaseDir -> Value -> Parser TLSConfig
parseYamlFile BaseDir
basedir = FilePath
-> (Object -> Parser TLSConfig) -> Value -> Parser TLSConfig
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"TLSConfig" ((Object -> Parser TLSConfig) -> Value -> Parser TLSConfig)
-> (Object -> Parser TLSConfig) -> Value -> Parser TLSConfig
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
FilePath
cert <- BaseDir -> Object -> Text -> Parser FilePath
forall a. ParseYamlFile a => BaseDir -> Object -> Text -> Parser a
lookupBase BaseDir
basedir Object
o Text
"certificate"
FilePath
key <- BaseDir -> Object -> Text -> Parser FilePath
forall a. ParseYamlFile a => BaseDir -> Object -> Text -> Parser a
lookupBase BaseDir
basedir Object
o Text
"key"
HostPreference
host <- ((FilePath -> HostPreference)
-> Maybe FilePath -> Maybe HostPreference
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FilePath -> HostPreference
forall a. IsString a => FilePath -> a
fromString (Maybe FilePath -> Maybe HostPreference)
-> Parser (Maybe FilePath) -> Parser (Maybe HostPreference)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe FilePath)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"host") Parser (Maybe HostPreference)
-> HostPreference -> Parser HostPreference
forall a. Parser (Maybe a) -> a -> Parser a
.!= HostPreference
"*"
Port
port <- Object
o Object -> Key -> Parser (Maybe Port)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"port" Parser (Maybe Port) -> Port -> Parser Port
forall a. Parser (Maybe a) -> a -> Parser a
.!= Port
443
Maybe Config
session <- Maybe Config -> Maybe Config -> Bool -> Maybe Config
forall a. a -> a -> Bool -> a
bool Maybe Config
forall a. Maybe a
Nothing (Config -> Maybe Config
forall a. a -> Maybe a
Just Config
TLSSession.defaultConfig) (Bool -> Maybe Config) -> Parser Bool -> Parser (Maybe Config)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"session" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
TLSConfig -> Parser TLSConfig
forall (m :: * -> *) a. Monad m => a -> m a
return (TLSConfig -> Parser TLSConfig) -> TLSConfig -> Parser TLSConfig
forall a b. (a -> b) -> a -> b
$! Settings -> FilePath -> FilePath -> Maybe Config -> TLSConfig
TLSConfig
(HostPreference -> Settings -> Settings
Warp.setHost HostPreference
host (Settings -> Settings) -> Settings -> Settings
forall a b. (a -> b) -> a -> b
$ Port -> Settings -> Settings
Warp.setPort Port
port Settings
Warp.defaultSettings)
FilePath
cert
FilePath
key
Maybe Config
session
data PortSettings = PortSettings
{ PortSettings -> [Port]
portRange :: [Port]
}
instance Default PortSettings where
def :: PortSettings
def = PortSettings :: [Port] -> PortSettings
PortSettings
{ portRange :: [Port]
portRange = [Port
43124..Port
44320]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
28120..Port
29166]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
45967..Port
46997]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
28241..Port
29117]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
40001..Port
40840]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
29170..Port
29998]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
38866..Port
39680]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
43442..Port
44122]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
41122..Port
41793]
[Port] -> [Port] -> [Port]
forall a. [a] -> [a] -> [a]
++ [Port
35358..Port
36000]
}
instance FromJSON PortSettings where
parseJSON :: Value -> Parser PortSettings
parseJSON = FilePath
-> (Object -> Parser PortSettings) -> Value -> Parser PortSettings
forall a. FilePath -> (Object -> Parser a) -> Value -> Parser a
withObject FilePath
"PortSettings" ((Object -> Parser PortSettings) -> Value -> Parser PortSettings)
-> (Object -> Parser PortSettings) -> Value -> Parser PortSettings
forall a b. (a -> b) -> a -> b
$ \Object
_ -> [Port] -> PortSettings
PortSettings
([Port] -> PortSettings) -> Parser [Port] -> Parser PortSettings
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Port] -> Parser [Port]
forall (m :: * -> *) a. Monad m => a -> m a
return (PortSettings -> [Port]
portRange PortSettings
forall a. Default a => a
def)