[web-devel] Conduit/Wai proxy, HOWTO?

Jason Dusek jason.dusek at gmail.com
Wed Aug 29 15:24:37 CEST 2012


Hello All,

I seem to have something which compiles and compiling is half
the battle. Perhaps there is a better, nicer way to do it; or
maybe the code below has some mines hidden in it. Would be great
to get some insight in these matters.

Now it's time for me to go shopping.

--
Jason Dusek
pgp // solidsnack // C1EBC57DC55144F35460C8DF1FD4C6C1FED18A2B




import           Data.ByteString (ByteString)

import qualified Blaze.ByteString.Builder as Blaze
import           Control.Monad.Trans
import           Control.Monad.Trans.Resource
import           Data.Conduit (($=))
import qualified Data.Conduit as Conduit
import qualified Data.Conduit.List as Conduit
import           Data.Default
import qualified Network.Wai as Wai
import qualified Network.HTTP.Conduit as Conduit

wai :: String -> Wai.Application
wai s _ = do
  (_, mangari) <- allocate (Conduit.newManager def) Conduit.closeManager
  go mangari
 where
  go :: Conduit.Manager -> Conduit.ResourceT IO Wai.Response
  go manager                    = do
    request                    <- liftIO $ Conduit.parseUrl s
    Conduit.Response s _ h src <- Conduit.http request manager
    src                        <- reSource src
    return $ Wai.ResponseSource s h (src $= b2b)

reSource :: MonadIO m => Conduit.ResumableSource m o -> m (Conduit.Source m o)
reSource resumable     = do
  (src, finalizer)    <- Conduit.unwrapResumable resumable
  return $ Conduit.addCleanup (const finalizer) src

b2b :: (Monad m) => Conduit.Conduit ByteString m (Conduit.Flush Blaze.Builder)
b2b  = Conduit.map (Conduit.Chunk . Blaze.fromByteString)



More information about the web-devel mailing list