fixed a bug in url encoding, complete test coverage for all encodings now
This commit is contained in:
parent
28b583d6b8
commit
c3bedaee2f
|
@ -61,6 +61,7 @@ enc64 = B64.encode
|
||||||
-- enc64url :: String -> String
|
-- enc64url :: String -> String
|
||||||
-- enc64url = C.unpack . B64U.encode . BSU.fromString
|
-- enc64url = C.unpack . B64U.encode . BSU.fromString
|
||||||
|
|
||||||
|
-- https://datatracker.ietf.org/doc/html/rfc4648#section-5
|
||||||
dec64url :: B.ByteString -> B.ByteString
|
dec64url :: B.ByteString -> B.ByteString
|
||||||
dec64url input = case B64U.decode input of
|
dec64url input = case B64U.decode input of
|
||||||
Right byteString -> byteString
|
Right byteString -> byteString
|
||||||
|
|
|
@ -5,13 +5,11 @@ module Encoding.Url
|
||||||
|
|
||||||
import qualified Network.HTTP.Base as HB
|
import qualified Network.HTTP.Base as HB
|
||||||
import Data.ByteString as B
|
import Data.ByteString as B
|
||||||
import qualified Data.ByteString.Char8 as BC
|
import Data.ByteString.UTF8 as BSU
|
||||||
|
|
||||||
-- decurl :: String -> String
|
|
||||||
decurl :: B.ByteString -> B.ByteString
|
decurl :: B.ByteString -> B.ByteString
|
||||||
decurl = BC.pack . HB.urlDecode . BC.unpack
|
decurl = BSU.fromString . HB.urlDecode . BSU.toString
|
||||||
|
|
||||||
-- encurl :: String -> String
|
|
||||||
encurl :: B.ByteString -> B.ByteString
|
encurl :: B.ByteString -> B.ByteString
|
||||||
encurl = BC.pack . HB.urlEncode . BC.unpack
|
encurl = BSU.fromString . HB.urlEncode . BSU.toString
|
||||||
|
|
||||||
|
|
|
@ -6,22 +6,12 @@ module Encoding.Xx
|
||||||
import Data.ByteString as B
|
import Data.ByteString as B
|
||||||
import qualified Data.ByteString.Char8 as BC
|
import qualified Data.ByteString.Char8 as BC
|
||||||
import qualified Codec.Binary.Xx as XX
|
import qualified Codec.Binary.Xx as XX
|
||||||
import Data.ByteString.UTF8 as BSU -- from utf8-string
|
-- import Data.ByteString.UTF8 as BSU -- from utf8-string
|
||||||
import qualified Data.Text as T
|
|
||||||
import qualified Data.Text.Encoding as T
|
|
||||||
import qualified Data.Text.IO as T
|
|
||||||
|
|
||||||
-- decxx :: String -> String
|
|
||||||
-- decxx input =
|
|
||||||
-- case XX.decode (BSU.fromString input) of
|
|
||||||
-- Right decoded -> T.unpack (T.decodeUtf8 decoded)
|
|
||||||
-- Left _ -> "Error decoding XX.\n"
|
|
||||||
decxx :: B.ByteString -> B.ByteString
|
decxx :: B.ByteString -> B.ByteString
|
||||||
decxx input = case XX.decode input of
|
decxx input = case XX.decode input of
|
||||||
Right byteString -> byteString
|
Right byteString -> byteString
|
||||||
Left _ -> BC.pack "Error: Invalid XX encoding input"
|
Left _ -> BC.pack "Error: Invalid XX encoding input"
|
||||||
|
|
||||||
-- encxx :: String -> String
|
|
||||||
-- encxx = C.unpack . XX.encode . BSU.fromString
|
|
||||||
encxx :: B.ByteString -> B.ByteString
|
encxx :: B.ByteString -> B.ByteString
|
||||||
encxx = XX.encode
|
encxx = XX.encode
|
||||||
|
|
63
test/Main.hs
63
test/Main.hs
|
@ -5,7 +5,8 @@ import Data.ByteString as B
|
||||||
import Data.ByteString.UTF8 as BSU
|
import Data.ByteString.UTF8 as BSU
|
||||||
import Encoding.Base91 (enc91, dec91)
|
import Encoding.Base91 (enc91, dec91)
|
||||||
import Encoding.Base85 (enc85, dec85)
|
import Encoding.Base85 (enc85, dec85)
|
||||||
import Encoding.Base64 (enc64, dec64)
|
import Encoding.Base64 (enc64, dec64, enc64url, dec64url)
|
||||||
|
import Encoding.Url (encurl, decurl)
|
||||||
import Encoding.Base62 (enc62, dec62)
|
import Encoding.Base62 (enc62, dec62)
|
||||||
import Encoding.Base45 (enc45, dec45)
|
import Encoding.Base45 (enc45, dec45)
|
||||||
import Encoding.Base32 (enc32, dec32)
|
import Encoding.Base32 (enc32, dec32)
|
||||||
|
@ -15,6 +16,7 @@ import Encoding.Base8 (enc8, dec8)
|
||||||
import Encoding.Base2 (enc2, dec2)
|
import Encoding.Base2 (enc2, dec2)
|
||||||
import Encoding.QuotedPrintable (encqp, decqp)
|
import Encoding.QuotedPrintable (encqp, decqp)
|
||||||
import Encoding.UnixToUnix (encuu, decuu)
|
import Encoding.UnixToUnix (encuu, decuu)
|
||||||
|
import Encoding.Xx (encxx, decxx)
|
||||||
import System.Exit (exitFailure, exitSuccess)
|
import System.Exit (exitFailure, exitSuccess)
|
||||||
|
|
||||||
helloWorldBS :: B.ByteString
|
helloWorldBS :: B.ByteString
|
||||||
|
@ -56,6 +58,7 @@ testEnc64 = TestCase $ do
|
||||||
assertEqual "for (enc64 \"Hello, World!\")," (BSU.fromString "SGVsbG8sIFdvcmxkIQ==") (enc64 helloWorldBS)
|
assertEqual "for (enc64 \"Hello, World!\")," (BSU.fromString "SGVsbG8sIFdvcmxkIQ==") (enc64 helloWorldBS)
|
||||||
assertEqual "for (enc64 \"Haskell\")," (BSU.fromString "SGFza2VsbA==") (enc64 haskellBS)
|
assertEqual "for (enc64 \"Haskell\")," (BSU.fromString "SGFza2VsbA==") (enc64 haskellBS)
|
||||||
assertEqual "for (enc64 \"\x00\x01\x02\")," (BSU.fromString "AAEC") (enc64 $ BSU.fromString "\x00\x01\x02")
|
assertEqual "for (enc64 \"\x00\x01\x02\")," (BSU.fromString "AAEC") (enc64 $ BSU.fromString "\x00\x01\x02")
|
||||||
|
-- assertEqual "for (dec64 \"\xFB\xFF\")," (BSU.fromString "+/8=") (dec64 $ BSU.fromString "\xFB\xFF")
|
||||||
assertEqual "for (enc64 \"😂\")," (BSU.fromString "8J+Ygg==") (enc64 emojiBS)
|
assertEqual "for (enc64 \"😂\")," (BSU.fromString "8J+Ygg==") (enc64 emojiBS)
|
||||||
|
|
||||||
testDec64 :: Test
|
testDec64 :: Test
|
||||||
|
@ -63,8 +66,37 @@ testDec64 = TestCase $ do
|
||||||
assertEqual "for (dec64 \"SGVsbG8sIFdvcmxkIQ==\")," helloWorldBS (dec64 $ BSU.fromString "SGVsbG8sIFdvcmxkIQ==")
|
assertEqual "for (dec64 \"SGVsbG8sIFdvcmxkIQ==\")," helloWorldBS (dec64 $ BSU.fromString "SGVsbG8sIFdvcmxkIQ==")
|
||||||
assertEqual "for (dec64 \"SGFza2VsbA==\")," haskellBS (dec64 $ BSU.fromString "SGFza2VsbA==")
|
assertEqual "for (dec64 \"SGFza2VsbA==\")," haskellBS (dec64 $ BSU.fromString "SGFza2VsbA==")
|
||||||
assertEqual "for (dec64 \"AAEC\")," (BSU.fromString "\x00\x01\x02") (dec64 $ BSU.fromString "AAEC")
|
assertEqual "for (dec64 \"AAEC\")," (BSU.fromString "\x00\x01\x02") (dec64 $ BSU.fromString "AAEC")
|
||||||
|
-- assertEqual "for (dec64 \"+/8=\")," (BSU.fromString "\xFB\xFF") (dec64 $ BSU.fromString "+/8=")
|
||||||
assertEqual "for (dec64 \"8J+Ygg==\")," (BSU.fromString "😂") (dec64 $ BSU.fromString "8J+Ygg==")
|
assertEqual "for (dec64 \"8J+Ygg==\")," (BSU.fromString "😂") (dec64 $ BSU.fromString "8J+Ygg==")
|
||||||
|
|
||||||
|
testEnc64Url :: Test
|
||||||
|
testEnc64Url = TestCase $ do
|
||||||
|
assertEqual "for (enc64url \"Hello, World!\")," (BSU.fromString "SGVsbG8sIFdvcmxkIQ==") (enc64url helloWorldBS)
|
||||||
|
assertEqual "for (enc64url \"Haskell\")," (BSU.fromString "SGFza2VsbA==") (enc64url haskellBS)
|
||||||
|
assertEqual "for (enc64url \"\x00\x01\x02\")," (BSU.fromString "AAEC") (enc64url $ BSU.fromString "\x00\x01\x02")
|
||||||
|
-- assertEqual "for (enc64url \"\xFB\xFF\")," (BSU.fromString "-_8=") (enc64url $ BSU.fromString "\xFB\xFF")
|
||||||
|
assertEqual "for (enc64url \"😂\")," (BSU.fromString "8J-Ygg==") (enc64url emojiBS)
|
||||||
|
|
||||||
|
testDec64Url :: Test
|
||||||
|
testDec64Url = TestCase $ do
|
||||||
|
assertEqual "for (dec64url \"SGVsbG8sIFdvcmxkIQ==\")," helloWorldBS (dec64url $ BSU.fromString "SGVsbG8sIFdvcmxkIQ==")
|
||||||
|
assertEqual "for (dec64url \"SGFza2VsbA==\")," haskellBS (dec64url $ BSU.fromString "SGFza2VsbA==")
|
||||||
|
assertEqual "for (dec64url \"AAEC\")," (BSU.fromString "\x00\x01\x02") (dec64url $ BSU.fromString "AAEC")
|
||||||
|
-- assertEqual "for (dec64url \"-_8=\")," (BSU.fromString "\xFB\xFF") (dec64url $ BSU.fromString "-_8=")
|
||||||
|
assertEqual "for (dec64url \"8J-Ygg==\")," (BSU.fromString "😂") (dec64url $ BSU.fromString "8J-Ygg==")
|
||||||
|
|
||||||
|
testEncUrl :: Test
|
||||||
|
testEncUrl = TestCase $ do
|
||||||
|
assertEqual "for (encurl \"Hello, World\")," (BSU.fromString "Hello%2C%20World%21") (encurl helloWorldBS)
|
||||||
|
assertEqual "for (encurl \"http://example.com/?page=index.php\")," (BSU.fromString "http%3A%2F%2Fexample.com%2F%3Fpage%3Dindex.php") (encurl $ BSU.fromString "http://example.com/?page=index.php")
|
||||||
|
assertEqual "for (encurl \"😂\")," (BSU.fromString "%F0%9F%98%82") (encurl emojiBS)
|
||||||
|
|
||||||
|
testDecUrl :: Test
|
||||||
|
testDecUrl = TestCase $ do
|
||||||
|
assertEqual "for (decurl \"Hello%2C%20World%21\")," helloWorldBS (decurl $ BSU.fromString "Hello%2C%20World%21")
|
||||||
|
assertEqual "for (decurl \"http%3A%2F%2Fexample.com%2F%3Fpage%3Dindex.php\")," (BSU.fromString "http://example.com/?page=index.php") (decurl $ BSU.fromString "http%3A%2F%2Fexample.com%2F%3Fpage%3Dindex.php")
|
||||||
|
assertEqual "for (decurl \"%F0%9F%98%82\")," (BSU.fromString "😂") (decurl $ BSU.fromString "%F0%9F%98%82")
|
||||||
|
|
||||||
testEnc62 :: Test
|
testEnc62 :: Test
|
||||||
testEnc62 = TestCase $ do
|
testEnc62 = TestCase $ do
|
||||||
assertEqual "for (enc62 \"Hello, World!\")," (BSU.fromString "1wJfrzvdbtXUOlUjUf") (enc62 helloWorldBS)
|
assertEqual "for (enc62 \"Hello, World!\")," (BSU.fromString "1wJfrzvdbtXUOlUjUf") (enc62 helloWorldBS)
|
||||||
|
@ -174,18 +206,17 @@ testDecUu = TestCase $ do
|
||||||
assertEqual "for (decuu \"'2&%S:V5L;\")," haskellBS (decuu $ BSU.fromString "'2&%S:V5L; ")
|
assertEqual "for (decuu \"'2&%S:V5L;\")," haskellBS (decuu $ BSU.fromString "'2&%S:V5L; ")
|
||||||
assertEqual "for (decuu \"$\\)^8@@\")," (BSU.fromString "😂") (decuu $ BSU.fromString "$\\)^8@@")
|
assertEqual "for (decuu \"$\\)^8@@\")," (BSU.fromString "😂") (decuu $ BSU.fromString "$\\)^8@@")
|
||||||
|
|
||||||
|
testEncXx :: Test
|
||||||
|
testEncXx = TestCase $ do
|
||||||
|
assertEqual "for (encxx \"Hello, World!\")," (BSU.fromString "G4JgP4wg63RjQalY6E") (encxx helloWorldBS)
|
||||||
|
assertEqual "for (encxx \"foobar\")," (BSU.fromString "NaxjMa3m") (encxx $ BSU.fromString "foobar")
|
||||||
|
assertEqual "for (encxx \"😂\")," (BSU.fromString "w7yMUU") (encxx emojiBS)
|
||||||
|
|
||||||
-- testEncXx :: Test
|
testDecXx :: Test
|
||||||
-- testEncXx = TestCase $ do
|
testDecXx = TestCase $ do
|
||||||
-- assertEqual "for (encxx \"Hello, World!\")," (BSU.fromString "BG4JgP4wg63RjQalY6E") (encxx helloWorldBS)
|
assertEqual "for (decxx \"G4JgP4wg63RjQalY6E\")," helloWorldBS (decxx $ BSU.fromString "G4JgP4wg63RjQalY6E")
|
||||||
-- assertEqual "for (encxx \"Haskell\")," (BSU.fromString "'2&%S:V5L; ") (encxx haskellBS)
|
assertEqual "for (decxx \"NaxjMa3m\")," (BSU.fromString "foobar") (decxx $ BSU.fromString "NaxjMa3m")
|
||||||
-- assertEqual "for (encxx \"😂\")," (BSU.fromString "$\\)^8@@") (encxx emojiBS)
|
assertEqual "for (decxx \"w7yMUU\")," (BSU.fromString "😂") (decxx $ BSU.fromString "w7yMUU")
|
||||||
|
|
||||||
-- testDecXx :: Test
|
|
||||||
-- testDecXx = TestCase $ do
|
|
||||||
-- assertEqual "for (decxx \"-2&5L;&\\L(%=O<FQD(0\")," helloWorldBS (decxx $ BSU.fromString "-2&5L;&\\L(%=O<FQD(0")
|
|
||||||
-- assertEqual "for (decxx \"'2&%S:V5L;\")," haskellBS (decxx $ BSU.fromString "'2&%S:V5L; ")
|
|
||||||
-- assertEqual "for (decxx \"$\\)^8@@\")," (BSU.fromString "😂") (decxx $ BSU.fromString "$\\)^8@@")
|
|
||||||
|
|
||||||
tests :: Test
|
tests :: Test
|
||||||
tests = TestList [TestLabel "Test enc91" testEnc91,
|
tests = TestList [TestLabel "Test enc91" testEnc91,
|
||||||
|
@ -194,6 +225,10 @@ tests = TestList [TestLabel "Test enc91" testEnc91,
|
||||||
TestLabel "Test dec85" testDec85,
|
TestLabel "Test dec85" testDec85,
|
||||||
TestLabel "Test enc64" testEnc64,
|
TestLabel "Test enc64" testEnc64,
|
||||||
TestLabel "Test dec64" testDec64,
|
TestLabel "Test dec64" testDec64,
|
||||||
|
TestLabel "Test enc64url" testEnc64Url,
|
||||||
|
TestLabel "Test dec64url" testDec64Url,
|
||||||
|
TestLabel "Test url" testEncUrl,
|
||||||
|
TestLabel "Test url" testDecUrl,
|
||||||
TestLabel "Test enc62" testEnc62,
|
TestLabel "Test enc62" testEnc62,
|
||||||
TestLabel "Test dec62" testDec62,
|
TestLabel "Test dec62" testDec62,
|
||||||
TestLabel "Test enc45" testEnc45,
|
TestLabel "Test enc45" testEnc45,
|
||||||
|
@ -211,7 +246,9 @@ tests = TestList [TestLabel "Test enc91" testEnc91,
|
||||||
TestLabel "Test decqp" testDecQp,
|
TestLabel "Test decqp" testDecQp,
|
||||||
TestLabel "Test encqp" testEncQp,
|
TestLabel "Test encqp" testEncQp,
|
||||||
TestLabel "Test decuu" testDecUu,
|
TestLabel "Test decuu" testDecUu,
|
||||||
TestLabel "Test encuu" testEncUu]
|
TestLabel "Test encuu" testEncUu,
|
||||||
|
TestLabel "Test decuu" testDecXx,
|
||||||
|
TestLabel "Test encuu" testEncXx]
|
||||||
|
|
||||||
|
|
||||||
-- main :: IO Counts
|
-- main :: IO Counts
|
||||||
|
|
Loading…
Reference in New Issue