diff --git a/yesod-bin/ChangeLog.md b/yesod-bin/ChangeLog.md index c739d782..a7780c0a 100644 --- a/yesod-bin/ChangeLog.md +++ b/yesod-bin/ChangeLog.md @@ -1,5 +1,9 @@ # ChangeLog for yesod-bin +## 1.6.1 + +Added command line options `cert` and `key` to allow TLS certificate and key files to be passed to `yesod devel` [#1717](https://github.com/yesodweb/yesod/pull/1717) + ## 1.6.0.6 Fix the `add-handler` subcommand to support both the old default routes filename (`routes`) and the new one (`routes.yesodroutes`) [#1688](https://github.com/yesodweb/yesod/pull/1688) diff --git a/yesod-bin/Devel.hs b/yesod-bin/Devel.hs index 901616f8..658119be 100644 --- a/yesod-bin/Devel.hs +++ b/yesod-bin/Devel.hs @@ -56,7 +56,7 @@ import Network.Wai (requestHeaderHost, responseLBS) import Network.Wai.Handler.Warp (defaultSettings, runSettings, setPort, setHost) -import Network.Wai.Handler.WarpTLS (runTLS, +import Network.Wai.Handler.WarpTLS (runTLS, tlsSettings, tlsSettingsMemory) import Network.Wai.Parse (parseHttpAccept) import Say @@ -126,6 +126,7 @@ data DevelOpts = DevelOpts , proxyTimeout :: Int , useReverseProxy :: Bool , develHost :: Maybe String + , cert :: Maybe (FilePath, FilePath) } deriving (Show, Eq) -- | Run a reverse proxy from the develPort and develTlsPort ports to @@ -170,10 +171,12 @@ reverseProxy opts appPortVar = do manager defaultSettings' = maybe id (setHost . fromString) (develHost opts) defaultSettings runProxyTls port app = do - let cert = $(embedFile "certificate.pem") - key = $(embedFile "key.pem") - tlsSettings = tlsSettingsMemory cert key - runTLS tlsSettings (setPort port defaultSettings') $ \req send -> do + let certDef = $(embedFile "certificate.pem") + keyDef = $(embedFile "key.pem") + theSettings = case cert opts of + Nothing -> tlsSettingsMemory certDef keyDef + Just (c,k) -> tlsSettings c k + runTLS theSettings (setPort port defaultSettings') $ \req send -> do let req' = req { requestHeaders = ("X-Forwarded-Proto", "https") diff --git a/yesod-bin/main.hs b/yesod-bin/main.hs index 3f3a071b..9e5d7d66 100755 --- a/yesod-bin/main.hs +++ b/yesod-bin/main.hs @@ -30,12 +30,13 @@ data Command = Init [String] | Build { buildExtraArgs :: [String] } | Touch | Devel { develSuccessHook :: Maybe String - , develExtraArgs :: [String] + , develExtraArgs :: [String] , develPort :: Int , develTlsPort :: Int , proxyTimeout :: Int , noReverseProxy :: Bool , develHost :: Maybe String + , cert :: Maybe (FilePath, FilePath) } | DevelSignal | Test @@ -90,6 +91,7 @@ main = do , proxyTimeout = proxyTimeout , useReverseProxy = not noReverseProxy , develHost = develHost + , cert = cert } develExtraArgs DevelSignal -> develSignal where @@ -167,6 +169,11 @@ develOptions = Devel <$> optStr ( long "success-hook" <> short 's' <> metavar "C <> help "Disable reverse proxy" ) <*> optStr (long "host" <> metavar "HOST" <> help "Host interface to bind to; IP address, '*' for all interfaces, '*4' for IP4, '*6' for IP6") + <*> optional ( (,) + <$> strOption (long "cert" <> metavar "CERT" + <> help "Path to TLS certificate file, requires that --key is also defined") + <*> strOption (long "key" <> metavar "KEY" + <> help "Path to TLS key file, requires that --cert is also defined") ) extraStackArgs :: Parser [String] extraStackArgs = many (strOption ( long "extra-stack-arg" <> short 'e' <> metavar "ARG" diff --git a/yesod-bin/yesod-bin.cabal b/yesod-bin/yesod-bin.cabal index a8535770..20da5ef8 100644 --- a/yesod-bin/yesod-bin.cabal +++ b/yesod-bin/yesod-bin.cabal @@ -1,5 +1,5 @@ name: yesod-bin -version: 1.6.0.6 +version: 1.6.1 license: MIT license-file: LICENSE author: Michael Snoyman