From 89fc6c46e2b558783b642752352ff55a0965e1f4 Mon Sep 17 00:00:00 2001 From: Sibi Prabakaran Date: Thu, 13 Jul 2017 16:29:08 +0530 Subject: [PATCH] Fix ordering logic in replaceHeader function --- yesod-core/Yesod/Core/Handler.hs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index e98fee17..1bda5fc6 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -798,19 +798,30 @@ setHeader = addHeader -- @since 1.4.36 replaceOrAddHeader :: MonadHandler m => Text -> Text -> m () replaceOrAddHeader a b = - let header = Header (encodeUtf8 a) (encodeUtf8 b) - in modify $ \g -> g {ghsHeaders = replaceHeader header (ghsHeaders g)} + modify $ \g -> g {ghsHeaders = replaceHeader (ghsHeaders g)} where + repHeader = Header (encodeUtf8 a) (encodeUtf8 b) + sameHeaderName :: Header -> Header -> Bool sameHeaderName (Header n1 _) (Header n2 _) = n1 == n2 sameHeaderName _ _ = False - replaceHeader :: Header -> Endo [Header] -> Endo [Header] - replaceHeader header endo = + replaceIndividualHeader :: [Header] -> [Header] + replaceIndividualHeader [] = [repHeader] + replaceIndividualHeader xs = aux xs [] + where + aux [] acc = acc ++ [repHeader] + aux (x:xs') acc = + if sameHeaderName repHeader x + then acc ++ + [repHeader] ++ + (filter (\header -> not (sameHeaderName header repHeader)) xs') + else aux xs' (acc ++ [x]) + + replaceHeader :: Endo [Header] -> Endo [Header] + replaceHeader endo = let allHeaders :: [Header] = appEndo endo [] - in Endo - (\rest -> - header : filter (\x -> not (sameHeaderName x header)) allHeaders ++ rest) + in Endo (\rest -> replaceIndividualHeader allHeaders ++ rest) -- | Set the Cache-Control header to indicate this response should be cached -- for the given number of seconds.