From 712e8bb475cae98f8b54a24ee0cfc5dd75fe1072 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 14:33:38 +0900 Subject: [PATCH 1/3] added: addContentDispositionFileName --- yesod-core/Yesod/Core/Handler.hs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 5b9cb3b77..55ad6e325 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,14 @@ deleteCookie a = addHeaderInternal . DeleteCookie (encodeUtf8 a) . encodeUtf8 setLanguage :: MonadHandler m => Text -> m () setLanguage = setSession langKey +-- | Set attachment file name. +-- +-- allow UTF-8 character. +addContentDispositionFileName :: MonadHandler m => T.Text -> m () +addContentDispositionFileName name + = addHeader "Content-Disposition" $ + "attachment; filename*=UTF-8''" `mappend` decodeUtf8 (H.urlEncode True (encodeUtf8 name)) + -- | Set an arbitrary response header. -- -- Note that, while the data type used here is 'Text', you must provide only From eb220c936aedede129b342364c1da656eb1ede6b Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 18:41:23 +0900 Subject: [PATCH 2/3] added: addContentDispositionFileName: document comment I wrote battle of multibyte from code review. --- yesod-core/Yesod/Core/Handler.hs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 55ad6e325..050976182 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -783,11 +783,21 @@ setLanguage = setSession langKey -- | Set attachment file name. -- --- allow UTF-8 character. +-- 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 +-- () addContentDispositionFileName :: MonadHandler m => T.Text -> m () -addContentDispositionFileName name - = addHeader "Content-Disposition" $ - "attachment; filename*=UTF-8''" `mappend` decodeUtf8 (H.urlEncode True (encodeUtf8 name)) +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. -- From a59ee6b62ed11334cd690b2d763d24990e562d9b Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 18:46:50 +0900 Subject: [PATCH 3/3] added: ChangeLog 1.6.4 --- yesod-core/ChangeLog.md | 4 ++++ yesod-core/Yesod/Core/Handler.hs | 2 ++ yesod-core/yesod-core.cabal | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/yesod-core/ChangeLog.md b/yesod-core/ChangeLog.md index 5952081a3..4f7a74d0e 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 050976182..da1e395ae 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -788,6 +788,8 @@ setLanguage = setSession langKey -- 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 diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index c61e7aad3..f9788e6d0 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