diff --git a/src/PostgREST/ApiRequest.hs b/src/PostgREST/ApiRequest.hs index 57413ba6d..07222466c 100644 --- a/src/PostgREST/ApiRequest.hs +++ b/src/PostgREST/ApiRequest.hs @@ -13,6 +13,7 @@ module PostgREST.ApiRequest , DbAction(..) , Payload(..) , userApiRequest + , userPreferences ) where import qualified Data.Aeson as JSON @@ -127,10 +128,8 @@ data ApiRequest = ApiRequest { } -- | Examines HTTP request and translates it into user intent. --- --- TimezoneNames are used by Prefer: timezone -userApiRequest :: AppConfig -> Request -> RequestBody -> TimezoneNames -> Either ApiRequestError ApiRequest -userApiRequest conf req reqBody timezones = do +userApiRequest :: AppConfig -> Preferences.Preferences -> Request -> RequestBody -> Either ApiRequestError ApiRequest +userApiRequest conf prefs req reqBody = do resource <- getResource conf $ pathInfo req (schema, negotiatedByProfile) <- getSchema conf hdrs method act <- getAction resource schema method @@ -142,7 +141,7 @@ userApiRequest conf req reqBody timezones = do , iRange = ranges , iTopLevelRange = topLevelRange , iPayload = payload - , iPreferences = Preferences.fromHeaders (configDbTxAllowOverride conf) timezones hdrs + , iPreferences = prefs , iQueryParams = qPrms , iColumns = columns , iHeaders = iHdrs @@ -163,6 +162,10 @@ userApiRequest conf req reqBody timezones = do contentMediaType = maybe MTApplicationJSON MediaType.decodeMediaType $ lookupHeader "content-type" actIsInvokeSafe x = case x of {ActDb (ActRoutine _ (InvRead _)) -> True; _ -> False} +-- | Parses the Prefer header +userPreferences :: AppConfig -> Request -> TimezoneNames -> Preferences.Preferences +userPreferences conf req timezones = Preferences.fromHeaders (configDbTxAllowOverride conf) timezones $ requestHeaders req + getResource :: AppConfig -> [Text] -> Either ApiRequestError Resource getResource AppConfig{configOpenApiMode, configDbRootSpec} = \case [] -> diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index 75c0d091c..bc696929d 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -145,8 +145,9 @@ postgrestResponse appState conf@AppConfig{..} maybeSchemaCache pgVer authResult@ let jwtTime = if configServerTimingEnabled then Auth.getJwtDur req else Nothing timezones = dbTimezones sCache + prefs = ApiRequest.userPreferences conf req timezones - (parseTime, apiReq@ApiRequest{..}) <- withTiming $ liftEither . mapLeft Error.ApiRequestError $ ApiRequest.userApiRequest conf req body timezones + (parseTime, apiReq@ApiRequest{..}) <- withTiming $ liftEither . mapLeft Error.ApiRequestError $ ApiRequest.userApiRequest conf prefs req body (planTime, plan) <- withTiming $ liftEither $ Plan.actionPlan iAction conf apiReq sCache let query = Query.query conf authResult apiReq plan sCache pgVer