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, "&", "&") s = replace(s, "<", "<") return replace(s, ">", ">",)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 + -
显示快捷键?