distribustream 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +18 -0
- data/README +5 -41
- data/bin/dsclient +23 -10
- data/bin/dstream +70 -7
- data/distribustream.gemspec +6 -6
- data/lib/pdtp/client.rb +35 -19
- data/lib/pdtp/client/callbacks.rb +18 -7
- data/lib/pdtp/client/connection.rb +31 -25
- data/lib/pdtp/client/file_buffer.rb +14 -2
- data/lib/pdtp/client/file_service.rb +17 -11
- data/lib/pdtp/client/http_client.rb +18 -19
- data/lib/pdtp/client/http_handler.rb +21 -11
- data/lib/pdtp/client/transfer.rb +29 -29
- data/lib/pdtp/common.rb +19 -4
- data/lib/pdtp/common/file_service.rb +14 -2
- data/lib/pdtp/common/http_server.rb +217 -0
- data/lib/pdtp/common/length_prefix_protocol.rb +14 -2
- data/lib/pdtp/common/protocol.rb +23 -16
- data/lib/pdtp/server.rb +101 -26
- data/lib/pdtp/server/client_info.rb +14 -2
- data/lib/pdtp/server/connection.rb +31 -9
- data/lib/pdtp/server/dispatcher.rb +37 -87
- data/lib/pdtp/server/file_service.rb +17 -2
- data/lib/pdtp/server/file_service_protocol.rb +23 -38
- data/lib/pdtp/server/status_handler.rb +103 -0
- data/lib/pdtp/server/transfer.rb +21 -9
- data/lib/pdtp/server/trust.rb +14 -2
- data/pdtp-specification.xml +831 -0
- metadata +8 -8
- data/bin/dsseed +0 -32
- data/lib/pdtp/common/common_init.rb +0 -122
- data/lib/pdtp/server/stats_handler.rb +0 -23
data/CHANGES
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
Version 0.3.0
|
2
|
+
* dsseed now factored into server.rb. Remote seeds will not be supported until
|
3
|
+
protocol changes can be made to support authenticating remote seeds, remote
|
4
|
+
file lookup, and remote hash checking.
|
5
|
+
|
6
|
+
* Switch to Kirk Haines' Evented Mongrel and remove all usage of threads from
|
7
|
+
the entire application
|
8
|
+
|
9
|
+
* Stats page relocated to /stats. This allows a single mongrel to operate for
|
10
|
+
both the file service and for the stats page.
|
11
|
+
|
12
|
+
* Remove common_init.rb and any dependency on the @@log and @@config variables
|
13
|
+
|
14
|
+
* Add logging facility to the server application to replace @@log. Similar
|
15
|
+
facilities should be added for clients.
|
16
|
+
|
17
|
+
* Refactor PDTP::Client and PDTP::Server APIs to support the above changes.
|
18
|
+
|
1
19
|
Version 0.2.1
|
2
20
|
* Switch HTTP client to use an EventMachine-based version, rather than net/http
|
3
21
|
|
data/README
CHANGED
@@ -3,14 +3,6 @@ Welcome to DistribuStream!
|
|
3
3
|
DistribuStream is a fully open peercasting system which allows on-demand
|
4
4
|
or live streaming media to be delivered at a fraction of the normal cost.
|
5
5
|
|
6
|
-
This README covers the initial public release, known issues, and a general
|
7
|
-
development roadmap.
|
8
|
-
|
9
|
-
Contents:
|
10
|
-
1. Usage
|
11
|
-
2. Known Issues
|
12
|
-
3. Development Roadmap
|
13
|
-
|
14
6
|
--
|
15
7
|
|
16
8
|
Usage:
|
@@ -34,22 +26,15 @@ Next, start the DistribuStream server:
|
|
34
26
|
|
35
27
|
dstream --conf myconfig.yml
|
36
28
|
|
37
|
-
|
38
|
-
the
|
29
|
+
You can think of the DistribuStream server like a regular web or FTP server.
|
30
|
+
It looks through the specified directory and makes the files underneath it
|
31
|
+
available to the peer-to-peer network.
|
39
32
|
|
40
33
|
You can see what's going on through the web interface, which runs one port
|
41
34
|
above the port you configured the server to listen on. If the server is
|
42
35
|
listening on the default port of 6086, you can reach the web interface at:
|
43
36
|
|
44
|
-
http://myserver.url:6087/
|
45
|
-
|
46
|
-
To populate the server with files, you need to attach the DistribuStream
|
47
|
-
seed. This works off of the same config file as the server, and must
|
48
|
-
be run on the same system:
|
49
|
-
|
50
|
-
dsseed --conf myconfig.yml
|
51
|
-
|
52
|
-
At this point your server is ready to go.
|
37
|
+
http://myserver.url:6087/stats
|
53
38
|
|
54
39
|
To test your server, use the DistribuStream client:
|
55
40
|
|
@@ -64,30 +49,9 @@ dsclient -o pdtp://myserver.url/file.ext | mediaplayer -
|
|
64
49
|
|
65
50
|
--
|
66
51
|
|
67
|
-
Known Issues:
|
68
|
-
|
69
|
-
Seeds are presently not authenticated in any way, thus anyone can attach
|
70
|
-
a seed and populate the server with any files of their choosing. However,
|
71
|
-
since file checksumming is done by the server itself, this means that only
|
72
|
-
seeds running on the same system as the server will actually work.
|
73
|
-
|
74
|
-
This will be resolved by either incorporating the seed directly into the
|
75
|
-
DistribuStream server, or adding both authentication and commands for
|
76
|
-
checksumming to the server <-> seed protocol.
|
77
|
-
|
78
|
-
--
|
79
|
-
|
80
52
|
Development Roadmap:
|
81
53
|
|
82
|
-
|
83
|
-
particularly well. These include the EventMachine Ruby gem, which provides
|
84
|
-
the I/O layer for the DistribuStream server, and the Mongrel web server, which
|
85
|
-
runs independently of EventMachine and uses threads.
|
86
|
-
|
87
|
-
Initial work will focus on converting the existing implementation to a fully
|
88
|
-
EventMachine-based approach which eliminates the use of threads.
|
89
|
-
|
90
|
-
Mid-term work will focus on improving the efficiency of peer-to-peer traffic
|
54
|
+
Short-term goals focus on improving the efficiency of peer-to-peer traffic
|
91
55
|
routing, by incorporating all of the following constraints:
|
92
56
|
|
93
57
|
1. Does the potential "giver" peer have chunks the "taker" peer is requesting?
|
data/bin/dsclient
CHANGED
@@ -21,12 +21,24 @@
|
|
21
21
|
|
22
22
|
#--
|
23
23
|
# Copyright (C) 2006-07 ClickCaster, Inc. (info@clickcaster.com)
|
24
|
-
#
|
24
|
+
#
|
25
|
+
# This program is free software: you can redistribute it and/or modify
|
26
|
+
# it under the terms of the GNU General Public License as published by
|
27
|
+
# the Free Software Foundation, either version 3 of the License, or
|
28
|
+
# (at your option) any later version.
|
29
|
+
#
|
30
|
+
# This program is distributed in the hope that it will be useful,
|
31
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
32
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
33
|
+
# GNU General Public License for more details.
|
34
|
+
#
|
35
|
+
# You should have received a copy of the GNU General Public License
|
36
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
25
37
|
#
|
26
38
|
# This source file is distributed as part of the
|
27
39
|
# DistribuStream file transfer system.
|
28
40
|
#
|
29
|
-
# See http://distribustream.
|
41
|
+
# See http://distribustream.org/
|
30
42
|
#++
|
31
43
|
|
32
44
|
require 'uri'
|
@@ -86,22 +98,23 @@ class Callbacks < PDTP::Client::Callbacks
|
|
86
98
|
attr_accessor :uri
|
87
99
|
attr_accessor :output
|
88
100
|
|
89
|
-
def
|
101
|
+
def initialize(uri, output)
|
102
|
+
@uri, @output = uri, output
|
103
|
+
end
|
104
|
+
|
105
|
+
def connected(client)
|
90
106
|
STDERR.write "Connected to #{uri.host}\n"
|
91
107
|
STDERR.write "Beginning transfer...\n"
|
92
108
|
|
93
109
|
# Begin fetching the file once we've connected
|
94
|
-
client.get uri.path, output
|
110
|
+
client.get @uri.path, @output
|
95
111
|
end
|
96
112
|
|
97
|
-
def disconnected
|
113
|
+
def disconnected(client)
|
98
114
|
STDERR.write "Disconnected from #{uri.host}\n"
|
99
115
|
client.stop
|
100
116
|
end
|
101
117
|
end
|
102
|
-
|
103
|
-
@@log = Logger.new(STDERR)
|
104
|
-
@@log.level=Logger::INFO
|
105
118
|
|
106
|
-
|
107
|
-
|
119
|
+
client = PDTP::Client.new uri.host, uri.port || 6086, :listen_port => listen_port
|
120
|
+
client.connect Callbacks, uri, output
|
data/bin/dstream
CHANGED
@@ -1,20 +1,83 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#--
|
3
3
|
# Copyright (C) 2006-07 ClickCaster, Inc. (info@clickcaster.com)
|
4
|
-
#
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
5
17
|
#
|
6
18
|
# This source file is distributed as part of the
|
7
19
|
# DistribuStream file transfer system.
|
8
20
|
#
|
9
|
-
# See http://distribustream.
|
21
|
+
# See http://distribustream.org/
|
10
22
|
#++
|
11
23
|
|
12
|
-
require
|
24
|
+
require 'optparse'
|
13
25
|
require File.dirname(__FILE__) + '/../lib/pdtp/server'
|
14
26
|
|
15
|
-
|
27
|
+
program_name = File.basename($0)
|
28
|
+
config_filename = nil
|
29
|
+
|
30
|
+
OptionParser.new do |opts|
|
31
|
+
opts.banner = "Usage: #{program_name} [options]"
|
32
|
+
opts.on("--config CONFIGFILE", "Load specified config file.") do |c|
|
33
|
+
config_filename = c
|
34
|
+
end
|
35
|
+
opts.on("--help", "Prints this usage info.") do
|
36
|
+
puts opts
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
end.parse!
|
40
|
+
|
41
|
+
config = {
|
42
|
+
:host => '0.0.0.0',
|
43
|
+
:port => 6086, #server port
|
44
|
+
:listen_port => 8000, #client listen port
|
45
|
+
:file_root => '.',
|
46
|
+
:chunk_size => 5000,
|
47
|
+
:quiet => true
|
48
|
+
}
|
49
|
+
|
50
|
+
if config_filename.nil?
|
51
|
+
puts "No config file specified. Using defaults."
|
52
|
+
else
|
53
|
+
begin
|
54
|
+
confstr = File.read(config_filename)
|
55
|
+
rescue
|
56
|
+
puts "Unable to open config file: #{config_filename}"
|
57
|
+
exit
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
new_config = YAML.load confstr
|
62
|
+
config.merge!(new_config)
|
63
|
+
config[:vhost] ||= config[:host] # Use host as vhost unless specified
|
64
|
+
rescue Exception => e
|
65
|
+
puts "Error parsing config file: #{config_filename}"
|
66
|
+
puts e
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
puts "#{program_name} starting. Run '#{program_name} --help' for more info."
|
72
|
+
|
73
|
+
server = PDTP::Server.new config[:host], config[:port]
|
74
|
+
|
75
|
+
STDERR.sync = true
|
76
|
+
logger = Logger.new STDERR
|
77
|
+
logger.datetime_format = "%H:%M:%S "
|
78
|
+
logger.level = Logger::INFO if config[:quiet]
|
16
79
|
|
17
|
-
server
|
18
|
-
server.
|
19
|
-
server.enable_file_service
|
80
|
+
server.enable_logging logger
|
81
|
+
server.enable_status_page
|
82
|
+
server.enable_file_service config[:file_root], :chunk_size => config[:chunk_size]
|
20
83
|
server.run
|
data/distribustream.gemspec
CHANGED
@@ -2,19 +2,19 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
GEMSPEC = Gem::Specification.new do |s|
|
4
4
|
s.name = "distribustream"
|
5
|
-
s.version = "0.
|
6
|
-
s.date = "2008-
|
5
|
+
s.version = "0.3.0"
|
6
|
+
s.date = "2008-11-09"
|
7
7
|
s.summary = "DistribuStream is a fully open peercasting system allowing on-demand or live streaming media to be delivered at a fraction of the normal cost"
|
8
8
|
s.email = "tony@clickcaster.com"
|
9
|
-
s.homepage = "http://distribustream.
|
9
|
+
s.homepage = "http://distribustream.org"
|
10
10
|
s.rubyforge_project = "distribustream"
|
11
11
|
s.has_rdoc = true
|
12
12
|
s.rdoc_options = ["--exclude", "definitions", "--exclude", "indexes"]
|
13
|
-
s.extra_rdoc_files = ["COPYING", "README", "CHANGES"]
|
13
|
+
s.extra_rdoc_files = ["COPYING", "README", "CHANGES", "pdtp-specification.xml"]
|
14
14
|
s.authors = ["Tony Arcieri", "Ashvin Mysore", "Galen Pahlke", "James Sanders", "Tom Stapleton"]
|
15
15
|
s.files = Dir.glob("{bin,lib,conf}/**/*") + ['Rakefile', 'distribustream.gemspec']
|
16
|
-
s.executables = %w{dstream
|
16
|
+
s.executables = %w{dstream dsclient}
|
17
17
|
s.add_dependency("eventmachine", ">= 0.9.0")
|
18
|
-
s.add_dependency("mongrel", ">= 1.0.
|
18
|
+
s.add_dependency("mongrel", ">= 1.0.2")
|
19
19
|
s.add_dependency("json", ">= 1.1.0")
|
20
20
|
end
|
data/lib/pdtp/client.rb
CHANGED
@@ -1,19 +1,31 @@
|
|
1
1
|
#--
|
2
2
|
# Copyright (C) 2006-07 ClickCaster, Inc. (info@clickcaster.com)
|
3
|
-
#
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
4
16
|
#
|
5
17
|
# This source file is distributed as part of the
|
6
18
|
# DistribuStream file transfer system.
|
7
19
|
#
|
8
|
-
# See http://distribustream.
|
20
|
+
# See http://distribustream.org/
|
9
21
|
#++
|
10
22
|
|
11
23
|
require 'rubygems'
|
12
24
|
require 'eventmachine'
|
13
|
-
require 'thread'
|
14
25
|
require 'digest/md5'
|
15
26
|
|
16
27
|
require File.dirname(__FILE__) + '/common'
|
28
|
+
require File.dirname(__FILE__) + '/common/http_server'
|
17
29
|
require File.dirname(__FILE__) + '/client/connection'
|
18
30
|
require File.dirname(__FILE__) + '/client/callbacks'
|
19
31
|
require File.dirname(__FILE__) + '/client/file_service'
|
@@ -23,10 +35,10 @@ module PDTP
|
|
23
35
|
# PDTP::Client provides an interface for accessing resources on PDTP servers
|
24
36
|
class Client
|
25
37
|
# None of these should be publically accessible, and will be factored away in time
|
26
|
-
attr_reader :connection, :client_id, :listen_port, :file_service, :transfers
|
38
|
+
attr_reader :connection, :client_id, :listen_port, :file_service, :transfers
|
27
39
|
|
28
40
|
# Create a PDTP::Client object for accessing the PDTP server at the given host and port
|
29
|
-
def initialize(host, port =
|
41
|
+
def initialize(host, port = PDTP::DEFAULT_PORT, options = {})
|
30
42
|
@host, @port = host, port
|
31
43
|
|
32
44
|
@listen_addr = options[:listen_addr] || '0.0.0.0'
|
@@ -34,45 +46,49 @@ module PDTP
|
|
34
46
|
|
35
47
|
@file_service = PDTP::Client::FileService.new
|
36
48
|
@transfers = []
|
37
|
-
@lock = Mutex.new
|
38
49
|
|
39
50
|
# Start a Mongrel server on the specified port. If it isnt available, keep trying higher ports
|
40
|
-
|
51
|
+
# FIXME: Evented Mongrel won't throw an exception if the port is unavailable. This needs to
|
52
|
+
# be dealt with through EventMachine
|
53
|
+
#begin
|
41
54
|
@http_server = Mongrel::HttpServer.new @listen_addr, @listen_port
|
42
|
-
rescue
|
43
|
-
|
44
|
-
|
45
|
-
end
|
55
|
+
#rescue
|
56
|
+
# @listen_port += 1
|
57
|
+
# retry
|
58
|
+
#end
|
46
59
|
|
47
60
|
@client_id = Digest::MD5.hexdigest "#{Time.now.to_f}#{$$}"
|
48
61
|
|
49
62
|
#@@log.info "listening on port #{@listen_port}"
|
50
63
|
@http_handler = HttpHandler.new(self)
|
51
64
|
@http_server.register '/', @http_handler
|
52
|
-
@http_server.run
|
53
65
|
end
|
54
66
|
|
55
67
|
# Connect to the PDTP server. This is a blocking call which runs the client event loop
|
56
|
-
def connect(callbacks = nil)
|
68
|
+
def connect(callbacks = nil, *args)
|
57
69
|
klass = if(callbacks and callbacks.is_a?(Class))
|
58
70
|
callbacks
|
59
71
|
else
|
60
72
|
Class.new(Callbacks) {callbacks and include callbacks}
|
61
73
|
end
|
62
74
|
|
75
|
+
arity = klass.instance_method(:initialize).arity
|
76
|
+
expected = arity >= 0 ? arity : -(arity + 1)
|
77
|
+
if (arity >= 0 and args.size != expected) or (arity < 0 and args.size < expected)
|
78
|
+
raise ArgumentError, "wrong number of arguments for #{klass}#initialize (#{args.size} for #{expected})"
|
79
|
+
end
|
80
|
+
|
63
81
|
# Run the EventMachine reactor loop
|
64
82
|
EventMachine.run do
|
83
|
+
@http_server.run_evented
|
84
|
+
|
65
85
|
EventMachine.connect(@host, @port, Connection) do |c|
|
66
86
|
# Store reference to the connection
|
67
87
|
@connection = c
|
68
88
|
|
69
89
|
# Set connection variables and configure callbacks
|
70
90
|
c.client = self
|
71
|
-
c.callbacks = klass.new
|
72
|
-
c.callbacks.client = self
|
73
|
-
|
74
|
-
# Allow users to populate instance variables in their callback class
|
75
|
-
yield c.callbacks if block_given?
|
91
|
+
c.callbacks = klass.new *args
|
76
92
|
end
|
77
93
|
|
78
94
|
#@@log.info "connecting with ev=#{EventMachine::VERSION}"
|
@@ -110,4 +126,4 @@ module PDTP
|
|
110
126
|
EventMachine.stop_event_loop
|
111
127
|
end
|
112
128
|
end
|
113
|
-
end
|
129
|
+
end
|
@@ -1,27 +1,38 @@
|
|
1
1
|
#--
|
2
2
|
# Copyright (C) 2006-07 ClickCaster, Inc. (info@clickcaster.com)
|
3
|
-
#
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
4
16
|
#
|
5
17
|
# This source file is distributed as part of the
|
6
18
|
# DistribuStream file transfer system.
|
7
19
|
#
|
8
|
-
# See http://distribustream.
|
20
|
+
# See http://distribustream.org/
|
9
21
|
#++
|
10
22
|
|
11
23
|
module PDTP
|
12
24
|
class Client
|
13
|
-
# Callbacks
|
25
|
+
# Callbacks which can be overridden by clients to handle events
|
14
26
|
class Callbacks
|
15
27
|
attr_accessor :client
|
16
28
|
|
17
|
-
def initialize(
|
18
|
-
@connection = connection
|
29
|
+
def initialize(*args)
|
19
30
|
end
|
20
31
|
|
21
|
-
def connected
|
32
|
+
def connected(client)
|
22
33
|
end
|
23
34
|
|
24
|
-
def disconnected
|
35
|
+
def disconnected(client)
|
25
36
|
client.stop
|
26
37
|
end
|
27
38
|
end
|
@@ -1,11 +1,23 @@
|
|
1
1
|
#--
|
2
2
|
# Copyright (C) 2006-07 ClickCaster, Inc. (info@clickcaster.com)
|
3
|
-
#
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
4
16
|
#
|
5
17
|
# This source file is distributed as part of the
|
6
18
|
# DistribuStream file transfer system.
|
7
19
|
#
|
8
|
-
# See http://distribustream.
|
20
|
+
# See http://distribustream.org/
|
9
21
|
#++
|
10
22
|
|
11
23
|
require 'rubygems'
|
@@ -32,13 +44,22 @@ module PDTP
|
|
32
44
|
:client_id => @client.client_id
|
33
45
|
)
|
34
46
|
|
35
|
-
callbacks.connected
|
47
|
+
callbacks.connected client
|
36
48
|
rescue Exception => e
|
37
49
|
puts "Exception in connection_completed: #{e}"
|
38
50
|
puts e.backtrace.join("\n")
|
39
51
|
exit
|
40
52
|
end
|
41
|
-
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Called when the connection to the server closes
|
56
|
+
def unbind
|
57
|
+
if callbacks
|
58
|
+
callbacks.disconnected client
|
59
|
+
else
|
60
|
+
puts "Disconnected from PDTP server"
|
61
|
+
end
|
62
|
+
end
|
42
63
|
|
43
64
|
# Called when any server message is received. This is the brains of
|
44
65
|
# the client's protocol handling.
|
@@ -60,17 +81,7 @@ module PDTP
|
|
60
81
|
|
61
82
|
transfer.run
|
62
83
|
|
63
|
-
|
64
|
-
|
65
|
-
# Run each transfer in its own thread and notify the server upon completion
|
66
|
-
#Thread.new(transfer) do |t|
|
67
|
-
# begin
|
68
|
-
# t.run
|
69
|
-
# rescue Exception=>e
|
70
|
-
# @@log.info("Exception in dispatch_message: " + e.exception + "\n" + e.backtrace.join("\n"))
|
71
|
-
# end
|
72
|
-
# t.send_completed_message(t.hash)
|
73
|
-
#end
|
84
|
+
##@@log.debug "TRANSFER STARTING"
|
74
85
|
when "tell_verify"
|
75
86
|
# We are a listener, and asked for verification of a transfer from a server.
|
76
87
|
# After asking for verification, we stopped running, and must be restarted
|
@@ -91,25 +102,20 @@ module PDTP
|
|
91
102
|
exit!
|
92
103
|
end
|
93
104
|
when "hash_verify"
|
94
|
-
|
105
|
+
#@@log.debug "Hash verified for url=#{message["url"]} range=#{message["range"]} hash_ok=#{message["hash_ok"]}"
|
95
106
|
when "protocol_error", "protocol_warn" #ignore
|
96
107
|
else raise "Server sent an unknown message type: #{command} "
|
97
108
|
end
|
98
109
|
end
|
99
|
-
|
100
|
-
def unbind
|
101
|
-
super
|
102
|
-
puts 'Disconnected from PDTP server.'
|
103
|
-
end
|
104
110
|
|
105
|
-
#Prints the number of transfers associated with this client
|
111
|
+
# Prints the number of transfers associated with this client
|
106
112
|
def print_stats
|
107
|
-
|
113
|
+
#@@log.debug "client: num_transfers=#{@client.transfers.size}"
|
108
114
|
end
|
109
115
|
|
110
|
-
#
|
116
|
+
# Transfers to report themselves finished
|
111
117
|
def finished(transfer)
|
112
|
-
@client.
|
118
|
+
@client.transfers.delete(transfer)
|
113
119
|
end
|
114
120
|
end
|
115
121
|
end
|