Что я пытаюсь сделать, так это создать несколько умный обратный прокси-сервер, который должен обрабатывать некоторые запросы самостоятельно и перенаправлять другие на выбранный сервер. Чтобы сделать это сложным, я изо всех сил стараюсь сделать это на 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
Кажется, я понимаю, почему это происходит, но у меня нет идей, как с этим справиться :( Или я делаю что-то совершенно не так?
Благодарю вас!
P.S. Вот зависимости, если вы хотите скомпилировать это самостоятельно: wai warp http-types text bytestring wai-extra time http-reverse-proxy http-client