Sube un archivo XML grande con la biblioteca de solicitudes de Python

Estoy tratando de reemplazar Curl con Python y la biblioteca de solicitudes. Con curl, puedo cargar un solo archivo XML a un servidor REST con la opción curl -T. No he podido hacer lo mismo con la biblioteca de solicitudes.

Un escenario básico funciona:

payload = '<person test="10"><first>Carl</first><last>Sagan</last></person>'
headers = {'content-type': 'application/xml'}
r = requests.put(url, data=payload, headers=headers, auth=HTTPDigestAuth("*", "*"))

Cuando cambio la carga útil a una cadena más grande al abrir un archivo XML, el método .put se bloquea (uso la biblioteca de códecs para obtener una cadena Unicode adecuada). Por ejemplo, con un archivo de 66KB:

xmlfile = codecs.open('trb-1996-219.xml', 'r', 'utf-8')
headers = {'content-type': 'application/xml'}
content = xmlfile.read()
r = requests.put(url, data=content, headers=headers, auth=HTTPDigestAuth("*", "*"))

He estado estudiando el uso de la opción multiparte (archivos), pero al servidor no parece gustarle eso.

Así que me preguntaba si hay una manera de simular el comportamiento de curl -T en la biblioteca de solicitudes de Python.

ACTUALIZACIÓN 1: el programa se cuelga en textmate, pero arroja un error UnicodeEncodeError en la línea de comandos. Parece que ese debe ser el problema. Entonces, la pregunta sería: ¿hay una manera de enviar cadenas Unicode a un servidor con la biblioteca de solicitudes?

ACTUALIZACIÓN 2: Gracias al comentario de Martijn Pieters, el UnicodeEncodeError desapareció, pero apareció un nuevo problema. Con una cadena XML literal (ASCII), el registro muestra las siguientes líneas:

2012-11-11 15:55:05,154 INFO Starting new HTTP connection (1): my.ip.address
2012-11-11 15:55:05,294 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 401 211
2012-11-11 15:55:05,430 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 201 0

Parece que el servidor siempre rebota el primer intento de autenticación (?) Pero luego acepta el segundo.

Con un objeto de archivo (abierto ('trb-1996-219.xml', 'rb')) pasado a los datos, el archivo de registro muestra:

2012-11-11 15:50:54,309 INFO Starting new HTTP connection (1): my.ip.address
2012-11-11 15:50:55,105 DEBUG "PUT /v1/documents?uri=/example/test.xml HTTP/1.1" 401 211
2012-11-11 15:51:25,603 WARNING Retrying (0 attempts remain) after connection broken by 'BadStatusLine("''",)': /v1/documents?uri=/example/test.xml

Por lo tanto, el primer intento se bloquea como antes, pero no se realiza un segundo intento.

Según Martijn Pieters (abajo), el segundo problema puede explicarse por un servidor defectuoso (línea vacía). Me ocuparé de esto, pero si alguien tiene una solución (aparte de usar curl) no me importaría escucharla.

Y todavía me sorprende que la biblioteca de solicitudes se comporte de manera tan diferente para una cadena pequeña y un objeto de archivo. ¿No se serializa el objeto de archivo antes de que llegue al servidor de todos modos?

Respuestas a la pregunta(3)

Su respuesta a la pregunta