Cybersecurity-Projects/PROJECTS/advanced/haskell-reverse-proxy/app/Main.hs

62 lines
1.6 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Aenebris.Config
import Aenebris.Connection
( defaultTimeoutConfig
, microsPerSecond
, tcUpstreamReadSeconds
)
import Aenebris.Proxy
import Network.HTTP.Client
( ManagerSettings(..)
, defaultManagerSettings
, newManager
, responseTimeoutMicro
)
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
main :: IO ()
main = do
args <- getArgs
-- Get config file path from args or use default
let configPath = case args of
(path:_) -> path
[] -> "config.yaml"
putStrLn $ "Loading configuration from: " ++ configPath
result <- loadConfig configPath
case result of
Left err -> do
hPutStrLn stderr $ "ERROR: Failed to load configuration"
hPutStrLn stderr err
exitFailure
Right config -> do
case validateConfig config of
Left err -> do
hPutStrLn stderr $ "ERROR: Invalid configuration"
hPutStrLn stderr err
exitFailure
Right () -> do
putStrLn "Configuration loaded and validated successfully"
let upstreamMicros = tcUpstreamReadSeconds defaultTimeoutConfig
* microsPerSecond
managerSettings = defaultManagerSettings
{ managerResponseTimeout = responseTimeoutMicro upstreamMicros
}
manager <- newManager managerSettings
-- Initialize proxy state (load balancers + health checkers)
proxyState <- initProxyState config manager
-- Start the proxy
startProxy proxyState