]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/MagnetURI.hs
magneturi: two passing tests
[functorrent.git] / src / FuncTorrent / MagnetURI.hs
index e0fd5450b47f07614eebef7360356cbbbfd0bace..7a9b20ed01a89dc67e2564b16724627f3422cb72 100644 (file)
@@ -45,6 +45,7 @@ module FuncTorrent.MagnetURI where
 import Text.ParserCombinators.Parsec
 import qualified Text.Parsec.ByteString as ParsecBS
 import Data.ByteString.Char8 (ByteString, pack)
+import Network.HTTP.Base (urlDecode)
 
 data Magnetinfo = Magnetinfo { infoHash :: ByteString
                              , trackerlist :: [String]
@@ -60,7 +61,7 @@ kvpair :: ParsecBS.Parser (String, String)
 kvpair = do
   k <- many1 letter
   _ <- char '='
-  v <- many1 (letter <|> digit <|> (char ':'))
+  v <- many1 (noneOf "&")
   return (k, v)
 
 magnetBody :: ParsecBS.Parser Magnetinfo
@@ -72,8 +73,8 @@ magnetBody = do
             case k of
               "xt" -> magnetRecord { infoHash = pack v }
               "tr" -> let trVal = trackerlist magnetRecord in
-                        magnetRecord { trackerlist = trVal ++ [v] }
-              "dn" -> magnetRecord { name = v }
+                        magnetRecord { trackerlist = trVal ++ [urlDecode v] }
+              "dn" -> magnetRecord { name = urlDecode v }
               "xl" -> magnetRecord { xlen = Just (read v :: Integer) }
           magnetInfo = Magnetinfo { infoHash = mempty
                                   , trackerlist = mempty