diff --git a/yesod-default/Yesod/Default/Main.hs b/yesod-default/Yesod/Default/Main.hs index 5de22ba1..c664de11 100644 --- a/yesod-default/Yesod/Default/Main.hs +++ b/yesod-default/Yesod/Default/Main.hs @@ -15,6 +15,9 @@ import Network.Wai.Middleware.Gzip (gzip, GzipFiles (GzipCacheFolder), gzipFiles import Network.Wai.Middleware.Autohead (autohead) import Network.Wai.Middleware.Jsonp (jsonp) import Control.Monad (when) +import System.Environment (getEnvironment) +import Data.Maybe (fromMaybe) +import Safe (readMay) #ifndef WINDOWS import qualified System.Posix.Signals as Signal @@ -81,7 +84,9 @@ defaultDevelApp -> IO (Int, Application) defaultDevelApp load getApp = do conf <- load - let p = appPort conf - putStrLn $ "Devel application launched: http://localhost:" ++ show p + env <- getEnvironment + let p = fromMaybe (appPort conf) $ lookup "PORT" env >>= readMay + pdisplay = fromMaybe p $ lookup "DISPLAY_PORT" env >>= readMay + putStrLn $ "Devel application launched: http://localhost:" ++ show pdisplay app <- getApp conf return (p, app) diff --git a/yesod-default/yesod-default.cabal b/yesod-default/yesod-default.cabal index 9dd2cbe1..7c464b5e 100644 --- a/yesod-default/yesod-default.cabal +++ b/yesod-default/yesod-default.cabal @@ -1,5 +1,5 @@ name: yesod-default -version: 1.1.0.2 +version: 1.1.1 license: MIT license-file: LICENSE author: Patrick Brisbin @@ -34,6 +34,7 @@ library , unordered-containers , hamlet >= 1.1 && < 1.2 , data-default + , safe if !os(windows) build-depends: unix diff --git a/yesod/Devel.hs b/yesod/Devel.hs index b022f546..7c7352e6 100644 --- a/yesod/Devel.hs +++ b/yesod/Devel.hs @@ -41,6 +41,7 @@ import Data.Maybe (fromMaybe) import qualified Data.Set as Set import System.Directory +import System.Environment (getEnvironment) import System.Exit (ExitCode (..), exitFailure, exitSuccess) @@ -62,7 +63,8 @@ import System.Process (ProcessHandle, readProcess, runInteractiveProcess, system, - terminateProcess) + terminateProcess, + env) import System.Timeout (timeout) import Build (getDeps, isNewerThan, @@ -72,6 +74,12 @@ import GhcBuild (buildPackage, import qualified Config as GHC import SrcLoc (Located) +import Network.HTTP.ReverseProxy (waiProxyTo, ProxyDest (ProxyDest)) +import Network (withSocketsDo) +import Network.Wai (responseLBS) +import Network.HTTP.Types (status200) +import Network.Wai.Handler.Warp (run) +import Network.HTTP.Conduit (newManager, def) lockFile :: DevelOpts -> FilePath lockFile _opts = "yesod-devel/devel-terminate" @@ -108,8 +116,26 @@ cabalCommand opts | isCabalDev opts = "cabal-dev" defaultDevelOpts :: DevelOpts defaultDevelOpts = DevelOpts False False False (-1) Nothing Nothing Nothing +-- | Run a reverse proxy from port 3000 to 3001. If there is no response on +-- 3001, give an appropriate message to the user. +reverseProxy :: IO () +reverseProxy = withSocketsDo $ do + manager <- newManager def + run 3000 $ waiProxyTo + (const $ return $ Right $ ProxyDest "localhost" 3001) + onExc + manager + where + onExc _ _ = return $ responseLBS + status200 + [ ("content-type", "text/html") + , ("Refresh", "1") + ] + "