#57 Allow to specify websocket ping frequency
Former-commit-id: 31c30bf3ff09e54b8fb8e7610aabae0b1247502f Former-commit-id: 3149f827351c421bc99edad7381643bbac567d56 [formerly 084fb35038a11bf8f4016f1eca51295199534d68] [formerly d6284387041bc84ebc3859d2a357cb7e9b678e9e [formerly 8413b4a3244698b20e3356cb5f9d76b24122d93c [formerly 8413b4a3244698b20e3356cb5f9d76b24122d93c [formerly 8413b4a3244698b20e3356cb5f9d76b24122d93c [formerly fddae990cae36aba019f83124e522d2545b93ecf]]]]] Former-commit-id: 186beb54d83f454ae545c45194e1ba3e9eab1495 [formerly a7d06a8c6e0064c48eee331b9fa6f87496ba0f37] Former-commit-id: 5f88e7d16eb372828bbfeaba017699f62db92c6c Former-commit-id: a7fb9dc52d52d177d26ebdd78ab69dadddd17939 Former-commit-id: b1a292297fb943c3f555ff639802fcdf81005240 Former-commit-id: ea8f23d6c60e0b316358255156bbd644330a90e9 [formerly 961596cfff926e301cf39cf0b2114d58a62b7e9a] Former-commit-id: 1b85c73b4c55a63dc96af4c7af6e1a5edc3d9616
This commit is contained in:
parent
e8f3fc0259
commit
5d62604582
4 changed files with 16 additions and 3 deletions
13
app/Main.hs
13
app/Main.hs
|
@ -33,8 +33,8 @@ data WsTunnel = WsTunnel
|
||||||
, pathPrefix :: String
|
, pathPrefix :: String
|
||||||
, hostHeader :: String
|
, hostHeader :: String
|
||||||
, tlsSNI :: String
|
, tlsSNI :: String
|
||||||
, wsTunnelCredentials
|
, websocketPingFrequencySec :: Int
|
||||||
:: String
|
, wsTunnelCredentials :: String
|
||||||
} deriving (Show, Data, Typeable)
|
} deriving (Show, Data, Typeable)
|
||||||
|
|
||||||
data WsServerInfo = WsServerInfo
|
data WsServerInfo = WsServerInfo
|
||||||
|
@ -77,6 +77,8 @@ cmdLine = WsTunnel
|
||||||
&= help "If set, use custom string in the SNI during TLS handshake" &= typ "String" &= groupname "Client options"
|
&= help "If set, use custom string in the SNI during TLS handshake" &= typ "String" &= groupname "Client options"
|
||||||
, soMark = def &= explicit &= name "soMark"
|
, soMark = def &= explicit &= name "soMark"
|
||||||
&= help "(linux only) Mark network packet with SO_MARK sockoption with the specified value. You need to use {root, sudo, capabilities} to run wstunnel when using this option" &= typ "int"
|
&= help "(linux only) Mark network packet with SO_MARK sockoption with the specified value. You need to use {root, sudo, capabilities} to run wstunnel when using this option" &= typ "int"
|
||||||
|
, websocketPingFrequencySec = def &= explicit &= name "websocketPingFrequencySec"
|
||||||
|
&= help "do a hearthbeat ping every x seconds to maintain websocket connection" &= typ "int"
|
||||||
, wsTunnelServer = def &= argPos 0 &= typ "ws[s]://wstunnelServer[:port]"
|
, wsTunnelServer = def &= argPos 0 &= typ "ws[s]://wstunnelServer[:port]"
|
||||||
|
|
||||||
, serverMode = def &= explicit &= name "server"
|
, serverMode = def &= explicit &= name "server"
|
||||||
|
@ -180,6 +182,9 @@ main = do
|
||||||
, Main.udpTimeout = if Main.udpTimeout cfg' == 0 then 30 * 10^(6 :: Int)
|
, Main.udpTimeout = if Main.udpTimeout cfg' == 0 then 30 * 10^(6 :: Int)
|
||||||
else if Main.udpTimeout cfg' == -1 then -1
|
else if Main.udpTimeout cfg' == -1 then -1
|
||||||
else Main.udpTimeout cfg' * 10^(6:: Int)
|
else Main.udpTimeout cfg' * 10^(6:: Int)
|
||||||
|
, Main.websocketPingFrequencySec = if Main.websocketPingFrequencySec cfg' == 0
|
||||||
|
then 30
|
||||||
|
else Main.websocketPingFrequencySec cfg'
|
||||||
}
|
}
|
||||||
|
|
||||||
let serverInfo = parseServerInfo (WsServerInfo False "" 0) (wsTunnelServer cfg)
|
let serverInfo = parseServerInfo (WsServerInfo False "" 0) (wsTunnelServer cfg)
|
||||||
|
@ -236,6 +241,7 @@ runApp cfg serverInfo
|
||||||
, udpTimeout = Main.udpTimeout cfg
|
, udpTimeout = Main.udpTimeout cfg
|
||||||
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
||||||
, hostHeader = BC.pack $ Main.hostHeader cfg
|
, hostHeader = BC.pack $ Main.hostHeader cfg
|
||||||
|
, websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
toTcpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =
|
toTcpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =
|
||||||
|
@ -255,6 +261,7 @@ runApp cfg serverInfo
|
||||||
, udpTimeout = Main.udpTimeout cfg
|
, udpTimeout = Main.udpTimeout cfg
|
||||||
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
||||||
, hostHeader = BC.pack $ Main.hostHeader cfg
|
, hostHeader = BC.pack $ Main.hostHeader cfg
|
||||||
|
, websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
toUdpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =
|
toUdpLocalToRemoteTunnelSetting cfg serverInfo (TunnelInfo lHost lPort rHost rPort) =
|
||||||
|
@ -274,6 +281,7 @@ runApp cfg serverInfo
|
||||||
, udpTimeout = Main.udpTimeout cfg
|
, udpTimeout = Main.udpTimeout cfg
|
||||||
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
||||||
, hostHeader = BC.pack $ Main.hostHeader cfg
|
, hostHeader = BC.pack $ Main.hostHeader cfg
|
||||||
|
, websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
toDynamicTunnelSetting cfg serverInfo (TunnelInfo lHost lPort _ _) =
|
toDynamicTunnelSetting cfg serverInfo (TunnelInfo lHost lPort _ _) =
|
||||||
|
@ -293,4 +301,5 @@ runApp cfg serverInfo
|
||||||
, udpTimeout = Main.udpTimeout cfg
|
, udpTimeout = Main.udpTimeout cfg
|
||||||
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
, tlsSNI = BC.pack $ Main.tlsSNI cfg
|
||||||
, hostHeader = BC.pack $ Main.hostHeader cfg
|
, hostHeader = BC.pack $ Main.hostHeader cfg
|
||||||
|
, websocketPingFrequencySec = Main.websocketPingFrequencySec cfg
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ tunnelingClientP cfg@TunnelSettings{..} app conn = onError $ do
|
||||||
connectionToStream Connection{..} = WS.makeStream read (write . toStrict . fromJust)
|
connectionToStream Connection{..} = WS.makeStream read (write . toStrict . fromJust)
|
||||||
onError = flip catch (\(e :: SomeException) -> return . throwError . WebsocketError $ show e)
|
onError = flip catch (\(e :: SomeException) -> return . throwError . WebsocketError $ show e)
|
||||||
run cnx = do
|
run cnx = do
|
||||||
WS.forkPingThread cnx 30
|
WS.forkPingThread cnx websocketPingFrequencySec
|
||||||
app (toConnection cnx)
|
app (toConnection cnx)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ data TunnelSettings = TunnelSettings
|
||||||
, tlsSNI :: ByteString
|
, tlsSNI :: ByteString
|
||||||
, hostHeader :: ByteString
|
, hostHeader :: ByteString
|
||||||
, udpTimeout :: Int
|
, udpTimeout :: Int
|
||||||
|
, websocketPingFrequencySec :: Int
|
||||||
}
|
}
|
||||||
|
|
||||||
instance Show TunnelSettings where
|
instance Show TunnelSettings where
|
||||||
|
|
|
@ -50,6 +50,7 @@ testTCPLocalToRemote useTLS = do
|
||||||
, upgradeCredentials = ""
|
, upgradeCredentials = ""
|
||||||
, hostHeader = "toto.com"
|
, hostHeader = "toto.com"
|
||||||
, tlsSNI = "toto.com"
|
, tlsSNI = "toto.com"
|
||||||
|
, websocketPingFrequencySec = 30
|
||||||
}
|
}
|
||||||
let client = runClient tunnelSetting
|
let client = runClient tunnelSetting
|
||||||
|
|
||||||
|
@ -110,6 +111,7 @@ testUDPLocalToRemote useTLS = do
|
||||||
, upgradeCredentials = ""
|
, upgradeCredentials = ""
|
||||||
, hostHeader = "toto.com"
|
, hostHeader = "toto.com"
|
||||||
, tlsSNI = "toto.com"
|
, tlsSNI = "toto.com"
|
||||||
|
, websocketPingFrequencySec = 30
|
||||||
}
|
}
|
||||||
let client = runClient tunnelSetting
|
let client = runClient tunnelSetting
|
||||||
|
|
||||||
|
@ -169,6 +171,7 @@ testSocks5Tunneling useTLS = do
|
||||||
, upgradeCredentials = ""
|
, upgradeCredentials = ""
|
||||||
, hostHeader = "toto.com"
|
, hostHeader = "toto.com"
|
||||||
, tlsSNI = "toto.com"
|
, tlsSNI = "toto.com"
|
||||||
|
, websocketPingFrequencySec = 30
|
||||||
}
|
}
|
||||||
let client = runClient tunnelSetting
|
let client = runClient tunnelSetting
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue