@@ -295,21 +295,18 @@ encodeForm xs = BSL.intercalate "&" $ map (BSL.fromStrict . encodePair) $ toList
295295-- >>> decodeForm "this=has=too=many=equals"
296296-- Left "not a valid pair: this=has=too=many=equals"
297297decodeForm :: BSL.ByteString -> Either T.Text Form
298−decodeForm "" = return mempty
299−decodeForm q = do
300− let xs :: [T.Text]
301− xs = T.splitOn "&" . decodeUtf8With lenientDecode . mconcat . BSL.toChunks $ q
302− parsePair :: T.Text -> Either T.Text (T.Text, T.Text)
303− parsePair p =
304− case T.splitOn "=" p of
305− [k,v] -> return ( unescape k
306− , unescape v
307− )
308− [k] -> return ( unescape k, "" )
309− _ -> Left $ "not a valid pair: " <> p
310− unescape :: T.Text -> T.Text
311− unescape = T.pack . unEscapeString . T.unpack . T.intercalate "%20" . T.splitOn "+"
312− toForm <$> mapM parsePair xs
298+decodeForm bs = toForm <$> traverse parsePair pairs
299+ where
300+ pairs = map (decodeUtf8With lenientDecode . BSL.toStrict) (BSL.split '&' bs)
301+
302+ unescape = T.pack . unEscapeString . T.unpack . T.replace "+" "%20"
303+
304+ parsePair :: T.Text -> Either T.Text (T.Text, T.Text)
305+ parsePair p =
306+ case T.splitOn "=" p of
307+ [k, v] -> return (unescape k, unescape v)
308+ [k] -> return (unescape k, "" )
309+ _ -> Left $ "not a valid pair: " <> p
313310
314311data Proxy3 a b c = Proxy3
315312