xmlrpclib.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 1,017 行 · 第 1/3 页

PY
1,017
字号
        self.append(value)    dispatch["dateTime.iso8601"] = end_dateTime    def end_value(self, data):        # if we stumble upon an value element with no internal        # elements, treat it as a string element        if self._value:            self.end_string(data)    dispatch["value"] = end_value    def end_params(self, data):        self._type = "params"    dispatch["params"] = end_params    def end_fault(self, data):        self._type = "fault"    dispatch["fault"] = end_fault    def end_methodName(self, data):        if self._encoding:            data = _decode(data, self._encoding)        self._methodname = data        self._type = "methodName" # no params    dispatch["methodName"] = end_methodName# --------------------------------------------------------------------# convenience functionsdef getparser():    """getparser() -> parser, unmarshaller    Create an instance of the fastest available parser, and attach it    to an unmarshalling object.  Return both objects.    """    if FastParser and FastUnmarshaller:        target = FastUnmarshaller(True, False, binary, datetime)        parser = FastParser(target)    else:        target = Unmarshaller()        if FastParser:            parser = FastParser(target)        elif SgmlopParser:            parser = SgmlopParser(target)        elif ExpatParser:            parser = ExpatParser(target)        else:            parser = SlowParser(target)    return parser, targetdef dumps(params, methodname=None, methodresponse=None, encoding=None):    """data [,options] -> marshalled data    Convert an argument tuple or a Fault instance to an XML-RPC    request (or response, if the methodresponse option is used).    In addition to the data object, the following options can be given    as keyword arguments:        methodname: the method name for a methodCall packet        methodresponse: true to create a methodResponse packet.        If this option is used with a tuple, the tuple must be        a singleton (i.e. it can contain only one element).        encoding: the packet encoding (default is UTF-8)    All 8-bit strings in the data structure are assumed to use the    packet encoding.  Unicode strings are automatically converted,    where necessary.    """    assert isinstance(params, TupleType) or isinstance(params, Fault),\           "argument must be tuple or Fault instance"    if isinstance(params, Fault):        methodresponse = 1    elif methodresponse and isinstance(params, TupleType):        assert len(params) == 1, "response tuple must be a singleton"    if not encoding:        encoding = "utf-8"    m = Marshaller(encoding)    data = m.dumps(params)    if encoding != "utf-8":        xmlheader = "<?xml version='1.0' encoding=%s?>\n" % repr(encoding)    else:        xmlheader = "<?xml version='1.0'?>\n" # utf-8 is default    # standard XML-RPC wrappings    if methodname:        # a method call        if not isinstance(methodname, StringType):            methodname = methodname.encode(encoding)        data = (            xmlheader,            "<methodCall>\n"            "<methodName>", methodname, "</methodName>\n",            data,            "</methodCall>\n"            )    elif methodresponse:        # a method response, or a fault structure        data = (            xmlheader,            "<methodResponse>\n",            data,            "</methodResponse>\n"            )    else:        return data # return as is    return string.join(data, "")def loads(data):    """data -> unmarshalled data, method name    Convert an XML-RPC packet to unmarshalled data plus a method    name (None if not present).    If the XML-RPC packet represents a fault condition, this function    raises a Fault exception.    """    p, u = getparser()    p.feed(data)    p.close()    return u.close(), u.getmethodname()# --------------------------------------------------------------------# request dispatcherclass _Method:    # some magic to bind an XML-RPC method to an RPC server.    # supports "nested" methods (e.g. examples.getStateName)    def __init__(self, send, name):        self.__send = send        self.__name = name    def __getattr__(self, name):        return _Method(self.__send, "%s.%s" % (self.__name, name))    def __call__(self, *args):        return self.__send(self.__name, args)class Transport:    """Handles an HTTP transaction to an XML-RPC server."""    # client identifier (may be overridden)    user_agent = "xmlrpclib.py/%s (by www.pythonware.com)" % __version__    def request(self, host, handler, request_body, verbose=0):        # issue XML-RPC request        h = self.make_connection(host)        if verbose:            h.set_debuglevel(1)        self.send_request(h, handler, request_body)        self.send_host(h, host)        self.send_user_agent(h)        self.send_content(h, request_body)        errcode, errmsg, headers = h.getreply()        if errcode != 200:            raise ProtocolError(                host + handler,                errcode, errmsg,                headers                )        self.verbose = verbose        return self.parse_response(h.getfile())    def getparser(self):        # get parser and unmarshaller        return getparser()    def make_connection(self, host):        # create a HTTP connection object from a host descriptor        import httplib        return httplib.HTTP(host)    def send_request(self, connection, handler, request_body):        connection.putrequest("POST", handler)    def send_host(self, connection, host):        connection.putheader("Host", host)    def send_user_agent(self, connection):        connection.putheader("User-Agent", self.user_agent)    def send_content(self, connection, request_body):        connection.putheader("Content-Type", "text/xml")        connection.putheader("Content-Length", str(len(request_body)))        connection.endheaders()        if request_body:            connection.send(request_body)    def parse_response(self, f):        # read response from input file, and parse it        p, u = self.getparser()        while 1:            response = f.read(1024)            if not response:                break            if self.verbose:                print "body:", repr(response)            p.feed(response)        f.close()        p.close()        return u.close()class SafeTransport(Transport):    """Handles an HTTPS transaction to an XML-RPC server."""    def make_connection(self, host):        # create a HTTPS connection object from a host descriptor        # host may be a string, or a (host, x509-dict) tuple        import httplib        if isinstance(host, TupleType):            host, x509 = host        else:            x509 = {}        try:            HTTPS = httplib.HTTPS        except AttributeError:            raise NotImplementedError,\                  "your version of httplib doesn't support HTTPS"        else:            return apply(HTTPS, (host, None), x509)    def send_host(self, connection, host):        if isinstance(host, TupleType):            host, x509 = host        connection.putheader("Host", host)class ServerProxy:    """uri [,options] -> a logical connection to an XML-RPC server    uri is the connection point on the server, given as    scheme://host/target.    The standard implementation always supports the "http" scheme.  If    SSL socket support is available (Python 2.0), it also supports    "https".    If the target part and the slash preceding it are both omitted,    "/RPC2" is assumed.    The following options can be given as keyword arguments:        transport: a transport factory        encoding: the request encoding (default is UTF-8)    All 8-bit strings passed to the server proxy are assumed to use    the given encoding.    """    def __init__(self, uri, transport=None, encoding=None, verbose=0):        # establish a "logical" server connection        # get the url        import urllib        type, uri = urllib.splittype(uri)        if type not in ("http", "https"):            raise IOError, "unsupported XML-RPC protocol"        self.__host, self.__handler = urllib.splithost(uri)        if not self.__handler:            self.__handler = "/RPC2"        if transport is None:            if type == "https":                transport = SafeTransport()            else:                transport = Transport()        self.__transport = transport        self.__encoding = encoding        self.__verbose = verbose    def __request(self, methodname, params):        # call a method on the remote server        request = dumps(params, methodname, encoding=self.__encoding)        response = self.__transport.request(            self.__host,            self.__handler,            request,            verbose=self.__verbose            )        if len(response) == 1:            response = response[0]        return response    def __repr__(self):        return (            "<ServerProxy for %s%s>" %            (self.__host, self.__handler)            )    __str__ = __repr__    def __getattr__(self, name):        # magic method dispatcher        return _Method(self.__request, name)    # note: to call a remote object with an non-standard name, use    # result getattr(server, "strange-python-name")(args)# compatibilityServer = ServerProxy# --------------------------------------------------------------------# test codeif __name__ == "__main__":    # simple test program (from the XML-RPC specification)    # server = ServerProxy("http://localhost:8000") # local server    server = ServerProxy("http://betty.userland.com")    print server    try:        print server.examples.getStateName(41)    except Error, v:        print "ERROR", v

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?