{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent (forkIO, threadDelay)
import Data.Conduit.Network (serverSettings, runTCPServer)
import qualified Network.HTTP.Conduit as HC
import Network.HTTP.ReverseProxy (ProxyDest (..), defaultOnExc,
rawProxyTo, waiProxyTo, waiToRaw)
import Network.HTTP.Types (status200)
import Network.Wai (responseLBS)
import Network.Wai.Handler.Warp (run)
import Test.Hspec (describe, hspec, it, shouldBe)
main :: IO ()
main = hspec $ do
describe "http-reverse-proxy" $ do
it "works" $ do
let content = "mainApp"
manager <- HC.newManager HC.def
forkIO $ run 5000 $ const $ return $ responseLBS status200 [] content
forkIO $ run 5001 $ waiProxyTo (const $ return $ Right $ ProxyDest "localhost" 5000) defaultOnExc manager
forkIO $ runTCPServer (serverSettings 5002 "*") (rawProxyTo (const $ return $ Right $ ProxyDest "localhost" 5001))
threadDelay 100000
lbs <- HC.simpleHttp "http://localhost:5002"
lbs `shouldBe` content
it "waiToRaw" $ do
let content = "waiToRaw"
manager <- HC.newManager HC.def
let waiApp = const $ return $ responseLBS status200 [] content
rawApp = waiToRaw waiApp
forkIO $ runTCPServer (serverSettings 6000 "*") (rawProxyTo (const $ return $ Left rawApp))
threadDelay 100000
lbs <- HC.simpleHttp "http://localhost:6000"
lbs `shouldBe` content