diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ab1cb272..a339beed4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed +- Omit Content-Type header for empty body - @begriffs - Prevent role from being changed twice - @begriffs - Use read-only transaction for read requests - @ruslantalpa diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index 2a7d74cba..422eb52c3 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -127,12 +127,14 @@ app dbStructure conf apiRequest = let stm = createWriteStatement qi sq mq isSingle (iPreferRepresentation apiRequest) pKeys (contentType == TextCSV) payload row <- H.query uniform stm let (_, _, location, body) = extractQueryResult row - return $ responseLBS status201 - [ - contentTypeH, - (hLocation, "/" <> cs table <> "?" <> cs location) - ] - $ if iPreferRepresentation apiRequest == Full then cs body else "" + + return $ if iPreferRepresentation apiRequest == Full + then responseLBS status201 [ + contentTypeH, + (hLocation, "/" <> cs table <> "?" <> cs location) + ] (cs body) + else responseLBS status201 + [(hLocation, "/" <> cs table <> "?" <> cs location)] "" (ActionUpdate, TargetIdent qi, Just payload@(PayloadJSON uniform)) -> case mutateSqlParts of @@ -145,8 +147,9 @@ app dbStructure conf apiRequest = s = case () of _ | queryTotal == 0 -> status404 | iPreferRepresentation apiRequest == Full -> status200 | otherwise -> status204 - return $ responseLBS s [contentTypeH, r] - $ if iPreferRepresentation apiRequest == Full then cs body else "" + return $ if iPreferRepresentation apiRequest == Full + then responseLBS s [contentTypeH, r] (cs body) + else responseLBS s [r] "" (ActionDelete, TargetIdent qi, Nothing) -> case mutateSqlParts of diff --git a/test/Feature/InsertSpec.hs b/test/Feature/InsertSpec.hs index 50cda0f99..1c86270f1 100644 --- a/test/Feature/InsertSpec.hs +++ b/test/Feature/InsertSpec.hs @@ -32,6 +32,8 @@ spec = do liftIO $ do simpleBody p `shouldBe` "" simpleStatus p `shouldBe` created201 + -- should not have content type set when body is empty + lookup hContentType (simpleHeaders p) `shouldBe` Nothing it "filters columns in result using &select" $ request methodPost "/menagerie?select=integer,varchar" [("Prefer", "return=representation")] @@ -312,13 +314,15 @@ spec = do g <- get "/items?id=eq.42" liftIO $ simpleHeaders g `shouldSatisfy` matchHeader "Content-Range" "\\*/0" - request methodPatch "/items?id=eq.2" [] - [json| { "id":42 } |] - `shouldRespondWith` ResponseMatcher { - matchBody = Nothing, - matchStatus = 204, - matchHeaders = ["Content-Range" <:> "0-0/1"] - } + p <- request methodPatch "/items?id=eq.2" [] [json| { "id":42 } |] + pure p `shouldRespondWith` ResponseMatcher { + matchBody = Nothing, + matchStatus = 204, + matchHeaders = ["Content-Range" <:> "0-0/1"] + } + liftIO $ + lookup hContentType (simpleHeaders p) `shouldBe` Nothing + g' <- get "/items?id=eq.42" liftIO $ simpleHeaders g' `shouldSatisfy` matchHeader "Content-Range" "0-0/1"