module Network.XMPP.Helpers
( connectViaHttpProxy
, connectViaTcp
, openStreamFile
) where
import System.IO (Handle, hPutStrLn, hPutStr, hGetLine, openFile, IOMode(..))
import Network (connectTo, PortID(..) )
import Network.Socket
import Network.BSD
import Control.Concurrent (threadDelay, forkIO)
import Control.Monad.Trans (liftIO)
import Network.XMPP.Utils
connectViaTcp :: String
-> Int
-> IO Handle
connectViaTcp server port = do
host <- getHostByName server
sock <- socket AF_INET Stream 0
setSocketOption sock KeepAlive 1
connect sock (SockAddrInet (fromIntegral port) (head $ hostAddresses host))
socketToHandle sock ReadWriteMode
connectViaHttpProxy proxy_server proxy_port server port =
do h <- connectTo proxy_server (PortNumber (fromIntegral proxy_port))
hPutStrLn h $ unlines [ concat ["CONNECT ",server,":",show port," HTTP/1.0"]
, "Connection: Keep-Alive" ]
dropHeaders h
liftIO $ forkIO $ pinger h
return h
where dropHeaders h = do l <- hGetLine h
debugIO $ "Got: " ++ l
if words l /= [] then dropHeaders h
else return ()
pinger h = hPutStr h " " >> threadDelay (30 * 10^6) >> pinger h
openStreamFile fname = openFile fname ReadMode