[Continues: Ruby xml-talking to rtorrent]
I have rewritten how i changed the socket in XMLRPC are modified in a more Ruby style way.
A new class, in XMLRPC module, called ClientS (in a file called xmlrpcs.rb). It is a subclass of the Client class to ease the implementation of other kind of trasport system if the Net::HTTP based one doesn’t fit your needs.
require 'xmlrpc/client'
class XMLRPC::ClientS < XMLRPC::Client
def initialize(info)
@info = info
end
private
# create new socket
def new_socket(info,async)
raise "Must be subclassed"
end
# write xmlrpc request in the previously created socket
def write_request(socket,request)
if socket.write(request) != request.length then
raise "Not all the data has been sent"
end
end
# read response from the socket
def read_response(socket)
socket.read()
end
# do_rpc working with custom sockets
def do_rpc( request, async )
sock = new_socket(@info,async)
write_request(sock,request)
return read_response(sock)
end
end
end
This makes it very simple to extend the class by just subclassing ClientS or just redefining the function new_socket.
To avoid to close the socket at each request, which may be not the right choice for every code, you can redefine the do_rpc
The info field is used to pass some arguments to create the socket, for instance
require 'xmlrpcs'
require 'socket'
class XMLClient < XMLRPC::ClientS
def new_socket( info, async )
UNIXSocket.new(info)
end
end
c=XMLClient.new("/path/to/sock")
c.call(..)
The code can be found in the code page
[Continued by: XMLRPCs gem published]
Posted by Dario Meloni