diff --git a/yesod-core/Yesod/Handler.hs b/yesod-core/Yesod/Handler.hs index a865348b..62c73870 100644 --- a/yesod-core/Yesod/Handler.hs +++ b/yesod-core/Yesod/Handler.hs @@ -455,7 +455,13 @@ safeEh er = YesodApp $ \_ _ _ session -> do -- a 302. If at some future date it is determined that virtually all clients -- understand 303, this implementation will switch to that status code. redirect :: RedirectUrl master url => url -> GHandler sub master a -redirect = redirectWith H.status302 +redirect url = do + req <- waiRequest + let status = + if W.httpVersion req == H.http11 + then H.status303 + else H.status302 + redirectWith status url -- | Redirect to the given URL with the specified status code. redirectWith :: RedirectUrl master url => H.Status -> url -> GHandler sub master a diff --git a/yesod-core/test/YesodCoreTest/Redirect.hs b/yesod-core/test/YesodCoreTest/Redirect.hs index 914be120..71b03db2 100644 --- a/yesod-core/test/YesodCoreTest/Redirect.hs +++ b/yesod-core/test/YesodCoreTest/Redirect.hs @@ -43,10 +43,17 @@ specs = describe "Redirect" [ assertStatus 307 res assertBodyContains "" res - , it "302 redirect for regular" $ app $ do + , it "303 redirect for regular, HTTP 1.1" $ app $ do res <- request defaultRequest { pathInfo = ["rregular"] } + assertStatus 303 res + assertBodyContains "" res + , it "302 redirect for regular, HTTP 1.0" $ app $ do + res <- request defaultRequest { + pathInfo = ["rregular"] + , httpVersion = H.http10 + } assertStatus 302 res assertBodyContains "" res ]