diff --git a/src/Main.hs b/src/Main.hs index df321cb..072fce0 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -334,7 +334,7 @@ readSecretKey = fmap ByteString.Char8.strip . ByteString.readFile main :: IO () main = do - options@Options{ priority, verbosity } <- do + options@Options{ priority, timeout, verbosity } <- do Options.execParser Options.parserInfo storeDirectory <- Nix.getStoreDir @@ -351,27 +351,29 @@ main = do let application = logger (makeApplication ApplicationOptions{..}) + let sharedSettings = + Warp.defaultSettings + & Warp.setTimeout (fromIntegral timeout) + case options of Options{ ssl = Disabled, socket = TCP{ host, port } } -> do let settings = - Warp.defaultSettings + sharedSettings & Warp.setHost host & Warp.setPort port Warp.runSettings settings application Options{ ssl = Disabled, socket = Unix{ backlog, path } } -> do - let settings = Warp.defaultSettings - socket <- toSocket backlog path - Warp.runSettingsSocket settings socket application + Warp.runSettingsSocket sharedSettings socket application Options{ ssl = Enabled{ cert, key }, socket = TCP{ host, port } } -> do let tlsSettings = WarpTLS.tlsSettings cert key let settings = - Warp.defaultSettings + sharedSettings & Warp.setHost host & Warp.setPort port @@ -380,8 +382,6 @@ main = do Options{ ssl = Enabled{ cert, key }, socket = Unix{ backlog, path } } -> do let tlsSettings = WarpTLS.tlsSettings cert key - let settings = Warp.defaultSettings - socket <- toSocket backlog path - WarpTLS.runTLSSocket tlsSettings settings socket application + WarpTLS.runTLSSocket tlsSettings sharedSettings socket application diff --git a/src/Options.hs b/src/Options.hs index 42e6edb..029f402 100644 --- a/src/Options.hs +++ b/src/Options.hs @@ -29,6 +29,7 @@ data Options = Options { priority :: Integer , socket :: Socket , ssl :: SSL + , timeout :: Natural , verbosity :: Verbosity } @@ -128,6 +129,17 @@ parsePriority = <> Options.value 30 ) +parseTimeout :: Parser Natural +parseTimeout = + Options.option Options.auto + ( Options.long "timeout" + <> Options.help "Timeout for requests" + <> Options.metavar "SECONDS" + -- nix-serve does not timeout requests, but warp insists on a + -- timeout, so we use the same default timeout as hydra + <> Options.value (10 * 60) + ) + parseVerbosity :: Parser Verbosity parseVerbosity = Options.flag' Quiet @@ -148,6 +160,8 @@ parseOptions = do priority <- parsePriority + timeout <- parseTimeout + verbosity <- parseVerbosity return Options{..} @@ -198,6 +212,8 @@ parseListen = do priority <- parsePriority + timeout <- parseTimeout + verbosity <- parseVerbosity return Options{..}