diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index 7a4dfb982..d220d0266 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -610,9 +610,9 @@ contentTypeHeaders RequestContext{..} = -- than `*` binaryField :: Monad m => RequestContext -> ReadRequest -> Handler m (Maybe FieldName) binaryField RequestContext{..} readReq - | returnsScalar (iTarget ctxApiRequest) && iAcceptMediaType ctxApiRequest `elem` rawMediaTypes ctxConfig = + | returnsScalar (iTarget ctxApiRequest) && isRawMediaType = return $ Just "pgrst_scalar" - | iAcceptMediaType ctxApiRequest `elem` rawMediaTypes ctxConfig = + | isRawMediaType = let fldNames = fstFieldNames readReq fieldName = headMay fldNames @@ -623,10 +623,8 @@ binaryField RequestContext{..} readReq throwError $ Error.BinaryFieldError (iAcceptMediaType ctxApiRequest) | otherwise = return Nothing - -rawMediaTypes :: AppConfig -> [MediaType] -rawMediaTypes AppConfig{..} = - (MediaType.decodeMediaType <$> configRawMediaTypes) `union` [MTOctetStream, MTTextPlain, MTTextXML] + where + isRawMediaType = iAcceptMediaType ctxApiRequest `elem` configRawMediaTypes ctxConfig `union` [MTOctetStream, MTTextPlain, MTTextXML] profileHeader :: ApiRequest -> Maybe HTTP.Header profileHeader ApiRequest{..} = diff --git a/src/PostgREST/Config.hs b/src/PostgREST/Config.hs index d6e10a46c..f070575eb 100644 --- a/src/PostgREST/Config.hs +++ b/src/PostgREST/Config.hs @@ -57,6 +57,7 @@ import PostgREST.Config.Proxy (Proxy (..), isMalformedProxyUri, toURI) import PostgREST.DbStructure.Identifiers (QualifiedIdentifier, dumpQi, toQi) +import PostgREST.MediaType (MediaType (..), toMime) import Protolude hiding (Proxy, toList) @@ -88,7 +89,7 @@ data AppConfig = AppConfig , configLogLevel :: LogLevel , configOpenApiMode :: OpenAPIMode , configOpenApiServerProxyUri :: Maybe Text - , configRawMediaTypes :: [BS.ByteString] + , configRawMediaTypes :: [MediaType] , configServerHost :: Text , configServerPort :: Int , configServerUnixSocket :: Maybe FilePath @@ -143,7 +144,7 @@ toText conf = ,("log-level", q . dumpLogLevel . configLogLevel) ,("openapi-mode", q . dumpOpenApiMode . configOpenApiMode) ,("openapi-server-proxy-uri", q . fromMaybe mempty . configOpenApiServerProxyUri) - ,("raw-media-types", q . T.decodeUtf8 . BS.intercalate "," . configRawMediaTypes) + ,("raw-media-types", q . T.decodeUtf8 . BS.intercalate "," . fmap toMime . configRawMediaTypes) ,("server-host", q . configServerHost) ,("server-port", show . configServerPort) ,("server-unix-socket", q . maybe mempty T.pack . configServerUnixSocket) @@ -238,7 +239,7 @@ parser optPath env dbSettings = <*> parseLogLevel "log-level" <*> parseOpenAPIMode "openapi-mode" <*> parseOpenAPIServerProxyURI "openapi-server-proxy-uri" - <*> (maybe [] (fmap encodeUtf8 . splitOnCommas) <$> optValue "raw-media-types") + <*> (maybe [] (fmap (MTOther . encodeUtf8) . splitOnCommas) <$> optValue "raw-media-types") <*> (fromMaybe "!4" <$> optString "server-host") <*> (fromMaybe 3000 <$> optInt "server-port") <*> (fmap T.unpack <$> optString "server-unix-socket") diff --git a/src/PostgREST/Request/ApiRequest.hs b/src/PostgREST/Request/ApiRequest.hs index 5e66cd4ed..08ad24e7a 100644 --- a/src/PostgREST/Request/ApiRequest.hs +++ b/src/PostgREST/Request/ApiRequest.hs @@ -420,7 +420,7 @@ findAcceptMediaType conf action path accepts = requestMediaTypes :: AppConfig -> Action -> Path -> [MediaType] requestMediaTypes conf action path = case action of - ActionRead _ -> defaultMediaTypes ++ rawMediaTypes conf + ActionRead _ -> defaultMediaTypes ++ rawMediaTypes ActionInvoke _ -> invokeMediaTypes ActionInspect _ -> [MTOpenAPI, MTApplicationJSON] ActionInfo -> [MTTextCSV] @@ -428,14 +428,11 @@ requestMediaTypes conf action path = where invokeMediaTypes = defaultMediaTypes - ++ rawMediaTypes conf + ++ rawMediaTypes ++ [MTOpenAPI | pIsRootSpec path] defaultMediaTypes = [MTApplicationJSON, MTSingularJSON, MTGeoJSON, MTTextCSV] - -rawMediaTypes :: AppConfig -> [MediaType] -rawMediaTypes AppConfig{..} = - (MediaType.decodeMediaType <$> configRawMediaTypes) `union` [MTOctetStream, MTTextPlain, MTTextXML] + rawMediaTypes = configRawMediaTypes conf `union` [MTOctetStream, MTTextPlain, MTTextXML] {-| Search a pg proc by matching name and arguments keys to parameters. Since a function can be overloaded, diff --git a/test/spec/SpecHelper.hs b/test/spec/SpecHelper.hs index 787636963..4145f012e 100644 --- a/test/spec/SpecHelper.hs +++ b/test/spec/SpecHelper.hs @@ -26,6 +26,7 @@ import PostgREST.Config (AppConfig (..), OpenAPIMode (..), parseSecret) import PostgREST.DbStructure.Identifiers (QualifiedIdentifier (..)) +import PostgREST.MediaType (MediaType (..)) import Protolude hiding (toS) import Protolude.Conv (toS) @@ -176,7 +177,7 @@ testCfgRootSpec :: AppConfig testCfgRootSpec = baseCfg { configDbRootSpec = Just $ QualifiedIdentifier mempty "root"} testCfgHtmlRawOutput :: AppConfig -testCfgHtmlRawOutput = baseCfg { configRawMediaTypes = ["text/html"] } +testCfgHtmlRawOutput = baseCfg { configRawMediaTypes = [MTOther "text/html"] } testCfgResponseHeaders :: AppConfig testCfgResponseHeaders = baseCfg { configDbPreRequest = Just $ QualifiedIdentifier mempty "custom_headers" }