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.
This commit is contained in:
parent
392d0d0a31
commit
76ffaca466
@ -16,7 +16,7 @@ import qualified Data.Text as T
|
|||||||
import Network.Socket
|
import Network.Socket
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
import Network.Wai.Handler.Warp (runSettings, runSettingsSocket, defaultSettings, setHost, setPort)
|
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 Prelude hiding (putStrLn)
|
||||||
import System.Directory (removeFile)
|
import System.Directory (removeFile)
|
||||||
import System.Exit (exitSuccess, exitFailure)
|
import System.Exit (exitSuccess, exitFailure)
|
||||||
@ -106,5 +106,5 @@ web opts j = do
|
|||||||
putStrLn "Opening web browser..."
|
putStrLn "Opening web browser..."
|
||||||
hFlush stdout
|
hFlush stdout
|
||||||
-- exits after 2m of inactivity (hardcoded)
|
-- exits after 2m of inactivity (hardcoded)
|
||||||
Network.Wai.Handler.Launch.runHostPortUrl h p "" app
|
Network.Wai.Handler.Launch.runHostPortFullUrl h p u app
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,9 @@ defport = 5000
|
|||||||
|
|
||||||
defbaseurl :: String -> Int -> String
|
defbaseurl :: String -> Int -> String
|
||||||
defbaseurl host port =
|
defbaseurl host port =
|
||||||
|
if ':' `elem` host then
|
||||||
|
"http://[" ++ host ++ "]" ++ if port /= 80 then ":" ++ show port else ""
|
||||||
|
else
|
||||||
"http://" ++ host ++ if port /= 80 then ":" ++ show port else ""
|
"http://" ++ host ++ if port /= 80 then ":" ++ show port else ""
|
||||||
|
|
||||||
-- Static setting below. Changing these requires a recompile
|
-- Static setting below. Changing these requires a recompile
|
||||||
|
|||||||
@ -158,11 +158,7 @@ rawOptsToWebOpts rawopts =
|
|||||||
stripTrailingSlash = reverse . dropWhile (== '/') . reverse -- yesod don't like it
|
stripTrailingSlash = reverse . dropWhile (== '/') . reverse -- yesod don't like it
|
||||||
|
|
||||||
checkWebOpts :: WebOpts -> WebOpts
|
checkWebOpts :: WebOpts -> WebOpts
|
||||||
checkWebOpts wopts = do
|
checkWebOpts = id
|
||||||
let h = host_ wopts
|
|
||||||
if any (`notElem` (".0123456789" :: String)) h
|
|
||||||
then usageError $ "--host requires an IP address, not " ++ show h
|
|
||||||
else wopts
|
|
||||||
|
|
||||||
getHledgerWebOpts :: IO WebOpts
|
getHledgerWebOpts :: IO WebOpts
|
||||||
getHledgerWebOpts = do
|
getHledgerWebOpts = do
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
cabal-version: 1.12
|
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
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: cbf332de4147396a82198ccf5173db10b775ed99f9830e89aea475bfd4da5a7f
|
-- hash: 0376acf91d14e3868fa58b399419538104d2187ad41552aa62bd24ca675274b3
|
||||||
|
|
||||||
name: hledger-web
|
name: hledger-web
|
||||||
version: 1.16.99
|
version: 1.16.99
|
||||||
@ -188,7 +188,7 @@ library
|
|||||||
, wai
|
, wai
|
||||||
, wai-cors
|
, wai-cors
|
||||||
, wai-extra
|
, wai-extra
|
||||||
, wai-handler-launch >=1.3
|
, wai-handler-launch >=3.0.3
|
||||||
, warp
|
, warp
|
||||||
, yaml
|
, yaml
|
||||||
, yesod >=1.4 && <1.7
|
, yesod >=1.4 && <1.7
|
||||||
|
|||||||
@ -131,7 +131,7 @@ library:
|
|||||||
- utf8-string
|
- utf8-string
|
||||||
- wai
|
- wai
|
||||||
- wai-extra
|
- wai-extra
|
||||||
- wai-handler-launch >=1.3
|
- wai-handler-launch >=3.0.3
|
||||||
- wai-cors
|
- wai-cors
|
||||||
- warp
|
- warp
|
||||||
- yaml
|
- yaml
|
||||||
|
|||||||
@ -18,3 +18,4 @@ extra-deps:
|
|||||||
# for hledger:
|
# for hledger:
|
||||||
# for hledger-ui:
|
# for hledger-ui:
|
||||||
# for hledger-web:
|
# for hledger-web:
|
||||||
|
- wai-handler-launch-3.0.3
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user