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]
kvpair = do
k <- many1 letter
_ <- char '='
- v <- many1 (letter <|> digit <|> (char ':'))
+ v <- many1 (noneOf "&")
return (k, v)
magnetBody :: ParsecBS.Parser Magnetinfo
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