Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Applying gzip on JSON server response #33

Open
wants to merge 2 commits into
base: djed-babbage
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plutus-chain-index-core/plutus-chain-index-core.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ library
, text-class
, unordered-containers
, warp
, wai-extra

test-suite plutus-chain-index-test
import: lang
Expand Down
7 changes: 6 additions & 1 deletion plutus-chain-index-core/src/Plutus/ChainIndex/Server.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ import Control.Monad.Freer (Eff, Member, type (~>))
import Control.Monad.Freer.Error (Error, runError, throwError)
import Control.Monad.Freer.Extras.Modify (raiseEnd)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Monoid (Endo (Endo, appEndo))
import Data.ByteString.Lazy qualified as BSL
import Data.Default (Default (def))
import Data.Maybe (fromMaybe)
import Data.Proxy (Proxy (..))
import Data.Text qualified as Text
import Data.Text.Encoding qualified as Text
import Network.Wai.Handler.Warp qualified as Warp
import Network.Wai.Middleware.Gzip qualified as Gzip
import Plutus.ChainIndex (RunRequirements, runChainIndexEffects)
import Plutus.ChainIndex.Api (API, FromHashAPI, FullAPI, QueryAtAddressRequest (QueryAtAddressRequest),
TxoAtAddressRequest (TxoAtAddressRequest), UtxoAtAddressRequest (UtxoAtAddressRequest),
Expand All @@ -37,7 +39,10 @@ serveChainIndexQueryServer ::
-> IO ()
serveChainIndexQueryServer port runReq = do
let server = hoistServer (Proxy @API) (runChainIndexQuery runReq) serveChainIndex
Warp.run port (serve (Proxy @FullAPI) (server :<|> swagger))
Warp.run port $ middleware (serve (Proxy @FullAPI) (server :<|> swagger))

where gzipMiddleware = Gzip.gzip def { Gzip.gzipSizeThreshold = 1024 }
middleware = appEndo $ foldMap Endo [gzipMiddleware]

runChainIndexQuery ::
RunRequirements
Expand Down
1 change: 1 addition & 0 deletions plutus-pab/plutus-pab.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ library
, uuid
, wai
, wai-cors
, wai-extra
, warp
, websockets
, yaml
Expand Down
5 changes: 4 additions & 1 deletion plutus-pab/src/Plutus/PAB/Webserver/Server.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@ import Control.Monad.IO.Class (liftIO)
import Data.Aeson (FromJSON, ToJSON)
import Data.Bifunctor (first)
import Data.ByteString.Lazy.Char8 qualified as LBS
import Data.Default (def)
import Data.Function ((&))
import Data.Monoid (Endo (Endo, appEndo))
import Data.OpenApi.Schema qualified as OpenApi
import Data.Proxy (Proxy (Proxy))
import Network.Wai (Middleware)
import Network.Wai.Handler.Warp qualified as Warp
import Network.Wai.Middleware.Cors qualified as Cors
import Network.Wai.Middleware.Gzip qualified as Gzip
import Network.Wai.Middleware.Servant.Options qualified as Cors
import Plutus.PAB.Core (PABAction, PABRunner (PABRunner, runPABAction))
import Plutus.PAB.Core qualified as Core
Expand Down Expand Up @@ -110,14 +112,15 @@ startServer WebserverConfig{baseUrl, staticDir, permissiveCorsPolicy, endpointTi
logWarn @(LM.PABMultiAgentMsg t) (LM.UserLog "Warning: Using a very permissive CORS policy! *Any* website serving JavaScript can interact with these endpoints.")
startServer' middlewares (baseUrlPort baseUrl) staticDir availability (timeout endpointTimeout)
where
middlewares = if permissiveCorsPolicy then corsMiddlewares else []
middlewares = if permissiveCorsPolicy then gzipMiddleware : corsMiddlewares else [gzipMiddleware]
corsMiddlewares =
[ -- a custom CORS policy since 'simpleCors' doesn't support "content-type" header by default
let policy = Cors.simpleCorsResourcePolicy { Cors.corsRequestHeaders = [ "content-type" ] }
in Cors.cors (const $ Just policy)
-- this middleware handles preflight OPTIONS browser requests
, Cors.provideOptions (Proxy @(API (Contract.ContractDef t) Integer))
]
gzipMiddleware = Gzip.gzip def { Gzip.gzipSizeThreshold = 1024 }
-- By default we use the normal request timeout: 30 seconds. But if
-- someone has asked for a longer endpoint timeout, we need to set
-- that to be the webserver timeout as well.
Expand Down