私がやろうとしているのは、一部の要求を独自に処理し、他の要求を選択したバックエンドに転送する、ややスマートなリバース プロキシ サーバーを作成することです。やりがいのあるものにするために、私は完全な初心者であるHaskellでそれをやろうと懸命に努力しています.
これまでに私が思いついたコードは次のとおりです。
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.ByteString
import Network.HTTP.ReverseProxy
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp
import Network.Wai.Middleware.RequestLogger
import qualified Network.HTTP.Client as HC
helloApp :: Application
helloApp req respond =
respond $ responseLBS status200 [("Content-Type", "text/plain")] "Hello"
proxyStubApp :: Application
proxyStubApp req respond =
respond $ responseLBS status200 [("Content-Type", "text/plain")] "You've hit the stub"
proxyApp :: IO Application
proxyApp = do
manager <- HC.newManager HC.defaultManagerSettings
return $ waiProxyTo (const $ return $ WPRProxyDest ProxyDest { pdHost = "localhost", pdPort = 9393 }) defaultOnExc manager
app :: Application
app req respond =
serve req respond
where serve = lookupServeFunction req
lookupServeFunction :: Request -> Application
lookupServeFunction req
| isInfixOf "sample_path" (rawPathInfo req) = proxyStubApp
| otherwise = helloApp
main = run 3011 =<< (logStdoutDev <$> return app)
proxyStubApp
正常に動作しますが、実際に交換すると、proxyApp
あちこちに追加するIO
必要があります。特に に追加されるためapp
、次のコンパイル エラー メッセージが表示されます。
Couldn't match expected type ‘Request -> t5 -> t4’
with actual type ‘IO Application’
The equation(s) for ‘app’ have two arguments,
but its type ‘IO Application’ has none
なぜそれが起こっているのかを理解しているような気がしますが、それに対処する方法についてのアイデアがありません:(または、私は何か完全に間違っていますか?
ありがとうございました!
PSこれを自分でコンパイルしたい場合の依存関係は次のとおりです。wai warp http-types text bytestring wai-extra time http-reverse-proxy http-client