Decodificación de encabezados RFC 2231

Tratando de abordareste problema, Estoy tratando de envolver mi cabeza en torno a las diversas funciones de la biblioteca estándar de Python destinadas a admitirRFC 2231. El objetivo principal de ese RFC parece ser triple: permitir la codificación no ASCII en los parámetros del encabezado, observar el idioma de un valor determinado y permitir que los parámetros del encabezado abarquen varias líneas. losemail.util biblioteca Ofrece varias funciones para tratar diversos aspectos de esto. Por lo que puedo decir, funcionan de la siguiente manera:

decode_rfc2231 solo divide el valor de tal parámetro en sus partes, como esto:

>>> email.utils.decode_rfc2231("utf-8''T%C3%A4st.txt")
['utf-8', '', 'T%C3%A4st.txt']

decode_params se encarga de detectar los parámetros codificados en RFC2231. Recopila partes que pertenecen juntas y también decodifica la cadena codificada en url a una secuencia de bytes. Esta secuencia de bytes, sin embargo, luego se codifica como latin1. Y todos los valores están entre comillas. Además, hay un manejo especial para el primer argumento, que todavía tiene que ser una tupla de dos elementos, pero esos dos pasan al resultado sin modificaciones.

>>> email.utils.decode_params([
...   (1,2),
...   ("foo","bar"),
...   ("name*","utf-8''T%C3%A4st.txt"),
...   ("baz*0","two"),("baz*1","-part")])
[(1, 2), ('foo', '"bar"'), ('baz', '"two-part"'), ('name', ('utf-8', '', '"Täst.txt"'))]

collapse_rfc2231_value se puede usar para convertir este triple de codificación, lenguaje y secuencia de bytes en una cadena de Unicode adecuada. Sin embargo, lo que me ha confundido es el hecho de que si la entrada era tan triple, entonces las comillas se trasladarán a la salida. Si, por otro lado, la entrada era una sola cadena entre comillas, entonces estas comillas serán eliminadas.

>>> [(k, email.utils.collapse_rfc2231_value(v)) for k, v in
...  email.utils.decode_params([
...   (1,2),
...   ("foo","bar"),
...   ("name*","utf-8''T%C3%A4st.txt"),
...   ("baz*0","two"),("baz*1","-part")])[1:]]
[('foo', 'bar'), ('baz', 'two-part'), ('name', '"Täst.txt"')]

Así que parece que para usar toda esta maquinaria, tendría que agregar otro paso para anular el tercer elemento de cualquier tupla con la que me encontraría. ¿Es esto cierto, o me estoy perdiendo algún punto aquí? Tuve que resolver mucho de lo anterior con la ayuda del código fuente, ya que los documentos son un poco vagos en los detalles. No puedo imaginar lo que podría ser el punto detrás de esta cita selectiva. ¿Hay algún punto al respecto?

¿Cuál es la mejor referencia sobre cómo usar estas funciones?

Lo mejor que encontré hasta ahora es elemail.message.Message implementación. Allí, el proceso parece ser aproximadamente el descrito anteriormente, pero cada campo se anula a través de_unquotevalue después de ladecode_params, y sologet_filename yget_boundary colapsan sus valores, todos los demás devuelven una tupla en su lugar. Espero que haya algo más útil.

Respuestas a la pregunta(2)

Su respuesta a la pregunta