diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 7aac9974..b065522d 100644 --- a/yesod-core/ChangeLog.md +++ b/yesod-core/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.4.8.3 + +* Use 307 redirect for cleaning paths and non-GET requests [#951](https://github.com/yesodweb/yesod/issues/951) + ## 1.4.8.2 * Allow blaze-builder 0.4 diff --git a/yesod-core/Yesod/Core/Dispatch.hs b/yesod-core/Yesod/Core/Dispatch.hs index a968008c..7e43f74b 100644 --- a/yesod-core/Yesod/Core/Dispatch.hs +++ b/yesod-core/Yesod/Core/Dispatch.hs @@ -47,7 +47,7 @@ import Data.Monoid (mappend) import qualified Data.ByteString as S import qualified Data.ByteString.Char8 as S8 import qualified Blaze.ByteString.Builder -import Network.HTTP.Types (status301) +import Network.HTTP.Types (status301, status307) import Yesod.Routes.Parse import Yesod.Core.Types import Yesod.Core.Class.Yesod @@ -96,11 +96,17 @@ toWaiAppYre yre req = site = yreSite yre sendRedirect :: Yesod master => master -> [Text] -> W.Application sendRedirect y segments' env sendResponse = - sendResponse $ W.responseLBS status301 + sendResponse $ W.responseLBS status [ ("Content-Type", "text/plain") , ("Location", Blaze.ByteString.Builder.toByteString dest') ] "Redirecting" where + -- Ensure that non-GET requests get redirected correctly. See: + -- https://github.com/yesodweb/yesod/issues/951 + status + | W.requestMethod env == "GET" = status301 + | otherwise = status307 + dest = joinPath y (resolveApproot y env) segments' [] dest' = if S.null (W.rawQueryString env) diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index 9bd87b03..0d32476f 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -1,5 +1,5 @@ name: yesod-core -version: 1.4.8.2 +version: 1.4.8.3 license: MIT license-file: LICENSE author: Michael Snoyman