{-# OPTIONS_GHC -Wno-type-defaults #-} module Literate.Web.Live.HTTP where -- import Network.Wai.Middleware.Static qualified as Static import Control.Concurrent.STM (STM) import Control.Concurrent.STM qualified as STM import Data.ByteString.Lazy qualified as BSL import Data.Function (($)) import Data.Map.Strict qualified as Map import Data.Maybe (Maybe (..), fromMaybe) import Data.Semigroup (Semigroup (..)) import Data.Text qualified as Text import Literate.Web qualified as Web import Network.HTTP.Media qualified as Media import Network.HTTP.Types qualified as H import Network.Wai qualified as Wai import System.IO (IO) import System.IO qualified as Sys import Literate.Web.Live.Asset import Literate.Web.Live.Common import Literate.Web.Types.MIME (MediaType) httpApp :: STM model -> (model -> IO (Map.Map Web.OutputPath (MediaType, IO BSL.ByteString))) -> -- The shim to include in every HTML response Maybe BSL.ByteString -> Wai.Application httpApp modelSTM siteMap mShim req res = do let shim = fromMaybe "" mShim let path = Text.intercalate "/" $ Wai.pathInfo req model <- STM.atomically modelSTM site <- siteMap model Sys.hPrint Sys.stderr (["httpApp", "GET"] :: [Text.Text], ("path", path, decodeOutputPath path)) case Map.lookup (decodeOutputPath path) site of Nothing -> do let s = liveErrorHtmlResponse decodeRouteNothingMsg <> shim res $ Wai.responseLBS H.status404 [(H.hContentType, "text/html")] s Just (contentType, contentIO) -> do content <- contentIO res $ Wai.responseLBS H.status200 [(H.hContentType, Media.renderHeader contentType)] content {- case mr of Left err -> do logErrorNS "App" $ badRouteEncodingMsg err let s = liveErrorHtmlResponse (badRouteEncodingMsg err) <> shim liftIO $ res $ Wai.responseLBS H.status500 [(H.hContentType, "text/html")] s Right Nothing -> do let s = liveErrorHtmlResponse decodeRouteNothingMsg <> shim liftIO $ res $ Wai.responseLBS H.status404 [(H.hContentType, "text/html")] s Right (Just r) -> do renderCatchingErrors val r >>= \case AssetStatic staticPath -> do let mimeType = Static.getMimeType staticPath liftIO $ res $ Wai.responseFile H.status200 [(H.hContentType, mimeType)] staticPath Nothing AssetGenerated Html html -> do let s = html <> toLazy wsClientHtml <> shim liftIO $ res $ Wai.responseLBS H.status200 [(H.hContentType, "text/html")] s AssetGenerated Other s -> do let mimeType = Static.getMimeType $ review (fromPrism_ $ routePrism val) r liftIO $ res $ Wai.responseLBS H.status200 [(H.hContentType, mimeType)] s -}