xmlrpclib.py

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

PY
1,017
字号
## XML-RPC CLIENT LIBRARY# $Id: xmlrpclib.py,v 1.1 2005/10/28 23:47:47 kuzman Exp $## an XML-RPC client interface for Python.## the marshalling and response parser code can also be used to# implement XML-RPC servers.## Notes:# this version is designed to work with Python 1.5.2 or newer.# unicode encoding support requires at least Python 1.6.# experimental HTTPS requires Python 2.0 built with SSL sockets.# expat parser support requires Python 2.0 with pyexpat support.## History:# 1999-01-14 fl  Created# 1999-01-15 fl  Changed dateTime to use localtime# 1999-01-16 fl  Added Binary/base64 element, default to RPC2 service# 1999-01-19 fl  Fixed array data element (from Skip Montanaro)# 1999-01-21 fl  Fixed dateTime constructor, etc.# 1999-02-02 fl  Added fault handling, handle empty sequences, etc.# 1999-02-10 fl  Fixed problem with empty responses (from Skip Montanaro)# 1999-06-20 fl  Speed improvements, pluggable parsers/transports (0.9.8)# 2000-11-28 fl  Changed boolean to check the truth value of its argument# 2001-02-24 fl  Added encoding/Unicode/SafeTransport patches# 2001-02-26 fl  Added compare support to wrappers (0.9.9/1.0b1)# 2001-03-28 fl  Make sure response tuple is a singleton# 2001-03-29 fl  Don't require empty params element (from Nicholas Riley)# 2001-06-10 fl  Folded in _xmlrpclib accelerator support (1.0b2)# 2001-08-20 fl  Base xmlrpclib.Error on built-in Exception (from Paul Prescod)# 2001-09-03 fl  Allow Transport subclass to override getparser# 2001-09-10 fl  Lazy import of urllib, cgi, xmllib (20x import speedup)# 2001-10-01 fl  Remove containers from memo cache when done with them# 2001-10-01 fl  Use faster escape method (80% dumps speedup)# 2001-10-10 sm  Allow long ints to be passed as ints if they don't overflow# 2001-10-17 sm  test for int and long overflow (allows use on 64-bit systems)# 2001-11-12 fl  Use repr() to marshal doubles (from Paul Felix)## Copyright (c) 1999-2001 by Secret Labs AB.# Copyright (c) 1999-2001 by Fredrik Lundh.## info@pythonware.com# http://www.pythonware.com## --------------------------------------------------------------------# The XML-RPC client interface is## Copyright (c) 1999-2001 by Secret Labs AB# Copyright (c) 1999-2001 by Fredrik Lundh## By obtaining, using, and/or copying this software and/or its# associated documentation, you agree that you have read, understood,# and will comply with the following terms and conditions:## Permission to use, copy, modify, and distribute this software and# its associated documentation for any purpose and without fee is# hereby granted, provided that the above copyright notice appears in# all copies, and that both that copyright notice and this permission# notice appear in supporting documentation, and that the name of# Secret Labs AB or the author not be used in advertising or publicity# pertaining to distribution of the software without specific, written# prior permission.## SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-# ABILITY AND FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE# OF THIS SOFTWARE.# --------------------------------------------------------------------## things to look into:# TODO: support basic authentication (see robin's patch)# TODO: fix host tuple handling in the server constructor# TODO: let transport verify schemes# TODO: update documentation# TODO: authentication plugins"""An XML-RPC client interface for Python.The marshalling and response parser code can also be used toimplement XML-RPC servers.Exported exceptions:  Error          Base class for client errors  ProtocolError  Indicates an HTTP protocol error  ResponseError  Indicates a broken response package  Fault          Indicates an XML-RPC fault packageExported classes:  ServerProxy    Represents a logical connection to an XML-RPC server  Boolean        boolean wrapper to generate a "boolean" XML-RPC value  DateTime       dateTime wrapper for an ISO 8601 string or time tuple or                 localtime integer value to generate a "dateTime.iso8601"                 XML-RPC value  Binary         binary data wrapper  SlowParser     Slow but safe standard parser (based on xmllib)  Marshaller     Generate an XML-RPC params chunk from a Python data structure  Unmarshaller   Unmarshal an XML-RPC response from incoming XML event message  Transport      Handles an HTTP transaction to an XML-RPC server  SafeTransport  Handles an HTTPS transaction to an XML-RPC serverExported constants:  True  FalseExported functions:  boolean        Convert any Python value to an XML-RPC boolean  getparser      Create instance of the fastest available parser & attach                 to an unmarshalling object  dumps          Convert an argument tuple or a Fault instance to an XML-RPC                 request (or response, if the methodresponse option is used).  loads          Convert an XML-RPC packet to unmarshalled data plus a method                 name (None if not present)."""import re, string, time, operatorfrom types import *try:    unicodeexcept NameError:    unicode = None # unicode support not availabledef _decode(data, encoding, is8bit=re.compile("[\x80-\xff]").search):    # decode non-ascii string (if possible)    if unicode and encoding and is8bit(data):        data = unicode(data, encoding)    return datadef escape(s, replace=string.replace):    s = replace(s, "&", "&amp;")    s = replace(s, "<", "&lt;")    return replace(s, ">", "&gt;",)MAXINT =  2L**31-1MININT = -2L**31if unicode:    def _stringify(string):        # convert to 7-bit ascii if possible        try:            return str(string)        except UnicodeError:            return stringelse:    def _stringify(string):        return string__version__ = "1.0.0"# --------------------------------------------------------------------# Exceptionsclass Error(Exception):    """Base class for client errors."""    def __str__(self):        return repr(self)class ProtocolError(Error):    """Indicates an HTTP protocol error."""    def __init__(self, url, errcode, errmsg, headers):        Error.__init__(self)        self.url = url        self.errcode = errcode        self.errmsg = errmsg        self.headers = headers    def __repr__(self):        return (            "<ProtocolError for %s: %s %s>" %            (self.url, self.errcode, self.errmsg)            )class ResponseError(Error):    """Indicates a broken response package."""    passclass Fault(Error):    """Indicates an XML-RPC fault package."""    def __init__(self, faultCode, faultString, **extra):        Error.__init__(self)        self.faultCode = faultCode        self.faultString = faultString    def __repr__(self):        return (            "<Fault %s: %s>" %            (self.faultCode, repr(self.faultString))            )# --------------------------------------------------------------------# Special valuesclass Boolean:    """Boolean-value wrapper.    Use True or False to generate a "boolean" XML-RPC value.    """    def __init__(self, value = 0):        self.value = operator.truth(value)    def encode(self, out):        out.write("<value><boolean>%d</boolean></value>\n" % self.value)    def __cmp__(self, other):        if isinstance(other, Boolean):            other = other.value        return cmp(self.value, other)    def __repr__(self):        if self.value:            return "<Boolean True at %x>" % id(self)        else:            return "<Boolean False at %x>" % id(self)    def __int__(self):        return self.value    def __nonzero__(self):        return self.valueTrue, False = Boolean(1), Boolean(0)def boolean(value, truefalse=(False, True)):    """Convert any Python value to XML-RPC 'boolean'."""    return truefalse[operator.truth(value)]class DateTime:    """DateTime wrapper for an ISO 8601 string or time tuple or    localtime integer value to generate 'dateTime.iso8601' XML-RPC    value.    """    def __init__(self, value=0):        if not isinstance(value, StringType):            if not isinstance(value, TupleType):                if value == 0:                    value = time.time()                value = time.localtime(value)            value = time.strftime("%Y%m%dT%H:%M:%S", value)        self.value = value    def __cmp__(self, other):        if isinstance(other, DateTime):            other = other.value        return cmp(self.value, other)    def __repr__(self):        return "<DateTime %s at %x>" % (self.value, id(self))    def decode(self, data):        self.value = string.strip(data)    def encode(self, out):        out.write("<value><dateTime.iso8601>")        out.write(self.value)        out.write("</dateTime.iso8601></value>\n")def datetime(data):    value = DateTime()    value.decode(data)    return valueclass Binary:    """Wrapper for binary data."""    def __init__(self, data=None):        self.data = data    def __cmp__(self, other):        if isinstance(other, Binary):            other = other.data        return cmp(self.data, other)    def decode(self, data):        import base64        self.data = base64.decodestring(data)    def encode(self, out):        import base64, StringIO        out.write("<value><base64>\n")        base64.encode(StringIO.StringIO(self.data), out)        out.write("</base64></value>\n")def binary(data):    value = Binary()    value.decode(data)    return valueWRAPPERS = DateTime, Binary, Boolean# --------------------------------------------------------------------# XML parserstry:    # optional xmlrpclib accelerator.  for more information on this    # component, contact info@pythonware.com    import _xmlrpclib    FastParser = _xmlrpclib.Parser    FastUnmarshaller = _xmlrpclib.Unmarshallerexcept (AttributeError, ImportError):    FastParser = FastUnmarshaller = None## the SGMLOP parser is about 15x faster than Python's builtin# XML parser.  SGMLOP sources can be downloaded from:##     http://www.pythonware.com/products/xml/sgmlop.htm#try:    import sgmlop    if not hasattr(sgmlop, "XMLParser"):        raise ImportErrorexcept ImportError:    SgmlopParser = None # sgmlop accelerator not availableelse:    class SgmlopParser:        def __init__(self, target):            # setup callbacks            self.finish_starttag = target.start            self.finish_endtag = target.end            self.handle_data = target.data            self.handle_xml = target.xml

⌨️ 快捷键说明

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