File:  [Repository] / VSyncer / xmlrpclibBasicAuth.py
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Wed Jan 2 19:01:35 2008 UTC (16 years, 4 months ago) by casties
Branches: MAIN
CVS tags: HEAD
first checking of modified SourceSyncer

# 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>