[Rubyfreenet] r9287 - in trunk/apps/rubyFreenet: . freenet/f…

Top Page
Delete this message
Reply to this message
Author: sitharus
Date:  
To: rubyfreenet
Subject: [Rubyfreenet] r9287 - in trunk/apps/rubyFreenet: . freenet/fcp freenet/tests rqueue
Author: sitharus
Date: 2006-06-18 06:17:43 +0000 (Sun, 18 Jun 2006)
New Revision: 9287

Added:
trunk/apps/rubyFreenet/rqueue/
trunk/apps/rubyFreenet/rqueue/rqueue
Modified:
trunk/apps/rubyFreenet/Rakefile
trunk/apps/rubyFreenet/freenet/fcp/client.rb
trunk/apps/rubyFreenet/freenet/fcp/message.rb
trunk/apps/rubyFreenet/freenet/tests/client_tests.rb
trunk/apps/rubyFreenet/freenet/tests/message_tests.rb
Log:
Numerous bug fixes
Added rqueue, a basic console-based queue downloaded. Run it and paste freenet URIs in and it'll get them. Data is stored on the global queue.


Modified: trunk/apps/rubyFreenet/Rakefile
===================================================================
--- trunk/apps/rubyFreenet/Rakefile    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/Rakefile    2006-06-18 06:17:43 UTC (rev 9287)
@@ -2,4 +2,6 @@
task :test do
require 'test/unit'
require 'freenet/tests/uri_tests'
+ require 'freenet/tests/message_tests'
+ require 'freenet/tests/client_tests'
end
\ No newline at end of file

Modified: trunk/apps/rubyFreenet/freenet/fcp/client.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/fcp/client.rb    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/freenet/fcp/client.rb    2006-06-18 06:17:43 UTC (rev 9287)
@@ -104,12 +104,35 @@
@lock.synchronize do
log(INFO, "Connecting to #{@server}:#{@port}")
@socket = TCPSocket.open(@server, @port)
+ class << @socket
+ alias_method :old_write, :write
+ alias_method :old_readline, :readline
+ def logger=(logger)
+ @logger = logger
+ end
+
+ def log(severity, message)
+ @logger.add(severity, message)
+ end
+
+ def write(str)
+ log(::Logger::Severity::DEBUG, "Writing: #{str.strip}")
+ old_write(str)
+ end
+
+ def readline
+ line = old_readline
+ log(::Logger::Severity::DEBUG, "Reading: #{line.strip}")
+ line
+ end
+ end
+ @socket.logger = @logger
@running = true
@socket_thread = Thread.new {socket_thread}
log(DEBUG, "Running thread")
end
- rescue
- raise FCPConnectionError.new('Connection failed')
+ #rescue
+ #raise FCPConnectionError.new('Connection failed')
end

# Get the worker thread to disconnect. Doesn't guarantee immediate disconnection
@@ -182,12 +205,12 @@
'PriorityClass'=>1,
'Persistence'=>'reboot',
'Global'=>false}.merge(options || {})
- options['Persistence'] = 'connection' unless async
+ options['Persistence'] = 'connection' if block
options['URI'] = uri
message = Message.new('ClientGet', nil, options, callback)
log(INFO, "#{message.identifier} GET queued")
send(message)
- block_message(message, block)
+ block_message(message, block, &callback)
end

# === Put data in to freenet
@@ -218,13 +241,13 @@
'MaxRetries' => 10,
'Persistence' => 'reboot',
'UploadFrom' => 'direct'}.merge(options || {})
- options['Persistence'] = 'connection' unless async
+ options['Persistence'] = 'connection' if block
options['URI'] = uri
message = Message.new('ClientPut', data, options, callback)
message.content_type = options['Metadata.ContentType']
log(INFO, "#{message.identifier} PUT queued")
send(message)
- block_message(message, block)
+ block_message(message, block, &callback)
end

# Upload a directory to a key, either SSK or USK. This directory must be local to the
@@ -237,28 +260,33 @@
'DefaultName' => 'index.html',
'Filename' => dir.to_s,
'AllowUnreadableFiles' => 'true'}.merge(options || {})
- options['Persistence'] = 'connection' unless async
+ options['Persistence'] = 'connection' if block
options['URI'] = uri
message = Message.new('ClientPutDiskDir', nil, options, callback)
log(INFO, "#{message.identifier} PUTDIR queued")
send(message)
- block_message(message, block)
+ block_message(message, block, &callback)
end

# Get the request status for a persistent request. Not useful in synchronous systems.
#
# Any replies will be directed to the async message's callback
- def request_status(identifier, global, async=false)
+ def request_status(identifier, global, only_data=true, block=true, &callback)
log(DEBUG, 'Requesting status')
- message = Message.new('GetRequestStatus', nil, 'Identifier'=>identifier, 'Global'=>global)
+ message = Message.new('GetRequestStatus', nil, 'Identifier'=>identifier, 'Global'=>global, 'OnlyData'=>only_data)
send(message)
- message.wait_for_response
+ block_message(message, block, &callback)
end
+
+ def watch_global(enabled=true, verbosity=1)
+ message = Message.new('WatchGlobal', nil, 'Enabled'=>enabled, 'VerbosityMask'=>verbosity)
+ send(message)
+ end

# Private calls
private

- def block_message(message, block)
+ def block_message(message, block, &callback)
unless block
message
else
@@ -267,10 +295,11 @@
message.wait_for_response
message.lock
message.response.lock
- callback(message.status, message, message.response)
+ callback.call(message.status, message, message.response)
message.response.unlock
message.unlock
rescue RequestFinished => e
+ message.response.unlock
message.unlock
end
end
@@ -351,7 +380,7 @@
end
end
rescue Exception => e
- log(FATAL, "Exception in socket thread: #{e.class}: #{e.message}")
+ log(FATAL, "Exception in socket thread: #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
raise e
ensure
@socket.close
@@ -365,6 +394,7 @@
original_message = @messages[message.identifier]
if original_message
status = message.status
+ log(DEBUG, "Message found: #{original_message.type}. #{original_message.callback?} :#{status}")
original_message.reply = message
if original_message.callback?
thread = Thread.new do
@@ -373,10 +403,11 @@
original_message.callback(status)
case status
when :found
+ log(INFO, 'Data found, requesting status')
original_message.content_type = message.items['Metadata.ContentType']
if original_message.items['Persistence'] != 'connection' and not original_message.data_found
original_message.data_found = true
- request_status(message.identifier, message.items['Global'] || false, true)
+ request_status(original_message.identifier, original_message.items['Global'] || false, true, false)
end
when :failed
if message.items['Fatal'] == 'false'
@@ -395,7 +426,7 @@
@callback_threads << thread
end
else
- log(WARN, 'Got a message for an unknown identifier. Did you forget to reload persistent requests?')
+ log(WARN, "Got a message for an unknown identifier: #{message.identifier}. Did you forget to reload persistent requests?")
end
else
log(DEBUG, 'Got message with no identifier')
@@ -412,6 +443,7 @@
def send_message(message)
raise FCPConnectionError.new('Socket does not exist') unless @socket
@messages[message.identifier] ||= message
+ log(DEBUG, "Writing #{message.type}")
unless message.load_only
message.write(@socket)
end
@@ -423,7 +455,9 @@
# raises FCPConnectionError if socket isn't connected
def read_message
raise FCPConnectionError.new('Socket does not exist') unless @socket
- return Message.read(@socket)
+ message = Message.read(@socket)
+ log(DEBUG, "Read #{message.type}")
+ message
end
end
end

Modified: trunk/apps/rubyFreenet/freenet/fcp/message.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/fcp/message.rb    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/freenet/fcp/message.rb    2006-06-18 06:17:43 UTC (rev 9287)
@@ -96,55 +96,39 @@
# This could be handled internally, I haven't decided yet.
# [:failed] The request has fatally failed
# [:error] An error in the FCP messages occured. This is caused by a bug in rubyFreenet
- def status(message)
- case message.type
- when 'SSKKeypair'
- original_message.callback(:keypair)
- when 'AllData'
- original_message.callback(:finished)
- when 'PersistentGet'
- original_message.callback(:pending)
- when 'SimpleProgress'
- original_message.callback(:progress)
- when 'ProtocolError'
- original_message.callback(:failed)
- when 'URIGenerated'
- original_message.callback(:uri_generated)
- when 'PutSuccessful'
- original_message.callback(:finished)
- when 'PutFailed'
- original_message.callback(:failed)
- when 'ProtocolError'
- original_message.callback(:error)
- when 'DataFound'
- original_message.callback(:found)
+ def status
+ case @type
+ when 'SSKKeypair': :keypair
+ when 'AllData': :finished
+ when 'PersistentGet': :pending
+ when 'SimpleProgress': :progress
+ when 'ProtocolError': :failed
+ when 'URIGenerated': :uri_generated
+ when 'PutSuccessful': :finished
+ when 'PutFailed': :failed
+ when 'ProtocolError': :error
+ when 'DataFound': :found
when 'GetFailed'
- if message.items['RedirectURI']
- original_message.callback(:redirect)
+ if message.items['RedirectURI']: :redirect
elsif message.items['Fatal'] == 'false'
case message.items['Code']
when '15' # Node overloaded. Wait then re-request. We can re-use the ID as GetFailed removes the ID from FRED
- if original_message.retries < 5
- original_message.callback(:retrying)
- else
- original_message.callback(:failed)
+ if original_message.retries < 5: :retrying
+ else :failed
end
- else
- original_message.callback(:failed)
+ else :failed
end
- else
- original_message.callback(:failed)
+ else :failed
end
end
end

# Write this object to an FCP stream.
def write(stream)
- stream.write(type+"\n")
+ stream.write(type.strip+"\n")
items.each do |key, value|
- stream.write("#{key}=#{value}\n")
+ stream.write("#{key}=#{value.to_s.strip}\n")
end
-
if data
stream.write("DataLength=#{data.length}\n")
stream.write("Data\n")
@@ -175,7 +159,6 @@
type = line if type == nil
end
end
- puts "Read #{type}"
return Message.new(type, data, items)
end
end

Modified: trunk/apps/rubyFreenet/freenet/tests/client_tests.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/tests/client_tests.rb    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/freenet/tests/client_tests.rb    2006-06-18 06:17:43 UTC (rev 9287)
@@ -1,3 +1,4 @@
class ClientTests < Test::Unit::TestCase
-
+ def test_callback
+ end
end
\ No newline at end of file

Modified: trunk/apps/rubyFreenet/freenet/tests/message_tests.rb
===================================================================
--- trunk/apps/rubyFreenet/freenet/tests/message_tests.rb    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/freenet/tests/message_tests.rb    2006-06-18 06:17:43 UTC (rev 9287)
@@ -1,12 +1,20 @@
+require 'stringio'
+
class MessageTests < Test::Unit::TestCase
+ # Check that a message is written in the correct format with an identifier
def test_write_message
m = Freenet::FCP::Message.new('TestMessage', nil, 'Item1' => 'Item1Value', 'Item2' => 'Item2Value')
s = StringIO.new
m.write(s)
- assert_equal('TestMessage', s.readline)
-
+ s.rewind
+ assert_equal('TestMessage', s.readline.strip)
+ 3.times do
+ assert(['Item1=Item1Value', 'Item2=Item2Value', "Identifier=#{m.identifier}"].include? s.readline.strip)
+ end
+ assert_equal('EndMessage',s.readline.strip)
end

+ # Check that a message writes data properly
def test_write_data
end
end
\ No newline at end of file

Added: trunk/apps/rubyFreenet/rqueue/rqueue
===================================================================
--- trunk/apps/rubyFreenet/rqueue/rqueue    2006-06-18 05:30:49 UTC (rev 9286)
+++ trunk/apps/rubyFreenet/rqueue/rqueue    2006-06-18 06:17:43 UTC (rev 9287)
@@ -0,0 +1,44 @@
+#!/usr/bin/ruby
+
+require '../freenet'
+puts 'Connecting to node, please wait...'
+client = Freenet::FCP::Client.new
+client.watch_global
+puts 'Client connected'
+loop do
+ command = STDIN.readline
+ case command.strip
+ when 'exit', 'quit'
+ exit 0
+ else
+ begin
+ u = Freenet::URI.new(command)
+
+ client.get(u, false, 'Persistence'=>'reboot', 'Global'=>'true', 'Verbosity'=>'1') do |status, request, response|
+ puts status
+ case status
+ when :finished
+ puts 'Data finished'
+ if u.path
+ path = u.path.gsub('/','_').strip
+ path = 'download_'+random(100000).to_s if path == ''
+ File.open(path, 'w') do |f|
+ f.write(response.data)
+ end
+ end
+ raise Freenet::FCP::RequestFinished.new
+ when :failed
+ raise Freenet::FCP::RequestFinished.new
+ when :error
+ puts response
+ raise Freenet::FCP::RequestFinished.new
+ when :status
+ puts response.items
+ end
+ puts 'Callback finished'
+ end
+ rescue Freenet::URIError => e
+ puts 'Invalid URI'
+ end
+ end
+end
\ No newline at end of file


Property changes on: trunk/apps/rubyFreenet/rqueue/rqueue
___________________________________________________________________
Name: svn:executable
   + *