summaryrefslogtreecommitdiff
path: root/src/Network/BitTorrent/Tracker
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2014-02-27 14:40:30 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2014-02-27 14:40:30 +0400
commitf48b30127efbbeeb30a1fdd6e202fc52e1ee6e3a (patch)
tree2d3ed980f9f20a2d759cc36ce762ca13996bb544 /src/Network/BitTorrent/Tracker
parent92c6787bfb345a3f068313480f389db1d2dc9f0d (diff)
Update tracker RPC documentation
Diffstat (limited to 'src/Network/BitTorrent/Tracker')
-rw-r--r--src/Network/BitTorrent/Tracker/RPC.hs18
-rw-r--r--src/Network/BitTorrent/Tracker/RPC/HTTP.hs8
-rw-r--r--src/Network/BitTorrent/Tracker/RPC/UDP.hs9
3 files changed, 26 insertions, 9 deletions
diff --git a/src/Network/BitTorrent/Tracker/RPC.hs b/src/Network/BitTorrent/Tracker/RPC.hs
index 3acffce9..b3e962fa 100644
--- a/src/Network/BitTorrent/Tracker/RPC.hs
+++ b/src/Network/BitTorrent/Tracker/RPC.hs
@@ -5,7 +5,11 @@
5-- Stability : experimental 5-- Stability : experimental
6-- Portability : portable 6-- Portability : portable
7-- 7--
8-- Protocol independent bittorrent tracker API. 8-- This module provides unified RPC interface to BitTorrent
9-- trackers. The tracker is an UDP/HTTP/HTTPS service used to discovery
10-- peers for a particular existing torrent and keep statistics about
11-- the swarm. This module also provides a way to easily request
12-- scrape info for a particular torrent list.
9-- 13--
10{-# LANGUAGE DeriveDataTypeable #-} 14{-# LANGUAGE DeriveDataTypeable #-}
11module Network.BitTorrent.Tracker.RPC 15module Network.BitTorrent.Tracker.RPC
@@ -104,18 +108,26 @@ data Manager = Manager
104 , udpMgr :: !UDP.Manager 108 , udpMgr :: !UDP.Manager
105 } 109 }
106 110
107-- | Normally a bittorrent client session need a single RPC manager 111-- | Create a new 'Manager'. You /must/ manually 'closeManager'
108-- only. 112-- otherwise resource leakage is possible. Normally, a bittorrent
113-- client need a single RPC manager only.
114--
115-- This function can throw 'IOException' on invalid 'Options'.
116--
109newManager :: Options -> PeerInfo -> IO Manager 117newManager :: Options -> PeerInfo -> IO Manager
110newManager opts info = do 118newManager opts info = do
111 h <- HTTP.newManager (optHttpRPC opts) 119 h <- HTTP.newManager (optHttpRPC opts)
112 u <- UDP.newManager (optUdpRPC opts) `onException` HTTP.closeManager h 120 u <- UDP.newManager (optUdpRPC opts) `onException` HTTP.closeManager h
113 return $ Manager opts info h u 121 return $ Manager opts info h u
114 122
123-- | Close all pending RPCs. Behaviour of currently in-flight RPCs can
124-- differ depending on underlying protocol used. No rpc calls should
125-- be performed after manager becomes closed.
115closeManager :: Manager -> IO () 126closeManager :: Manager -> IO ()
116closeManager Manager {..} = do 127closeManager Manager {..} = do
117 UDP.closeManager udpMgr `finally` HTTP.closeManager httpMgr 128 UDP.closeManager udpMgr `finally` HTTP.closeManager httpMgr
118 129
130-- | Normally you need to use 'Control.Monad.Trans.Resource.allocate'.
119withManager :: Options -> PeerInfo -> (Manager -> IO a) -> IO a 131withManager :: Options -> PeerInfo -> (Manager -> IO a) -> IO a
120withManager opts info = bracket (newManager opts info) closeManager 132withManager opts info = bracket (newManager opts info) closeManager
121 133
diff --git a/src/Network/BitTorrent/Tracker/RPC/HTTP.hs b/src/Network/BitTorrent/Tracker/RPC/HTTP.hs
index 00fc9331..37ddb5ad 100644
--- a/src/Network/BitTorrent/Tracker/RPC/HTTP.hs
+++ b/src/Network/BitTorrent/Tracker/RPC/HTTP.hs
@@ -5,10 +5,7 @@
5-- Stability : provisional 5-- Stability : provisional
6-- Portability : portable 6-- Portability : portable
7-- 7--
8-- The tracker is an HTTP/HTTPS service used to discovery peers for 8-- This module implement HTTP tracker protocol.
9-- a particular existing torrent and keep statistics about the
10-- swarm. This module also provides a way to easily request scrape
11-- info for a particular torrent list.
12-- 9--
13-- For more information see: 10-- For more information see:
14-- <https://wiki.theory.org/BitTorrentSpecification#Tracker_HTTP.2FHTTPS_Protocol> 11-- <https://wiki.theory.org/BitTorrentSpecification#Tracker_HTTP.2FHTTPS_Protocol>
@@ -102,12 +99,15 @@ data Manager = Manager
102 , httpMgr :: !HTTP.Manager 99 , httpMgr :: !HTTP.Manager
103 } 100 }
104 101
102-- |
105newManager :: Options -> IO Manager 103newManager :: Options -> IO Manager
106newManager opts = Manager opts <$> HTTP.newManager (optHttpOptions opts) 104newManager opts = Manager opts <$> HTTP.newManager (optHttpOptions opts)
107 105
106-- |
108closeManager :: Manager -> IO () 107closeManager :: Manager -> IO ()
109closeManager Manager {..} = HTTP.closeManager httpMgr 108closeManager Manager {..} = HTTP.closeManager httpMgr
110 109
110-- | Normally you need to use 'Control.Monad.Trans.Resource.allocate'.
111withManager :: Options -> (Manager -> IO a) -> IO a 111withManager :: Options -> (Manager -> IO a) -> IO a
112withManager opts = bracket (newManager opts) closeManager 112withManager opts = bracket (newManager opts) closeManager
113 113
diff --git a/src/Network/BitTorrent/Tracker/RPC/UDP.hs b/src/Network/BitTorrent/Tracker/RPC/UDP.hs
index 632e3d86..160397dd 100644
--- a/src/Network/BitTorrent/Tracker/RPC/UDP.hs
+++ b/src/Network/BitTorrent/Tracker/RPC/UDP.hs
@@ -5,7 +5,8 @@
5-- Stability : provisional 5-- Stability : provisional
6-- Portability : portable 6-- Portability : portable
7-- 7--
8-- This module implement low-level UDP tracker protocol. 8-- This module implement UDP tracker protocol.
9--
9-- For more info see: 10-- For more info see:
10-- <http://www.bittorrent.org/beps/bep_0015.html> 11-- <http://www.bittorrent.org/beps/bep_0015.html>
11-- 12--
@@ -142,6 +143,7 @@ type PendingResponse = MVar (Either RpcException Response)
142type PendingTransactions = Map TransactionId PendingResponse 143type PendingTransactions = Map TransactionId PendingResponse
143type PendingQueries = Map SockAddr PendingTransactions 144type PendingQueries = Map SockAddr PendingTransactions
144 145
146-- | UDP tracker manager.
145data Manager = Manager 147data Manager = Manager
146 { options :: !Options 148 { options :: !Options
147 , sock :: !Socket 149 , sock :: !Socket
@@ -176,7 +178,7 @@ resetState Manager {..} = do
176 where 178 where
177 err = error "UDP tracker manager closed" 179 err = error "UDP tracker manager closed"
178 180
179-- | This function will throw 'IOException' if or 181-- | This function will throw 'IOException' on invalid 'Options'.
180newManager :: Options -> IO Manager 182newManager :: Options -> IO Manager
181newManager opts = do 183newManager opts = do
182 checkOptions opts 184 checkOptions opts
@@ -185,6 +187,8 @@ newManager opts = do
185 putMVar (listenerThread mgr) tid 187 putMVar (listenerThread mgr) tid
186 return mgr 188 return mgr
187 189
190-- | Unblock all RPCs by throwing 'ManagerClosed' exception. No rpc
191-- calls should be performed after manager becomes closed.
188closeManager :: Manager -> IO () 192closeManager :: Manager -> IO ()
189closeManager Manager {..} = do 193closeManager Manager {..} = do
190 close sock 194 close sock
@@ -193,6 +197,7 @@ closeManager Manager {..} = do
193 Nothing -> return () 197 Nothing -> return ()
194 Just tid -> killThread tid 198 Just tid -> killThread tid
195 199
200-- | Normally you need to use 'Control.Monad.Trans.Resource.allocate'.
196withManager :: Options -> (Manager -> IO a) -> IO a 201withManager :: Options -> (Manager -> IO a) -> IO a
197withManager opts = bracket (newManager opts) closeManager 202withManager opts = bracket (newManager opts) closeManager
198 203