xmlrpclib and decoding entity references

Chris Curvey ccurvey at gmail.com
Wed May 4 11:17:07 EDT 2005


Here is the solution.  Incidentally, the client is Cold Fusion.

import re
import logging
import logging.config
import os
import SimpleXMLRPCServer

logging.config.fileConfig("logging.ini")

########################################################################
class
LoggingXMLRPCRequestHandler(SimpleXMLRPCServer.CGIXMLRPCRequestHandler):
    def __dereference(self, request_text):
        entityRe = re.compile("((?P<er>&#x)(?P<code>..)(?P<semi>;))")
        for m in re.finditer(entityRe, request_text):
            hexref = int(m.group(3),16)
	    charref = chr(hexref)
	    request_text = request_text.replace(m.group(1), charref)

	return request_text


#-------------------------------------------------------------------
    def handle_xmlrpc(self, request_text):
        logger = logging.getLogger()
	#logger.debug("************************************")
	#logger.debug(request_text)
	try:
	    #logger.debug("-------------------------------------")
	    request_text = self.__dereference(request_text)
	    #logger.debug(request_text)
	    request_text = request_text.decode("latin-1").encode('utf-8')
	    #logger.debug("************************************")
	except Exception, e:
	    logger.error(request_text)
	    logger.error("had a problem dereferencing")
	    logger.error(e)

	SimpleXMLRPCServer.CGIXMLRPCRequestHandler.handle_xmlrpc(self,
request_text)
########################################################################
class Foo:
    def settings(self):
        return os.environ
    def echo(self, something):
        logger = logging.getLogger()
	logger.debug(something)
        return something
    def greeting(self, name):
        return "hello, " + name

# these are used to run as a CGI
handler = LoggingXMLRPCRequestHandler()
handler.register_instance(Foo())
handler.handle_request()




More information about the Python-list mailing list