From 76ffaca4660970a24feb2fe3f1d5aed53367d007 Mon Sep 17 00:00:00 2001 From: Amarandus Date: Tue, 14 Jan 2020 22:18:05 +0100 Subject: [PATCH] web: Add IPv6 and hostname support This commit introduces IPv6 support (and thus closes #1145). It also allows using local hostnames as a parameter for --host. For this, multiple things needed to be changed: - checkWebOpts is dropped, as the supplied parameter is checked later by Network.Socket.getAddrInfo - defbaseurl needs to check if : is used in the host, as this indicates the usage of an IPv6 address. In this case, the host needs to be wrapped in [] for the base URL - To allow opening such a modified base URL, runHostPortFullUrl is used instead of runhostPortUrl, as it allows opening arbitrary URLs instead of a path prefixed with http://127.0.0.1 As checking the host for validity is postponed until the webserver tries to start, an invalid hostname leads to an exception caused by Network.Socket.getAddrInfo. This is still fine, as hledger-web won't start in an undefined state, but will terminate with a nonzero exit code. --- hledger-web/Hledger/Web/Main.hs | 4 ++-- hledger-web/Hledger/Web/Settings.hs | 5 ++++- hledger-web/Hledger/Web/WebOptions.hs | 6 +----- hledger-web/hledger-web.cabal | 6 +++--- hledger-web/package.yaml | 2 +- stack.yaml | 1 + 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/hledger-web/Hledger/Web/Main.hs b/hledger-web/Hledger/Web/Main.hs index dbbf7d66a..028b63413 100644 --- a/hledger-web/Hledger/Web/Main.hs +++ b/hledger-web/Hledger/Web/Main.hs @@ -16,7 +16,7 @@ import qualified Data.Text as T import Network.Socket import Network.Wai (Application) import Network.Wai.Handler.Warp (runSettings, runSettingsSocket, defaultSettings, setHost, setPort) -import Network.Wai.Handler.Launch (runHostPortUrl) +import Network.Wai.Handler.Launch (runHostPortFullUrl) import Prelude hiding (putStrLn) import System.Directory (removeFile) import System.Exit (exitSuccess, exitFailure) @@ -106,5 +106,5 @@ web opts j = do putStrLn "Opening web browser..." hFlush stdout -- exits after 2m of inactivity (hardcoded) - Network.Wai.Handler.Launch.runHostPortUrl h p "" app + Network.Wai.Handler.Launch.runHostPortFullUrl h p u app diff --git a/hledger-web/Hledger/Web/Settings.hs b/hledger-web/Hledger/Web/Settings.hs index ea1268192..f3c128634 100644 --- a/hledger-web/Hledger/Web/Settings.hs +++ b/hledger-web/Hledger/Web/Settings.hs @@ -45,7 +45,10 @@ defport = 5000 defbaseurl :: String -> Int -> String defbaseurl host port = - "http://" ++ host ++ if port /= 80 then ":" ++ show port else "" + if ':' `elem` host then + "http://[" ++ host ++ "]" ++ if port /= 80 then ":" ++ show port else "" + else + "http://" ++ host ++ if port /= 80 then ":" ++ show port else "" -- Static setting below. Changing these requires a recompile diff --git a/hledger-web/Hledger/Web/WebOptions.hs b/hledger-web/Hledger/Web/WebOptions.hs index 174df1c29..9f0b4e477 100644 --- a/hledger-web/Hledger/Web/WebOptions.hs +++ b/hledger-web/Hledger/Web/WebOptions.hs @@ -158,11 +158,7 @@ rawOptsToWebOpts rawopts = stripTrailingSlash = reverse . dropWhile (== '/') . reverse -- yesod don't like it checkWebOpts :: WebOpts -> WebOpts -checkWebOpts wopts = do - let h = host_ wopts - if any (`notElem` (".0123456789" :: String)) h - then usageError $ "--host requires an IP address, not " ++ show h - else wopts +checkWebOpts = id getHledgerWebOpts :: IO WebOpts getHledgerWebOpts = do diff --git a/hledger-web/hledger-web.cabal b/hledger-web/hledger-web.cabal index 10ba33b5c..2867a5d10 100644 --- a/hledger-web/hledger-web.cabal +++ b/hledger-web/hledger-web.cabal @@ -1,10 +1,10 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.31.2. +-- This file has been generated from package.yaml by hpack version 0.32.0. -- -- see: https://github.com/sol/hpack -- --- hash: cbf332de4147396a82198ccf5173db10b775ed99f9830e89aea475bfd4da5a7f +-- hash: 0376acf91d14e3868fa58b399419538104d2187ad41552aa62bd24ca675274b3 name: hledger-web version: 1.16.99 @@ -188,7 +188,7 @@ library , wai , wai-cors , wai-extra - , wai-handler-launch >=1.3 + , wai-handler-launch >=3.0.3 , warp , yaml , yesod >=1.4 && <1.7 diff --git a/hledger-web/package.yaml b/hledger-web/package.yaml index 86384be81..392c047b7 100644 --- a/hledger-web/package.yaml +++ b/hledger-web/package.yaml @@ -131,7 +131,7 @@ library: - utf8-string - wai - wai-extra - - wai-handler-launch >=1.3 + - wai-handler-launch >=3.0.3 - wai-cors - warp - yaml diff --git a/stack.yaml b/stack.yaml index 4fd2b3453..e96c4ecaa 100644 --- a/stack.yaml +++ b/stack.yaml @@ -18,3 +18,4 @@ extra-deps: # for hledger: # for hledger-ui: # for hledger-web: +- wai-handler-launch-3.0.3