Go to file
Matt Joiner 3c75f68413 Kick connections that contribute the final piece of missing metadata that fails to validate
Failing to get metainfo was resetting Torrent.metadataBytes, which caused arriving metadata data to appear to belong to nonexistent pieces, despite passing the check that we'd in fact requested them from the sending connection. This was unnecessarily noisy. Instead return an error if we got all the data, but couldn't set the Torrent's info bytes, that should propagate out and cause the connection that contributed the final missing piece to be dropped. This will at least provide some improved resistance to unfriendly behaviour on the network.
2016-07-24 00:34:40 +10:00
bencode bencode.Encoder: Unembed the Writer and wrap it in a minimal interface 2016-06-15 15:09:34 +10:00
cmd cmd/torrent: Remove unused "short" tag 2016-06-18 16:02:59 +10:00
dht dht: Add counters for writes and write errors 2016-07-23 22:39:06 +10:00
fs Rework Client listeners 2016-05-11 21:11:52 +10:00
internal Drop the lol://cheezburger tracker from the test torrent 2016-05-22 23:44:38 +10:00
iplist iplist/cmd/pack-blocklist use tagflag 2016-05-16 18:45:23 +10:00
logonce logonce is a package that prints each distinct message only once 2014-11-16 13:04:44 -06:00
metainfo Add Announce when AnnounceList is nil 2016-07-22 15:16:11 +08:00
mmap_span refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
mse refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
peer_protocol Add peer_protocol.Integer.Int() 2016-02-21 17:25:26 +11:00
storage Fix issue #97 2016-07-12 16:45:22 +10:00
testdata Add benchmark for adding a torrent with a lot of pieces 2015-06-22 19:43:22 +10:00
tracker tracker: Skip any net errors to third party trackers 2016-05-23 09:29:14 +10:00
util refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
LICENSE The license is MPL2.0 2015-03-25 17:35:33 +11:00
README.md Remove broken coverage link from README 2016-07-11 13:12:52 +10:00
TODO Use new tracker package interface 2016-02-07 18:49:35 +11:00
client.go Kick connections that contribute the final piece of missing metadata that fails to validate 2016-07-24 00:34:40 +10:00
client_test.go Remove duplicate seeder stat test assertions 2016-07-12 18:09:24 +10:00
config.go Rename storage.I->Client 2016-05-16 21:50:43 +10:00
conn_stats.go Add connection read stats 2016-07-12 16:42:04 +10:00
connection.go Add connection read stats 2016-07-12 16:42:04 +10:00
connection_test.go Fix race marshalling a bitfield after a Have has also been posted 2016-05-11 23:50:21 +10:00
doc.go List implemented BEPs 2016-07-11 13:53:00 +10:00
example_test.go Merge Torrent and torrent types 2016-04-03 18:40:43 +10:00
file.go Fix receiver pointeriness for some File methods 2016-04-19 17:20:31 +10:00
file_test.go Add File.Cancel 2016-02-05 01:18:54 +11:00
global.go Prepare to allow max conns per torrent to be configured 2016-07-05 16:23:17 +10:00
issue97_test.go Add test for issue #97 2016-07-12 16:42:54 +10:00
main_test.go Skeleton TestMain 2016-07-10 22:58:43 +10:00
misc.go Merge all our global consts and vars into global.go 2016-04-14 17:19:07 +10:00
misc_test.go Replace go-check with testify 2015-08-03 16:23:05 +10:00
pex.go Redo the compact peer types 2015-08-17 19:52:47 +10:00
pex_test.go Redo the compact peer types 2015-08-17 19:52:47 +10:00
piece.go refactor struct identifiers to follow conventional go names 2016-04-18 23:11:11 -05:00
piecestate.go Change the way piece state is exposed to give more detail 2015-06-01 18:22:12 +10:00
reader.go Improve the log message when piece reads fail 2016-07-10 23:01:17 +10:00
reader_test.go Also fix "context" in reader_test.go 2016-04-30 11:46:45 +10:00
t.go Move a few methods to Torrent, and track how many DHT announces occur 2016-06-15 15:29:47 +10:00
torrent.go Kick connections that contribute the final piece of missing metadata that fails to validate 2016-07-24 00:34:40 +10:00
torrent_stats.go Add counters for uploads 2016-07-05 15:52:33 +10:00
torrent_test.go Merge Torrent and torrent types 2016-04-03 18:40:43 +10:00
tracker_scraper.go Improve readability of tracker status line 2016-07-14 13:08:52 +10:00
worst_conns.go Add Torrent.SetMaxEstablishedConns 2016-07-06 00:42:16 +10:00

README.md

torrent

Join the chat at https://gitter.im/anacrolix/torrent Build Status GoDoc

This repository implements BitTorrent-related packages and command-line utilities in Go. The emphasis is on use as a library from other projects. It's been used 24/7 in production by a downstream, private service since late 2014.

There is support for protocol encryption, DHT, PEX, uTP, and various extensions. See the package documentation for a more complete list. There are several data storage backends provided: blob, file, and mmap, and you can write your own, such as to store data on S3, or in a database. You can use the provided binaries in ./cmd, or use torrent as a library for your own applications.

Many of the sub-packages can be used for other purposes: dht, bencode, and tracker, in particular.

Installation

Install the library package with go get github.com/anacrolix/torrent, or the provided cmds with go get github.com/anacrolix/torrent/cmd/....

Library example

There is a small example in the package documentation.

Other projects using Torrent

Commands

Here I'll describe what some of the provided commands in ./cmd do.

Note that the godo command which is invoked in the following examples builds and executes a Go import path, like go run. It's easier to use this convention than to spell out the install/invoke cycle for every single example.

torrent

Downloads torrents from the command-line. This first example does not use godo.

$ go get github.com/anacrolix/torrent/cmd/torrent
# Now 'torrent' should be in $GOPATH/bin, which should be in $PATH.
$ torrent 'magnet:?xt=urn:btih:KRWPCX3SJUM4IMM4YF5RPHL6ANPYTQPU'
ubuntu-14.04.2-desktop-amd64.iso [===================================================================>]  99% downloading (1.0 GB/1.0 GB)
2015/04/01 02:08:20 main.go:137: downloaded ALL the torrents
$ md5sum ubuntu-14.04.2-desktop-amd64.iso
1b305d585b1918f297164add46784116  ubuntu-14.04.2-desktop-amd64.iso
$ echo such amaze
wow

torrentfs

torrentfs mounts a FUSE filesystem at -mountDir. The contents are the torrents described by the torrent files and magnet links at -torrentPath. Data for read requests is fetched only as required from the torrent network, and stored at -downloadDir.

$ mkdir mnt torrents
$ godo github.com/anacrolix/torrent/cmd/torrentfs -mountDir mnt -torrentPath torrents &
$ cd torrents
$ wget http://releases.ubuntu.com/14.04.2/ubuntu-14.04.2-desktop-amd64.iso.torrent
$ cd ..
$ ls mnt
ubuntu-14.04.2-desktop-amd64.iso
$ pv mnt/ubuntu-14.04.2-desktop-amd64.iso | md5sum
996MB 0:04:40 [3.55MB/s] [========================================>] 100%
1b305d585b1918f297164add46784116  -

torrent-magnet

Creates a magnet link from a torrent file. Note the extracted trackers, display name, and info hash.

$ godo github.com/anacrolix/torrent/cmd/torrent-magnet < ubuntu-14.04.2-desktop-amd64.iso.torrent
magnet:?xt=urn:btih:546cf15f724d19c4319cc17b179d7e035f89c1f4&dn=ubuntu-14.04.2-desktop-amd64.iso&tr=http%3A%2F%2Ftorrent.ubuntu.com%3A6969%2Fannounce&tr=http%3A%2F%2Fipv6.torrent.ubuntu.com%3A6969%2Fannounce

dht-ping

Pings DHT nodes with the given network addresses.

$ godo ./cmd/dht-ping router.bittorrent.com:6881 router.utorrent.com:6881
2015/04/01 17:21:23 main.go:33: dht server on [::]:60058
32f54e697351ff4aec29cdbaabf2fbe3467cc267 (router.bittorrent.com:6881): 648.218621ms
ebff36697351ff4aec29cdbaabf2fbe3467cc267 (router.utorrent.com:6881): 873.864706ms
2/2 responses (100.000000%)