Blob Blame History Raw
From 13b026c96d0e4cb6e298258a808ffa80c1b5acc1 Mon Sep 17 00:00:00 2001
From: Vadim Rutkovsky <vrutkovs@redhat.com>
Date: Wed, 19 Mar 2014 12:37:38 +0100
Subject: [PATCH] Don't crash on invalid XML chars in embed

---
 behave/formatter/html.py | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

--- a/behave/formatter/html.py
+++ b/behave/formatter/html.py
@@ -4,7 +4,8 @@ import base64
 import os.path
 from behave.compat.collections import Counter
 
-def _valid_XML_char_ordinal(i):
+def _valid_XML_char_ordinal(char):
+    i = ord(char)
     return ( # conditions ordered by presumed frequency
         0x20 <= i <= 0xD7FF 
         or i in (0x9, 0xA, 0xD)
@@ -208,10 +209,11 @@ class HTMLFormatter(Formatter):
             embed = ET.SubElement(step, 'pre',
                 {'id': "embed_%s" % self.embed_id,
                  'style': 'display: none; white-space: pre-wrap;'})
-            cleaned_error_message = ''.join(
-                c for c in result.error_message if _valid_XML_char_ordinal(ord(c))
-            )
-            embed.text = cleaned_error_message
+            cleaned_error_message = filter(_valid_XML_char_ordinal, result.error_message)
+            try:
+                embed.text = cleaned_error_message
+            except ValueError:
+                print("Cannot embed error message as it contains nonvalid XML chars")
             embed.tail = u'    '
 
         if result.status == 'failed':
@@ -276,14 +278,14 @@ class HTMLFormatter(Formatter):
                 caption = u'Data'
             link.text = unicode(caption)
 
-            cleaned_data = ''.join(
-                c for c in data if _valid_XML_char_ordinal(ord(c))
-            )
-
+            cleaned_data = filter(_valid_XML_char_ordinal, data)
             embed = ET.SubElement(span, 'pre',
                 {'id': "embed_%s" % self.embed_id,
                  'style': 'display: none'})
-            embed.text = cleaned_data
+            try:
+                embed.text = cleaned_data
+            except ValueError:
+                print("Cannot embed text as it contains nonvalid XML chars")
             embed.tail = u'    '
 
     def embedding(self, mime_type, data, caption=None):