@@ -19,11 +19,10 @@ import Control.Applicative
19import Control.Arrow (first, second)
19import Control.Arrow (first, second)
20import Control.Monad.State
20import Control.Monad.State
21import qualified Data.ByteString.Lazy as BSL
21import qualified Data.ByteString.Lazy as BSL
22−import qualified Data.ByteString.Lazy.UTF8 as BSLUTF8
23import qualified Data.Map as M
22import qualified Data.Map as M
24import Data.Monoid
23import Data.Monoid
25import qualified Data.Text as T
24import qualified Data.Text as T
26−import Data.Text.Encoding (decodeUtf8With)
25+import Data.Text.Encoding (decodeUtf8With, encodeUtf8)
27import Data.Text.Encoding.Error (lenientDecode)
26import Data.Text.Encoding.Error (lenientDecode)
28import GHC.Exts (IsList (..))
27import GHC.Exts (IsList (..))
29import GHC.Generics
28import GHC.Generics
@@ -191,7 +190,7 @@ class FromForm a where
191 fromForm = genericFromForm
190 fromForm = genericFromForm
193instance FromForm Form where fromForm = return
192instance FromForm Form where fromForm = return
194−instance FromForm [(T.Text, T.Text)] where fromForm = toList
193+instance FromForm [(T.Text, T.Text)] where fromForm = return . toList
195instance FromForm (M.Map T.Text T.Text) where fromForm = return . unForm
194instance FromForm (M.Map T.Text T.Text) where fromForm = return . unForm
197-- | A 'Generic'-based implementation of 'fromForm'.
196-- | A 'Generic'-based implementation of 'fromForm'.
@@ -256,13 +255,13 @@ instance (GFromForm f) => GFromForm (M1 C x f) where
256-- >>> encodeForm [("fullname", "Andres Löh")]
255-- >>> encodeForm [("fullname", "Andres Löh")]
257-- "fullname=Andres%20L%C3%B6h"
256-- "fullname=Andres%20L%C3%B6h"
258encodeForm :: Form -> BSL.ByteString
257encodeForm :: Form -> BSL.ByteString
260− let escape :: T.Text -> BSL.ByteString
261− escape = BSLUTF8.fromString . escapeURIString isUnreserved . T.unpack
262− encodePair :: (T.Text, T.Text) -> BSL.ByteString
263− encodePair (k, "") = escape k
264− encodePair (k, v) = escape k <> "=" <> escape v
265− in BSL.intercalate "&" $ map encodePair $ toList xs
258+encodeForm xs = BSL.intercalate "&" $ map (BSL.fromStrict . encodePair) $ toList xs
260+ escape = encodeUtf8 . T.pack . escapeURIString isUnreserved . T.unpack
262+ encodePair (k, "") = escape k
263+ encodePair (k, v) = escape k <> "=" <> escape v
267-- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'.
266-- | Decode an @application/x-www-form-urlencoded@ 'BSL.ByteString' to a 'Form'.