Implementé un módulo Pivotal Tracker API en Python 2.7. El Pivotal Tracker API espera que los datos POST sean un documento XML y que "application/xml" sea el tipo de contenido.Cómo publico caracteres que no son ASCII usando httplib cuando content-type es "application/xml"
Mi código utiliza urlib/httplib para publicar el documento como se muestra:
request = urllib2.Request(self.url, xml_request.toxml('utf-8') if xml_request else None, self.headers)
obj = parse_xml(self.opener.open(request))
Esto produce una excepción cuando el texto XML contiene caracteres no 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)
Como cerca como pueda ver, httplib._send_output está creando una cadena ASCII para la carga útil del mensaje, presumiblemente porque espera que los datos estén codificados por URL (application/x-www-form-urlencoded). Funciona bien con application/xml, siempre que solo se utilicen caracteres ASCII.
¿Existe alguna manera directa de publicar datos de aplicación/xml que contengan caracteres que no sean ASCII o voy a tener que pasar por aros (por ejemplo, usando Twistd y un productor personalizado para la carga de POST)?
Tal vez podría cambiar el 'contenido type' de las cabeceras, pero ¿cómo se soluciona el problema? El 'msg' se construye en las bibliotecas de python, y es una cadena de bytes. – jro
@jro: no tiene nada que ver con HTTP. Mire el ejemplo * completo * arriba. – jfs
Entiendo que esto causa el problema, pero mi punto es que él no tiene control sobre la variable 'msg'. Estoy de acuerdo con su punto, pero mi pregunta está más en la línea de cómo este hecho puede ayudarlo a resolverlo cuando en las libs 'msg' se crea como' msg = "\ r \ n" .join (self._buffer) ¿? – jro