Skip to content

Instantly share code, notes, and snippets.

@hyperair
Created October 3, 2013 07:44
Show Gist options
  • Save hyperair/6806494 to your computer and use it in GitHub Desktop.
Save hyperair/6806494 to your computer and use it in GitHub Desktop.
Workaround for ExpatError when talking to bugzilla servers
import bugzilla
import xmlrpclib
import types
import unicodedata
class FilterParser(object):
"""
Filtering object that strips control characters before actually parsing
"""
def __init__(self, parser):
self.parser = parser
def __getattr__(self, attr):
"""Pass through to bound methods of self.parser"""
return getattr(self.parser, attr)
def feed(self, data):
"""
Overridden feed(data) method which strips control characters before
passing to the underlying parser.feed(data) method.
See xmlrpclib.ExpatParser.feed
"""
data = ''.join(c for c in data.decode('utf-8', 'replace')
if c == '\n'
or unicodedata.category(c) != 'Cc').encode('utf-8')
self.parser.feed(data)
bg = bugzilla.Bugzilla(url=xmlrpc_url, cookiefile=None)
# Override getparser method of transport
# TODO: upgrade to python-bugzilla 0.9.0 for self.bg._transport
transport = bg._proxy._ServerProxy__transport
transportcls = transport.__class__
orig_getparser = transport.getparser
def getparser(self):
"""
Creates a parser. See xmlrpclib.Transport.getparser.
"""
parser, unmarshaller = orig_getparser()
parser = FilterParser(parser)
return parser, unmarshaller
transport.getparser = types.MethodType(getparser, transport,
transportcls)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment