0

私がやろうとしているのは、一部の要求を独自に処理し、他の要求を選択したバックエンドに転送する、ややスマートなリバース プロキシ サーバーを作成することです。やりがいのあるものにするために、私は完全な初心者である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

4

1 に答える 1