Commit c502df4e authored by Georg Brandl's avatar Georg Brandl

Issue #17915: Fix interoperability of xml.sax with file objects returned by

codecs.open().
parent 93b061bc
......@@ -15,6 +15,7 @@ from xml.sax.expatreader import create_parser
from xml.sax.handler import feature_namespaces
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
from io import BytesIO, StringIO
import codecs
import os.path
import shutil
from test import support
......@@ -538,6 +539,34 @@ class WriterXmlgenTest(BytesXmlgenTest):
def getvalue(self):
return b''.join(self)
class StreamWriterXmlgenTest(XmlgenTest, unittest.TestCase):
def ioclass(self):
raw = BytesIO()
writer = codecs.getwriter('ascii')(raw, 'xmlcharrefreplace')
writer.getvalue = raw.getvalue
return writer
def xml(self, doc, encoding='iso-8859-1'):
return ('<?xml version="1.0" encoding="%s"?>\n%s' %
(encoding, doc)).encode('ascii', 'xmlcharrefreplace')
class StreamReaderWriterXmlgenTest(XmlgenTest, unittest.TestCase):
fname = support.TESTFN + '-codecs'
def ioclass(self):
writer = codecs.open(self.fname, 'w', encoding='ascii',
errors='xmlcharrefreplace', buffering=0)
self.addCleanup(support.unlink, self.fname)
writer.getvalue = self.getvalue
return writer
def getvalue(self):
with open(self.fname, 'rb') as f:
return f.read()
def xml(self, doc, encoding='iso-8859-1'):
return ('<?xml version="1.0" encoding="%s"?>\n%s' %
(encoding, doc)).encode('ascii', 'xmlcharrefreplace')
start = b'<?xml version="1.0" encoding="iso-8859-1"?>\n'
......@@ -946,6 +975,8 @@ def test_main():
StringXmlgenTest,
BytesXmlgenTest,
WriterXmlgenTest,
StreamWriterXmlgenTest,
StreamReaderWriterXmlgenTest,
ExpatReaderTest,
ErrorReportingTest,
XmlReaderTest)
......
......@@ -5,6 +5,7 @@ convenience of application and driver writers.
import os, urllib.parse, urllib.request
import io
import codecs
from . import handler
from . import xmlreader
......@@ -77,6 +78,10 @@ def _gettextwriter(out, encoding):
# use a text writer as is
return out
if isinstance(out, (codecs.StreamWriter, codecs.StreamReaderWriter)):
# use a codecs stream writer as is
return out
# wrap a binary writer with TextIOWrapper
if isinstance(out, io.RawIOBase):
# Keep the original file open when the TextIOWrapper is
......
......@@ -20,6 +20,9 @@ Library
- Issue #1159051: Back out a fix for handling corrupted gzip files that
broke backwards compatibility.
- Issue #17915: Fix interoperability of xml.sax with file objects returned by
codecs.open().
Build
-----
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment