diff --git a/stack.yaml b/stack.yaml index 03cc8a6a..52ec0356 100644 --- a/stack.yaml +++ b/stack.yaml @@ -43,3 +43,4 @@ extra-deps: - websockets-0.12.3.1 - th-abstraction-0.2.6.0 - persistent-template-2.5.3.1 +- th-lift-instances-0.1.11 diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 5952081a..4f7a74d0 100644 --- a/yesod-core/ChangeLog.md +++ b/yesod-core/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.6.4 + +* Add `addContentDispositionFileName` [#1504](https://github.com/yesodweb/yesod/pull/1504) + ## 1.6.3 * Add missing export for `SubHandlerFor` diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 5b9cb3b7..da1e395a 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -118,6 +118,7 @@ module Yesod.Core.Handler , setHeader , replaceOrAddHeader , setLanguage + , addContentDispositionFileName -- ** Content caching and expiration , cacheSeconds , neverExpires @@ -780,6 +781,26 @@ deleteCookie a = addHeaderInternal . DeleteCookie (encodeUtf8 a) . encodeUtf8 setLanguage :: MonadHandler m => Text -> m () setLanguage = setSession langKey +-- | Set attachment file name. +-- +-- Allows Unicode characters by encoding to UTF-8. +-- Some modurn browser parse UTF-8 characters with out encoding setting. +-- But, for example IE9 can't parse UTF-8 characters. +-- This function use +-- () +-- +-- @since 1.6.4 +addContentDispositionFileName :: MonadHandler m => T.Text -> m () +addContentDispositionFileName fileName + = addHeader "Content-Disposition" $ rfc6266Utf8FileName fileName + +-- | Unicode attachment filename. +-- +-- > rfc6266Utf8FileName (Data.Text.pack "€") +-- "attachment; filename*=UTF-8''%E2%82%AC" +rfc6266Utf8FileName :: T.Text -> T.Text +rfc6266Utf8FileName fileName = "attachment; filename*=UTF-8''" `mappend` decodeUtf8 (H.urlEncode True (encodeUtf8 fileName)) + -- | Set an arbitrary response header. -- -- Note that, while the data type used here is 'Text', you must provide only diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index c61e7aad..f9788e6d 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -1,5 +1,5 @@ name: yesod-core -version: 1.6.3 +version: 1.6.4 license: MIT license-file: LICENSE author: Michael Snoyman diff --git a/yesod-test/ChangeLog.md b/yesod-test/ChangeLog.md index f613c7d3..3941b750 100644 --- a/yesod-test/ChangeLog.md +++ b/yesod-test/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.6.3 +Add performMethod +[#1502](https://github.com/yesodweb/yesod/pull/1502) + ## 1.6.2 * Add byLabel-related functions like byLabelContain diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 22fed19c..10f15f0a 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -54,6 +54,7 @@ module Yesod.Test , get , post , postBody + , performMethod , followRedirect , getLocation , request @@ -894,9 +895,7 @@ getRequestCookies = do post :: (Yesod site, RedirectUrl site url) => url -> YesodExample site () -post url = request $ do - setMethod "POST" - setUrl url +post = performMethod "POST" -- | Perform a POST request to @url@ with the given body. -- @@ -925,9 +924,22 @@ postBody url body = request $ do get :: (Yesod site, RedirectUrl site url) => url -> YesodExample site () -get url = request $ do - setMethod "GET" - setUrl url +get = performMethod "GET" + +-- | Perform a request using a given method to @url@. +-- +-- @since 1.6.3 +-- +-- ==== __Examples__ +-- +-- > performMethod "DELETE" HomeR +performMethod :: (Yesod site, RedirectUrl site url) + => ByteString + -> url + -> YesodExample site () +performMethod method url = request $ do + setMethod method + setUrl url -- | Follow a redirect, if the last response was a redirect. -- (We consider a request a redirect if the status is diff --git a/yesod-test/test/main.hs b/yesod-test/test/main.hs index 9fdcf6ae..b0b2ebe6 100644 --- a/yesod-test/test/main.hs +++ b/yesod-test/test/main.hs @@ -124,6 +124,9 @@ main = hspec $ do yit "tests1b" $ do get ("/foo" :: Text) statusIs 404 + yit "tests1c" $ do + performMethod "DELETE" ("/" :: Text) + statusIs 200 ydescribe "tests2" $ do yit "type-safe URLs" $ do get $ LiteAppRoute [] diff --git a/yesod-test/yesod-test.cabal b/yesod-test/yesod-test.cabal index 7ae516a0..ddc5519c 100644 --- a/yesod-test/yesod-test.cabal +++ b/yesod-test/yesod-test.cabal @@ -1,5 +1,5 @@ name: yesod-test -version: 1.6.2 +version: 1.6.3 license: MIT license-file: LICENSE author: Nubis