# 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