Я реализовал модуль PIVOTAL Tracker API в Python 2.7. Pivotal Tracker API ожидает, что данные POST будут XML-документом, а "application/xml" - типом контента.
Мой код использует urlib/httplib для публикации документа, как показано на рисунке:
request = urllib2.Request(self.url, xml_request.toxml('utf-8') if xml_request else None, self.headers)
obj = parse_xml(self.opener.open(request))
Это приводит к исключению, когда ТЕКСТ XML содержит символы, не являющиеся СИМВОЛАМИ ASCII:
File "/usr/lib/python2.7/httplib.py", line 951, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 809, in _send_output
msg += message_body
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 89: ordinal not in range(128)
Насколько я вижу, httplib._send_output создает строку ASCII для полезных данных сообщения, по-видимому, потому, что ожидает, что данные будут закодированы ПО URL(application/x-www-form-urlencoded). Он отлично работает с application/xml, если используются только символы ASCII.
Существует ли простой способ размещения данных приложения/xml, содержащих не-Символы ASCII или мне придется прыгать через обручи (например, используя Twistd и пользовательского производителя для полезной нагрузки POST)?