Can one reverse-proxy a small external site as a yesod subsite

108 Views Asked by At

I have a yesod site serving content that includes rest WaiSubsites. all working. I have a need to serve a small REACT based site and I'd like to use the same basic infrastructure to add a simple reverse proxying subset would embed that REACT server. I'm aware that I could put nginx etc. in front but I don't want to do that.

Is there an easy solution? thanks, Stephen.

update. So I've built a basic solution, but I'd like to be able to map random /x/y to /y and so I need to rewrite the response content URLs of form /y to /x/y. having trouble workin out the process response handler. anyone?

     makeExternalServerProxy :: Manager -> ByteString -> Int -> Application
     makeExternalServerProxy manager host port =
        simpleCors $ S.serveWithContext (S.Proxy :: S.Proxy S.Raw) S.EmptyContext forwardH 
       where -- | proxy based forwarding of non API requests to host:port
          forwardH :: S.Tagged S.Handler Application
          forwardH = S.Tagged $ waiProxyToSettings        
                                forwardRequest proxySettings manager
    
          forwardRequest :: Network.Wai.Request -> IO WaiProxyResponse
          forwardRequest req = 
            pure $ WPRModifiedRequest
                     (rewriteRequestPure (\(pq,q) _ -> ( case pq of
                                                           [] -> []
                                                           (_:xs) -> xs
                                                       , q)) req)
                     (ProxyDest host port)
           -- | Sends a simple 402 error message with the contents of the exception.
           handleException :: SomeException -> Application
           handleException exc _ sr = sr $ responseLBS
                               HT.status402
                               [("content-type", "text/plain")]
                               ("We're sorry: Internal Error:\n\n" <>
                                 TLE.encodeUtf8 (pack $ show exc))

          proxySettings = defaultWaiProxySettings
                    { wpsOnExc = handleException
                    , wpsProcessBody = processResponse
                    } 
          processResponse ::  Network.Wai.Request -> Response () -> Maybe (ConduitT ByteString (Flush Builder) IO ())
          processResponse = undefined
0

There are 0 best solutions below