From dc2d5d9cd0d34dd9318726c7534d683813410fc5 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Thu, 8 Apr 2021 09:34:38 -0400 Subject: [PATCH] Stop moving session language ahead of reqLangs Yesod.Core.Handler.languages checks first for a language set in the user's session, prepending that value to YesodRequest{reqLangs}, so it is respected above all else if present. For context, reqLangs itself also includes the session, but just later in line: langs' = catMaybes [ lookup langKey gets -- Query _LANG , lookup langKey cookies -- Cookie _LANG , lookupText langKey session -- Session _LANG ] ++ langs -- Accept-Language(s) In #1720, it was raised that allowing the session (something implicitly present for any request) to override a query parameter (something explicitly given on that request) is surprising. We decided (without knowing what order reqLangs was doing) that query, cookie, session, accept was best and languages should be changed to do that. Conveniently, this just makes languages equivalent to reqLangs, so that is what this patch does. --- yesod-core/src/Yesod/Core/Handler.hs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/yesod-core/src/Yesod/Core/Handler.hs b/yesod-core/src/Yesod/Core/Handler.hs index 063ad1f9..67b9b53d 100644 --- a/yesod-core/src/Yesod/Core/Handler.hs +++ b/yesod-core/src/Yesod/Core/Handler.hs @@ -1226,10 +1226,10 @@ cacheBySet key value = do -- Languages are determined based on the following (in descending order -- of preference): -- --- * The _LANG user session variable. --- -- * The _LANG get parameter. -- +-- * The _LANG user session variable. +-- -- * The _LANG cookie. -- -- * Accept-Language HTTP header. @@ -1239,10 +1239,7 @@ cacheBySet key value = do -- -- This is handled by parseWaiRequest (not exposed). languages :: MonadHandler m => m [Text] -languages = do - mlang <- lookupSession langKey - langs <- reqLangs <$> getRequest - return $ maybe id (:) mlang langs +languages = reqLangs <$> getRequest lookup' :: Eq a => a -> [(a, b)] -> [b] lookup' a = map snd . filter (\x -> a == fst x)