yesod-bin 1.4.5.1 → 1.4.6
raw patch · 6 files changed
+93/−17 lines, 6 filesdep +asyncdep +warp-tls
Dependencies added: async, warp-tls
Files
- ChangeLog.md +4/−0
- Devel.hs +37/−9
- certificate.pem +15/−0
- key.pem +15/−0
- main.hs +18/−7
- yesod-bin.cabal +4/−1
ChangeLog.md view
@@ -1,3 +1,7 @@+## 1.4.6++* Add TLS support to `yesod devel` [#964](https://github.com/yesodweb/yesod/pull/964)+ ## 1.4.5 * add a switch to yesod to skip deploying a .keter with copy-to [#952](https://github.com/yesodweb/yesod/issues/952)
Devel.hs view
@@ -22,6 +22,7 @@ import Control.Concurrent (forkIO, threadDelay) import Control.Concurrent.MVar (MVar, newEmptyMVar, takeMVar, tryPutMVar)+import Control.Concurrent.Async (race_) import qualified Control.Exception as Ex import Control.Monad (forever, unless, void, when, forM)@@ -78,7 +79,8 @@ import Network.Socket (sClose) import Network.Wai (responseLBS, requestHeaders) import Network.Wai.Parse (parseHttpAccept)-import Network.Wai.Handler.Warp (run)+import Network.Wai.Handler.Warp (run, defaultSettings, setPort)+import Network.Wai.Handler.WarpTLS (runTLS, tlsSettingsMemory) import SrcLoc (Located) import Data.FileEmbed (embedFile) @@ -108,6 +110,7 @@ , failHook :: Maybe String , buildDir :: Maybe String , develPort :: Int+ , develTlsPort :: Int , proxyTimeout :: Int , useReverseProxy :: Bool , terminateWith :: DevelTermOpt@@ -117,7 +120,20 @@ getBuildDir opts = fromMaybe "dist" (buildDir opts) defaultDevelOpts :: DevelOpts-defaultDevelOpts = DevelOpts False False False (-1) Nothing Nothing Nothing 3000 10 True TerminateOnEnter+defaultDevelOpts = DevelOpts+ { isCabalDev = False+ , forceCabal = False+ , verbose = False+ , eventTimeout = -1+ , successHook = Nothing+ , failHook = Nothing+ , buildDir = Nothing+ , develPort = 3000+ , develTlsPort = 3443+ , proxyTimeout = 10+ , useReverseProxy = True+ , terminateWith = TerminateOnEnter+ } cabalProgram :: DevelOpts -> FilePath cabalProgram opts | isCabalDev opts = "cabal-dev"@@ -146,8 +162,7 @@ ] refreshHtml - let runProxy =- run (develPort opts) $ waiProxyToSettings+ let proxyApp = waiProxyToSettings (const $ do appPort <- liftIO $ I.readIORef iappPort return $@@ -161,13 +176,26 @@ else Just (1000000 * proxyTimeout opts) } manager- loop runProxy `Ex.onException` exitFailure+ runProxyTls port app = do+ let cert = $(embedFile "certificate.pem")+ key = $(embedFile "key.pem")+ tlsSettings = tlsSettingsMemory cert key+ runTLS tlsSettings (setPort port defaultSettings) app+ httpProxy = run (develPort opts) proxyApp+ httpsProxy = runProxyTls (develTlsPort opts) proxyApp+ putStrLn "Application can be accessed at:\n"+ putStrLn $ "http://127.0.0.1:" ++ show (develPort opts)+ putStrLn $ "https://127.0.0.1:" ++ show (develTlsPort opts)+ putStrLn $ "If you wish to test https capabilities, you should set the following variable:"+ putStrLn $ " export APPROOT=https://127.0.0.1:" ++ show (develTlsPort opts)+ putStrLn ""+ loop (race_ httpProxy httpsProxy) `Ex.onException` exitFailure where- loop proxy = forever $ do- void proxy- putStrLn "Reverse proxy stopped, but it shouldn't"+ loop proxies = forever $ do+ void proxies+ putStrLn $ "Reverse proxy stopped, but it shouldn't" threadDelay 1000000- putStrLn "Restarting reverse proxy"+ putStrLn $ "Restarting reverse proxies" checkPort :: Int -> IO Bool checkPort p = do
+ certificate.pem view
@@ -0,0 +1,15 @@+-----BEGIN CERTIFICATE-----+MIICWDCCAcGgAwIBAgIJAJG1ZMlcMDW6MA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV+BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX+aWRnaXRzIFB0eSBMdGQwHhcNMTExMDIyMTk0MjU3WhcNMTExMTIxMTk0MjU3WjBF+MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50+ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB+gQCfYZx7kV6ybogMyAf9MINm7Rwin5LKh+TpD1ZkbLgmqFVotQCdthgTK66SPXkx+EXGI27biNzacJhX7Ml7/4o8sp2GslYKUO46DYvgi/nnNX/bzA5cDJSSGK11eQEVs++p0GEZ/6Juhpx/oQwMDMgo0UHkiH8QtKI8ojXnFF2MsLNwIDAQABo1AwTjAdBgNV+HQ4EFgQUaA6FbOj/0VJMb4egNyIDZ/ZNV/YwHwYDVR0jBBgwFoAUaA6FbOj/0VJM+b4egNyIDZ/ZNV/YwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCTQyOk+D86Z+yzedXjTLI6FT8QugmQne1YQ8P0w37P76z2reagSvNee2e9B1oTHoPeKZMs0+k99oS9yJ/NOQ1Ms90P+q0yBVGxAs/gF65qKgE27YGXzNtNobj/D4OoxcFG+BsORw+VvYSBV4FiVy9RwJsr7AMqkUBcOEPCuJHgTx58w==+-----END CERTIFICATE-----
+ key.pem view
@@ -0,0 +1,15 @@+-----BEGIN RSA PRIVATE KEY-----+MIICXAIBAAKBgQCfYZx7kV6ybogMyAf9MINm7Rwin5LKh+TpD1ZkbLgmqFVotQCd+thgTK66SPXkxEXGI27biNzacJhX7Ml7/4o8sp2GslYKUO46DYvgi/nnNX/bzA5cD+JSSGK11eQEVs+p0GEZ/6Juhpx/oQwMDMgo0UHkiH8QtKI8ojXnFF2MsLNwIDAQAB+AoGAR8pgAgjo7tZ60ccIUjOX/LSxB6d5J2Eu6wvNjk6qZD9OuWtOa7up/HigmZ63+CDMjQNI2/o6AOrWtEQkPYZNbibuifzg5V517nHGSqkqjoIgesAiwEsoKpeOgGTtM+MM08oHbJ9uOnDnEEnDBiE0iE3jCTDfmwjqDMpUhu9dZ1EAECQQDKVpzSSV3pzMOp+ixNxMpYxzcE+4K9jgM+MlxPBJSQhVrg/cRQWb26cKBi8LdSxF23hQTsFr+8qLwid+Ah2AgUOBAkEAyaaCjrNRCiHRpd6YzWZ6GKkxbUvxSuOKX3N7hDaE2OFzQTv2Li8B+5mrCsXnSZtOG+MBFdHU66UYie1OzDSDKtwJAKMsvkOID0ihbZmpIwDC/wUjHZkLs+eXY14hVvgShY0XPnb7r/nspWlZsr6Xyf/hhIKfr5yFrBMFMNPIJ5qjflgQJAWsyV+YTgxN4S+6BdxapvIQq58ySA3CGeo+Q4BAimibB4oTal4UpdsHZrZDB00toRs9Dlv+jN70pfGkuS+ZIkIvxQJBAKSf5qpXWp4oZcThkieAiMeAhG96xqRPXhPUxq6QF+YG+T4PF1sjlpZwqy7C+2oF3BqLP09mCW7YkH9Jgnl1zDF8=+-----END RSA PRIVATE KEY-----
main.hs view
@@ -54,6 +54,7 @@ , develIgnore :: [String] , develExtraArgs :: [String] , _develPort :: Int+ , _develTlsPort :: Int , _proxyTimeout :: Int , _noReverseProxy :: Bool , _interruptOnly :: Bool@@ -107,13 +108,21 @@ Version -> putStrLn ("yesod-bin version: " ++ showVersion Paths_yesod_bin.version) AddHandler{..} -> addHandler addHandlerRoute addHandlerPattern addHandlerMethods Test -> cabalTest cabal- Devel{..} -> devel (DevelOpts- (optCabalPgm o == CabalDev) _develDisableApi (optVerbose o)- _develRescan _develSuccessHook _develFailHook- _develBuildDir _develPort _proxyTimeout- (not _noReverseProxy)- (if _interruptOnly then TerminateOnlyInterrupt else TerminateOnEnter )- ) develExtraArgs+ Devel{..} -> let develOpts = DevelOpts+ { isCabalDev = optCabalPgm o == CabalDev+ , forceCabal = _develDisableApi+ , verbose = optVerbose o+ , eventTimeout = _develRescan+ , successHook = _develSuccessHook+ , failHook = _develFailHook+ , buildDir = _develBuildDir+ , develPort = _develPort+ , develTlsPort = _develTlsPort+ , proxyTimeout = _proxyTimeout+ , useReverseProxy = not _noReverseProxy+ , terminateWith = if _interruptOnly then TerminateOnlyInterrupt else TerminateOnEnter+ }+ in devel develOpts develExtraArgs where cabalTest cabal = do touch' _ <- cabal ["configure", "--enable-tests", "-flibrary-only"]@@ -178,6 +187,8 @@ <*> extraCabalArgs <*> option auto ( long "port" <> short 'p' <> value 3000 <> metavar "N" <> help "Devel server listening port" )+ <*> option auto ( long "tls-port" <> short 'q' <> value 3443 <> metavar "N"+ <> help "Devel server listening port (tls)" ) <*> option auto ( long "proxy-timeout" <> short 'x' <> value 0 <> metavar "N" <> help "Devel server timeout before returning 'not ready' message (in seconds, 0 for none)" ) <*> switch ( long "disable-reverse-proxy" <> short 'n'
yesod-bin.cabal view
@@ -1,5 +1,5 @@ name: yesod-bin-version: 1.4.5.1+version: 1.4.6 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -17,6 +17,7 @@ input/*.cg hsfiles/*.hsfiles ChangeLog.md+ *.pem executable yesod-ghc-wrapper main-is: ghcwrapper.hs@@ -87,6 +88,8 @@ , wai-extra , data-default-class , streaming-commons+ , warp-tls+ , async ghc-options: -Wall -threaded -rtsopts main-is: main.hs