diff --git a/README.md b/README.md index 616525c57..01ebca296 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,8 @@ Download the binary ([OS X](http://bin.begriffs.com/dbapi/osx/postgrest-0.2.6.0. postgrest --db-host localhost --db-port 5432 \ --db-name my_db --db-user postgres \ --db-pass foobar --db-pool 200 \ - --anonymous postgres --port 3000 + --anonymous postgres --port 3000 \ + --v1schema public ``` In production include the `--secure` option which redirects all diff --git a/src/App.hs b/src/App.hs index 32c5ab7e0..f0c09a11b 100644 --- a/src/App.hs +++ b/src/App.hs @@ -35,8 +35,8 @@ import PgQuery import RangeQuery import PgStructure -app :: BL.ByteString -> Request -> H.Tx P.Postgres s Response -app reqBody req = +app :: Text -> BL.ByteString -> Request -> H.Tx P.Postgres s Response +app v1schema reqBody req = case (path, verb) of ([], _) -> do body <- encode <$> tables (cs schema) @@ -171,7 +171,7 @@ app reqBody req = verb = requestMethod req qq = queryString req hdrs = requestHeaders req - schema = requestedSchema hdrs + schema = requestedSchema v1schema hdrs range = rangeRequested hdrs allOrigins = ("Access-Control-Allow-Origin", "*") :: Header @@ -197,11 +197,11 @@ contentRangeH from to total = <> cs (show total) ) -requestedSchema :: RequestHeaders -> Text -requestedSchema hdrs = +requestedSchema :: Text -> RequestHeaders -> Text +requestedSchema v1schema hdrs = case verStr of - Just [[_, ver]] -> ver - _ -> "1" + Just [[_, ver]] -> if ver == "1" then v1schema else ver + _ -> v1schema where verRegex = "version[ ]*=[ ]*([0-9]+)" :: String accept = cs <$> lookup hAccept hdrs :: Maybe Text diff --git a/src/Config.hs b/src/Config.hs index fae4d5490..f883fe1f1 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -20,6 +20,7 @@ data AppConfig = AppConfig { , configAnonRole :: String , configSecure :: Bool , configPool :: Int + , configV1Schema :: String } argParser :: Parser AppConfig @@ -34,6 +35,7 @@ argParser = AppConfig <*> strOption (long "anonymous" <> short 'a' <> metavar "ROLE" <> help "postgres role to use for non-authenticated requests") <*> switch (long "secure" <> short 's' <> help "Redirect all requests to HTTPS") <*> option auto (long "db-pool" <> metavar "COUNT" <> value 10 <> help "Max connections in database pool" <> showDefault) + <*> strOption (long "v1schema" <> metavar "NAME" <> value "1" <> help "Schema to use for nonspecified version (or explicit v1)" <> showDefault) defaultCorsPolicy :: CorsResourcePolicy defaultCorsPolicy = CorsResourcePolicy Nothing diff --git a/src/Main.hs b/src/Main.hs index 3d65693c8..abf897c35 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -63,7 +63,7 @@ main = do runSettings appSettings $ middle $ \req respond -> do body <- strictRequestBody req resOrError <- liftIO $ H.session pool $ H.tx Nothing $ - authenticated currRole anonRole (app body) req + authenticated currRole anonRole (app (cs $ configV1Schema conf) body) req either (respond . errResponse) respond resOrError where diff --git a/test/SpecHelper.hs b/test/SpecHelper.hs index e12c7f76b..29c08d417 100644 --- a/test/SpecHelper.hs +++ b/test/SpecHelper.hs @@ -35,7 +35,7 @@ isLeft (Left _ ) = True isLeft _ = False cfg :: AppConfig -cfg = AppConfig "postgrest_test" 5432 "postgrest_test" "" "localhost" 3000 "postgrest_anonymous" False 10 +cfg = AppConfig "postgrest_test" 5432 "postgrest_test" "" "localhost" 3000 "postgrest_anonymous" False 10 "1" testPoolOpts :: PoolSettings testPoolOpts = fromMaybe (error "bad settings") $ H.poolSettings 1 30 @@ -57,7 +57,7 @@ withApp perform = do perform $ middle $ \req resp -> do body <- strictRequestBody req result <- liftIO $ H.session pool $ H.tx Nothing - $ authenticated currRole anonRole (app body) req + $ authenticated currRole anonRole (app (cs $ configV1Schema cfg) body) req either (resp . errResponse) resp result where middle = cors corsPolicy