Created
October 3, 2013 07:44
-
-
Save hyperair/6806494 to your computer and use it in GitHub Desktop.
Workaround for ExpatError when talking to bugzilla servers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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