From a7d42846b56dbe87a68decb57fcc6168155481c2 Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sat, 14 Apr 2018 06:00:45 +0000 Subject: [PATCH 1/8] add performMethod --- yesod-test/Yesod/Test.hs | 16 ++++++++++++++++ yesod-test/test/main.hs | 3 +++ yesod-test/yesod-test.cabal | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 22fed19c..505f645a 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 @@ -929,6 +930,21 @@ get url = request $ do setMethod "GET" setUrl url +-- | Perform a request using a given method to @url@. +-- +-- @since 1.6.3 +-- +-- ==== __Examples__ +-- +-- > performMethod "GET" 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 -- 301, 302, 303, 307 or 308, and the Location header is set.) 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 From 7ad28d227c2a8b585d6ce14aefe2494b80b987a7 Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sat, 14 Apr 2018 06:10:59 +0000 Subject: [PATCH 2/8] Update ChangeLog.md --- yesod-test/ChangeLog.md | 4 ++++ 1 file changed, 4 insertions(+) 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 From a9030aa2948e6d7f9663fb28eea1dd8c64263e54 Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sat, 14 Apr 2018 06:46:38 +0000 Subject: [PATCH 3/8] make get and post use performMethod --- yesod-test/Yesod/Test.hs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 505f645a..5ff6855d 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -895,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. -- @@ -926,9 +924,7 @@ 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@. -- From 860ef4127a51d082cab349969506271896173b16 Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sat, 14 Apr 2018 06:47:32 +0000 Subject: [PATCH 4/8] Change the method in the example of performMethod --- yesod-test/Yesod/Test.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 5ff6855d..10f15f0a 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -932,7 +932,7 @@ get = performMethod "GET" -- -- ==== __Examples__ -- --- > performMethod "GET" HomeR +-- > performMethod "DELETE" HomeR performMethod :: (Yesod site, RedirectUrl site url) => ByteString -> url From 712e8bb475cae98f8b54a24ee0cfc5dd75fe1072 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 14:33:38 +0900 Subject: [PATCH 5/8] 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 5b9cb3b7..55ad6e32 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 4d7679775aa60fded50979de58d380eb65fda554 Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 17:49:34 +0900 Subject: [PATCH 6/8] fixed: see th-lift-instances-0.1.11 th-lift-instances-0.1.11 build is Simple. --- stack.yaml | 1 + 1 file changed, 1 insertion(+) 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 From eb220c936aedede129b342364c1da656eb1ede6b Mon Sep 17 00:00:00 2001 From: ncaq Date: Tue, 17 Apr 2018 18:41:23 +0900 Subject: [PATCH 7/8] 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 55ad6e32..05097618 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 8/8] 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 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 05097618..da1e395a 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 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