Во-первых, ваш пример тоже не работает для меня. Я не знаю, что вы спрашиваете о "нормальной обработке на стороне сервера, если вход содержит недопустимый XML" - вы отправляете на сервер недопустимый XML, и он возвращает вам ошибку ... что еще вы хотите?
Во-вторых, введите print 'hi there'
в tt
, вы увидите, что tt
не вызывается при отправке unichr(0x8)
. Точный ответ (200) сервером:
HTTP/1.0 200 OK
Server: BaseHTTP/0.3 Python/2.6.5
Date: Tue, 07 Dec 2010 07:33:09 GMT
Content-type: text/xml
Content-length: 350
<?xml version='1.0'?>
<methodResponse>
<fault>
<value><struct>
<member>
<name>faultCode</name>
<value><int>1</int></value>
</member>
<member>
<name>faultString</name>
<value><string><class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 6, column 15</string></value>
</member>
</struct></value>
</fault>
</methodResponse>
Итак, вы видите сообщение об ошибке.
Теперь, согласно спецификации XML-RPC ,
- Какие символы допускаются в строках? Непечатные символы? Нулевые персонажи? Можно ли использовать «строку» для хранения произвольного фрагмента двоичных данных?
В строке допускаются любые символы, кроме <и &, которые кодируются как & lt; и & amp ;. Строка может использоваться для кодирования двоичных данных. </p>
Хорошо, но это XML, и согласно спецификации XML :
Юридическими символами являются табуляция, возврат каретки, перевод строки и юридические символы Unicode и ISO / IEC 10646.
Char :: = # x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# X10000- # x10FFFF]
Который не включает 0x08 и, кажется, полностью противоречит спецификации XML-RPC! Таким образом, можно увидеть, что спецификация XML довольно строго реализуется вашим анализатором XML (который, судя по ошибке, выглядит экспатриированным). Поскольку XML не допускает 0x08, вы не можете отправить 0x08, и действительно, вы получаете ошибку обратно.
Если мы сделаем:
data = "<?xml version='1.0'?>\n<methodCall>\n<methodName>tt</methodName>\n<params>\n<param>\n<value><string>\x08</string></value>\n</param>\n</params>\n</methodCall>"
p = xml.parsers.expat.ParserCreate()
p.Parse(data, True)
... мы получили вашу ошибку. Опять же, вы передаете мусорный XML на сервер, сервер возвращает вам сообщение об ошибке, и Python в середине представляет эту ошибку вам как исключение. Какое поведение вы ожидали?