diff --git a/emails/testsuite/transformer/test_transformer.py b/emails/testsuite/transformer/test_transformer.py index 5e82202..be3c4dd 100644 --- a/emails/testsuite/transformer/test_transformer.py +++ b/emails/testsuite/transformer/test_transformer.py @@ -66,6 +66,32 @@ def test_tag_attribute(): assert m3.attachments['1.jpg'].content_disposition == "inline" +def test_data_uri_preserved(): + DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" + + # data URIs in img src should be left untouched + html = '' % DATA_URI + m = emails.loader.from_string(html=html) + assert len(m.attachments.keys()) == 0 + assert DATA_URI in m.html + + # data URIs in css url() should be left untouched + html = '
x
' % DATA_URI + m = emails.loader.from_string(html=html) + assert len(m.attachments.keys()) == 0 + + # data URIs in background attribute should be left untouched + html = '' % DATA_URI + m = emails.loader.from_string(html=html) + assert len(m.attachments.keys()) == 0 + + # mixed-case scheme should also be preserved + mixed = DATA_URI.replace('data:', 'Data:') + html = '' % mixed + m = emails.loader.from_string(html=html) + assert len(m.attachments.keys()) == 0 + + ROOT = os.path.dirname(__file__) def test_local_premailer(): diff --git a/emails/transformer.py b/emails/transformer.py index 3e1c299..21d6e20 100644 --- a/emails/transformer.py +++ b/emails/transformer.py @@ -242,6 +242,9 @@ def _load_attachment_func(self, uri, element=None, callback=None, **kw): # Return local uri # + if uri[:5].lower() == 'data:': + return uri + if callback is None: # Default callback: skip images with data-emails="ignore" attribute callback = lambda _, hints: hints['attrib'] != 'ignore'