1: # Thanks Amos and Chris at DC
2: # http://www.zope.org/Members/Amos/XML-RPC
3:
4: # path to xmlrpclib, works fine in Zope but when running from the command line
5: # seems to fail. Annoying.
6: # import sys
7: # sys.path.insert(0, r'd:\XMLTest1\lib\python')
8:
9: import string, xmlrpclib, httplib
10: from base64 import encodestring
11:
12: def Server(url, username, password):
13: t = BasicAuthTransport(username, password)
14: return xmlrpclib.Server(url, t)
15:
16: class BasicAuthTransport(xmlrpclib.Transport):
17: def __init__(self, username=None, password=None):
18: self.username = username
19: self.password = password
20: self.verbose = None
21: self.has_ssl = httplib.__dict__.has_key("HTTPConnection")
22:
23: def request(self, host, handler, request_body, verbose=None):
24: # issue XML-RPC request
25: if self.has_ssl:
26: if host.startswith("https:"): h = httplib.HTTPSConnection(host)
27: else: h = httplib.HTTPConnection(host)
28: else: h = httplib.HTTP(host)
29:
30: h.putrequest("POST", handler)
31:
32: # required by HTTP/1.1
33: if not self.has_ssl: # HTTPConnection already does 1.1
34: h.putheader("Host", host)
35: h.putheader("Connection", "close")
36:
37: # required by XML-RPC
38: h.putheader("User-Agent", self.user_agent)
39: h.putheader("Content-Type", "text/xml")
40: h.putheader("Content-Length", str(len(request_body)))
41:
42: # basic auth
43: if self.username is not None and self.password is not None:
44: h.putheader("AUTHORIZATION", "Basic %s" % string.replace(
45: encodestring("%s:%s" % (self.username, self.password)),
46: "\012", ""))
47: h.endheaders()
48:
49: if request_body: h.send(request_body)
50: if self.has_ssl:
51: response = h.getresponse()
52: if response.status != 200:
53: raise xmlrpclib.ProtocolError(host + handler,
54: response.status,
55: response.reason,
56: response.msg)
57: file = response.fp
58: else:
59: errcode, errmsg, headers = h.getreply()
60: if errcode != 200:
61: raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg, headers)
62:
63: file = h.getfile()
64:
65: return self.parse_response(file)
66:
67: if __name__=='__main__':
68: pass
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>