-- | Internal constructors and helper functions. Note that no guarantees are given for stability of these interfaces. module Network.Wai.Middleware.RequestSizeLimit.Internal ( RequestSizeLimitSettings(..) , setMaxLengthForRequest , setOnLengthExceeded ) where import Data.Word (Word64) import Network.Wai (Middleware, Request) -- | Settings to configure 'requestSizeLimitMiddleware'. -- -- This type (but not the constructor, or record fields) is exported from "Network.Wai.Middleware.RequestSizeLimit". -- Since the constructor isn't exported, create a default value with 'defaultRequestSizeLimitSettings' first, -- then set the values using 'setMaxLengthForRequest' and 'setOnLengthExceeded' (See the examples below). -- -- If you need to access the constructor directly, it's exported from "Network.Wai.Middleware.RequestSizeLimit.Internal". -- -- ==== __Examples__ -- -- ===== Conditionally setting the limit based on the request -- > {-# LANGUAGE OverloadedStrings #-} -- > import Network.Wai -- > import Network.Wai.Middleware.RequestSizeLimit -- > -- > let megabyte = 1024 * 1024 -- > let sizeForReq req = if pathInfo req == ["upload", "image"] then pure $ Just $ megabyte * 20 else pure $ Just $ megabyte * 2 -- > let finalSettings = setMaxLengthForRequest sizeForReq defaultRequestSizeLimitSettings -- -- ===== JSON response -- > {-# LANGUAGE OverloadedStrings #-} -- > import Network.Wai -- > import Network.Wai.Middleware.RequestSizeLimit -- > import Network.HTTP.Types.Status (requestEntityTooLarge413) -- > import Data.Aeson -- > import Data.Text (Text) -- > -- > let jsonResponse = \_maxLen _app _req sendResponse -> sendResponse $ responseLBS requestEntityTooLarge413 [("Content-Type", "application/json")] (encode $ object ["error" .= ("request size too large" :: Text)]) -- > let finalSettings = setOnLengthExceeded jsonResponse defaultRequestSizeLimitSettings -- -- @since 3.1.1 data RequestSizeLimitSettings = RequestSizeLimitSettings { RequestSizeLimitSettings -> Request -> IO (Maybe Word64) maxLengthForRequest :: Request -> IO (Maybe Word64) -- ^ Function to determine the maximum request size in bytes for the request. Return 'Nothing' for no limit. Since 3.1.1 , RequestSizeLimitSettings -> Word64 -> Middleware onLengthExceeded :: Word64 -> Middleware -- ^ Callback function when maximum length is exceeded. The 'Word64' argument is the limit computed by 'maxLengthForRequest'. Since 3.1.1 } -- | Function to determine the maximum request size in bytes for the request. Return 'Nothing' for no limit. -- -- @since 3.1.1 setMaxLengthForRequest :: (Request -> IO (Maybe Word64)) -> RequestSizeLimitSettings -> RequestSizeLimitSettings setMaxLengthForRequest :: (Request -> IO (Maybe Word64)) -> RequestSizeLimitSettings -> RequestSizeLimitSettings setMaxLengthForRequest Request -> IO (Maybe Word64) fn RequestSizeLimitSettings settings = RequestSizeLimitSettings settings { maxLengthForRequest :: Request -> IO (Maybe Word64) maxLengthForRequest = Request -> IO (Maybe Word64) fn } -- | Callback function when maximum length is exceeded. The 'Word64' argument is the limit computed by 'setMaxLengthForRequest'. -- -- @since 3.1.1 setOnLengthExceeded :: (Word64 -> Middleware) -> RequestSizeLimitSettings -> RequestSizeLimitSettings setOnLengthExceeded :: (Word64 -> Middleware) -> RequestSizeLimitSettings -> RequestSizeLimitSettings setOnLengthExceeded Word64 -> Middleware fn RequestSizeLimitSettings settings = RequestSizeLimitSettings settings { onLengthExceeded :: Word64 -> Middleware onLengthExceeded = Word64 -> Middleware fn }