# Thanks Amos and Chris at DC
# http://www.zope.org/Members/Amos/XML-RPC
# path to xmlrpclib, works fine in Zope but when running from the command line
# seems to fail. Annoying.
# import sys
# sys.path.insert(0, r'd:\XMLTest1\lib\python')
import string, xmlrpclib, httplib
from base64 import encodestring
def Server(url, username, password):
t = BasicAuthTransport(username, password)
return xmlrpclib.Server(url, t)
class BasicAuthTransport(xmlrpclib.Transport):
def __init__(self, username=None, password=None):
self.username = username
self.password = password
self.verbose = None
self.has_ssl = httplib.__dict__.has_key("HTTPConnection")
def request(self, host, handler, request_body, verbose=None):
# issue XML-RPC request
if self.has_ssl:
if host.startswith("https:"): h = httplib.HTTPSConnection(host)
else: h = httplib.HTTPConnection(host)
else: h = httplib.HTTP(host)
h.putrequest("POST", handler)
# required by HTTP/1.1
if not self.has_ssl: # HTTPConnection already does 1.1
h.putheader("Host", host)
h.putheader("Connection", "close")
# required by XML-RPC
h.putheader("User-Agent", self.user_agent)
h.putheader("Content-Type", "text/xml")
h.putheader("Content-Length", str(len(request_body)))
# basic auth
if self.username is not None and self.password is not None:
h.putheader("AUTHORIZATION", "Basic %s" % string.replace(
encodestring("%s:%s" % (self.username, self.password)),
"\012", ""))
h.endheaders()
if request_body: h.send(request_body)
if self.has_ssl:
response = h.getresponse()
if response.status != 200:
raise xmlrpclib.ProtocolError(host + handler,
response.status,
response.reason,
response.msg)
file = response.fp
else:
errcode, errmsg, headers = h.getreply()
if errcode != 200:
raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg, headers)
file = h.getfile()
return self.parse_response(file)
if __name__=='__main__':
pass
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>