Вы смешиваете Юникод и байтовые строки.
>>> msg = u'abc' # Unicode string
>>> message_body = b'\xc5' # bytestring
>>> msg += message_body
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal \
not in range(128)
Чтобы исправить это, убедитесь, что содержимое self.headers
правильно закодировано, т. Е. Все ключи, значения в headers
должны быть строками байтов:
self.headers = dict((k.encode('ascii') if isinstance(k, unicode) else k,
v.encode('ascii') if isinstance(v, unicode) else v)
for k,v in self.headers.items())
Примечание: кодировка символов заголовков не имеет ничего общего с кодировкой символов тела, т. Е. Текст XML может кодироваться независимо (это просто поток октетов с точки зрения http-сообщения).
То же самое относится к self.url
- если он имеет тип unicode
; преобразовать его в строку байтов (используя кодировку ascii).
HTTP-сообщение состоит из стартовой строки, «заголовков», пустой строки и, возможно, тела сообщения , поэтому self.headers
используется для заголовков, self.url
используется для стартовой строки ( здесь используется метод http) и, вероятно, для Host
заголовка http (если клиент http / 1.1), текст XML отправляется в тело сообщения (в виде двоичного двоичного объекта).
Всегда безопасно использовать кодировку ASCII для self.url
(IDNA может использоваться для доменных имен, не относящихся к ascii - результатом также является ASCII).
Вот что rfc 7230 говорит о http заголовках кодировке :
Исторически HTTP разрешал содержимое полей с текстом в
Кодировка ISO-8859-1 [ISO-8859-1], поддерживает только другие кодировки
путем использования кодировки [RFC2047]. На практике большинство заголовков HTTP
Значения полей используют только подмножество кодировки US-ASCII [USASCII].
Вновь определенные поля заголовка ДОЛЖНЫ ограничивать значения их полей
US-ASCII октеты. Получатель ДОЛЖЕН обращаться с другими октетами в поле
содержимое (obs-text) в виде непрозрачных данных.
Чтобы преобразовать XML в строку байтов, см. application/xml
condsiderations :
Рекомендуется использовать UTF-8 без спецификации для всех объектов XML MIME.