Commit 44b56ed0 by Can Yavuz

let the XML parser fail gracefully on malformed XML

parent 66eabe8b
...@@ -465,3 +465,9 @@ except: ...@@ -465,3 +465,9 @@ except:
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.functional import lazy from django.utils.functional import lazy
reverse_lazy = lazy(reverse, str) reverse_lazy = lazy(reverse, str)
# xml.etree.parse only throws ParseError for python >= 2.7
try:
from xml.etree import ParseError as ETParseError
except ImportError: # python < 2.7
ETParseError = None
...@@ -20,6 +20,8 @@ from djangorestframework.compat import yaml ...@@ -20,6 +20,8 @@ from djangorestframework.compat import yaml
from djangorestframework.response import ErrorResponse from djangorestframework.response import ErrorResponse
from djangorestframework.utils.mediatypes import media_type_matches from djangorestframework.utils.mediatypes import media_type_matches
from xml.etree import ElementTree as ET from xml.etree import ElementTree as ET
from djangorestframework.compat import ETParseError
from xml.parsers.expat import ExpatError
import datetime import datetime
import decimal import decimal
...@@ -185,7 +187,11 @@ class XMLParser(BaseParser): ...@@ -185,7 +187,11 @@ class XMLParser(BaseParser):
`data` will simply be a string representing the body of the request. `data` will simply be a string representing the body of the request.
`files` will always be `None`. `files` will always be `None`.
""" """
tree = ET.parse(stream) try:
tree = ET.parse(stream)
except (ExpatError, ETParseError, ValueError), exc:
content = {'detail': 'XML parse error - %s' % unicode(exc)}
raise ErrorResponse(status.HTTP_400_BAD_REQUEST, content)
data = self._xml_convert(tree.getroot()) data = self._xml_convert(tree.getroot())
return (data, None) return (data, None)
......
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