safe,
transformers
-executable functorrent
+executable functorrent-exe
main-is: Main.hs
other-extensions: OverloadedStrings
hs-source-dirs: src/main
type: exitcode-stdio-1.0
default-language: Haskell2010
hs-source-dirs: test
- main-is: Test.hs
- other-modules: BencodeTests
- build-depends: base,
- functorrent,
- bytestring,
- containers,
- directory,
- doctest,
- QuickCheck,
- tasty,
- tasty-hunit,
- QuickCheck,
- tasty-quickcheck,
- test-framework-quickcheck2
+ main-is: Main.hs
+ other-modules: MagneturiTests
+ build-depends: base
+ , functorrent
+ , hspec
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
`shouldBe` (Right (Magnetinfo {infoHash = "urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a", trackerlist = [], name = "", xlen = Nothing}))
it "Valid MagnetURI with tracker list" $ do
parseMagneturi "magnet:?xt=urn:btih:1f8a4ee3c3f57e81f8f0b4e658177201fc2a3118&dn=Honey+Bee+2+%5B2017%5D+Malayalam+DVDRiP+x264+AAC+700MB+ZippyMovieZ+E&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969"
- `shouldBe` (Right (Magnetinfo {infoHash = "urn:btih:1f8a4ee3c3f57e81f8f0b4e658177201fc2a3118", trackerlist = [ "udp://tracker.leechers-paradise.org", "udp://zer0day.ch/", "udp://open.demonii.com/", "udp://tracker.coppersurfer.tk/", "udp://exodus.desync.com/"], name = "Honey+Bee+2+%5B2017%5D+Malayalam+DVDRiP+x264+AAC+700MB+ZippyMovieZ+E", xlen = Nothing}))
+ `shouldBe` (Right (Magnetinfo {infoHash = "urn:btih:1f8a4ee3c3f57e81f8f0b4e658177201fc2a3118", trackerlist = [ "udp://tracker.leechers-paradise.org:6969", "udp://zer0day.ch:1337", "udp://open.demonii.com:1337", "udp://tracker.coppersurfer.tk:6969", "udp://exodus.desync.com:6969"], name = "Honey+Bee+2+[2017]+Malayalam+DVDRiP+x264+AAC+700MB+ZippyMovieZ+E", xlen = Nothing}))