[Python-Dev] Bogosities in quopri module?

Barry A. Warsaw barry@digicool.com
Mon, 18 Jun 2001 18:28:21 -0400


I've been playing a bit with the quopri module (trying to support RFC
2047 in mimelib), and I've run across a few bogosities that I'd like
to fix.  Fixing some of them could break code, so I wanted to see what
people think first.

First, quopri should have encodestring() and decodestring() functions
which take a string and return a string.  This would make it more
consistent API-wise with e.g. base64.  One difference is that
quopri.encodestring() should probably take a default argument
quotetabs (defaulted to 1) for passing to the encode() function.  This
shouldn't be very controversial.

I think there are two problems with encode().  First, it always tacks
on an extra \n character, such that an encode->decode roundtrip is not
idempotent.  I propose fixing this so that encode() doesn't add the
extra newline, but this can break code that expects that newline to be
present.

Third, I think that encode()'s quotetabs flag should also apply to
spaces.  RFC 1521 says that both ASCII tabs and spaces may be encoded,
and I don't think it's worthwhile that there be a separate flag to
independently choose to encode tabs or spaces.

Lastly, if you buy the extra-newline solution above, then encode() has
to be fixed w.r.t. trailing spaces and tabs.  Currently, an
encode->decode roundtrip for, e.g. "hello " returns "hello =\n", but
what it should really return is "hello=20".  Likewise "hello\t" should
return "hello=09".

The patches must take multiline strings into account though, so that
it doesn't chomp newlines out of

"""hello
great
big
world
"""

I haven't worked up a patch yet, but when I do I'll upload it to SF to
get some feedback.  I think there are a few other things in the module
that could be cleaned up.  I also plan to add a test_quopri.py.

Comments?
-Barry