Issue 7644: bug in nntplib.body() method with possible fix (original) (raw)
Created on 2010-01-06 10:29 by mdmullins, last changed 2022-04-11 14:56 by admin. This issue is now closed.
Messages (9)
Author: Michael Mullins (mdmullins)
Date: 2010-01-06 10:29
When using NNTP.body(id,file) I get the following repeatable error:
Traceback (most recent call last): File "", line 1, in File "nntplib.py", line 436, in body return self.artcmd('BODY {0}'.format(id), file) File "nntplib.py", line 410, in artcmd resp, list = self.longcmd(line, file) File "nntplib.py", line 267, in longcmd return self.getlongresp(file) File "nntplib.py", line 249, in getlongresp file.write(line + b'\n') File "/usr/lib/python3.0/io.py", line 1478, in write s.class.name) TypeError: can't write bytes to text stream
But by simply changing the line
openedFile = file = open(file, "w")
...to...
openedFile = file = open(file, "wb")
...in the following code:
def getlongresp(self, file=None):
"""Internal: get a response plus following text from the server.
Raise various errors if the response indicates an error."""
openedFile = None
try:
# If a string was passed then open a file with that name
if isinstance(file, str):
openedFile = file = open(file, "wb")
...it seems to fix the problem. I discovered this in 3.0, but downloading and inspecting the source for 3.1 shows the same problem.
MDMullins
Author: R. David Murray (r.david.murray) *
Date: 2010-01-06 13:21
('crash' is for the interpreter crashing)
Unfortunately there currently are no unit tests for nntplib. Unless someone feels like creating an nntp test framework we may have to commit this fix without a test.
Author: Michael Mullins (mdmullins)
Date: 2010-01-07 04:30
"('crash' is for the interpreter crashing)"
Sorry.
"Unless someone feels like creating an nntp test framework..."
This sounds like it is beyond me. But given the evidence, specifically the previous line:
"file.write(line + b'\n')"
...the module is obviously writing as binary. I know that opening the files created by this method in 3.0 requires the 'rb' flag so it seems a safe bet. And I am actually using this module (as revised above) to get work done.
...
I apologise if this isn't the place for this (should I open another ticket?) but as a larger issue with 3.x in general, it was very confusing about when to use binary data and when to use strings when using nntplib. It took a lot of trial and error. If there was someway to make this more clear, or perhaps the methods themselves could be made flexible, excepting both types but always outputing in binary. (Liberal with input but conservative in output.) This would allow anyone working with nntplib to interact with the module in a completely binary way, understanding that all output will be explicitly binary, and that if strings are necessary, it's for the user to decode().
Just a thought.
MDMullins
Author: R. David Murray (r.david.murray) *
Date: 2010-01-07 12:37
Yes, it should be another issue. That said, there are similar (worse, actually) problems with the py3 email package that we are moving toward addressing. There we are planning to have dual APIs. If you want to work on fixing nntplib similarly, that would be great. I'm expecting there to be synergy between the two, so you might be interested in joining the effort to update the email module as well. See http://wiki.python.org/moin/Email%20SIG for more details. (Trying to use nntplib in py3 is how I myself wound up involved in the email effort).
Author: Hynek Schlawack (hynek) *
Date: 2012-02-13 08:15
Looking into the source code of nntplib, I'd claim this bug isn't valid anymore?
At least the file is opened in binary mode now – see Lib/nntplib.py:462
In any case, we have a test suite now.
Author: Antoine Pitrou (pitrou) *
Date: 2012-02-13 20:05
test_nntplib doesn't seem to exercise the second argument to body() (the file object). Perhaps you want to add a test for that?
Author: Hynek Schlawack (hynek) *
Date: 2012-02-15 15:23
I have also added a test for NTTP.head(), enjoy.
Author: Roundup Robot (python-dev)
Date: 2012-02-15 17:57
New changeset f1401d20bc6d by Antoine Pitrou in branch '3.2': Issue #7644: Add tests for the file argument of NNTP.head() and NNTP.body(). http://hg.python.org/cpython/rev/f1401d20bc6d
New changeset 096b31e0f8ea by Antoine Pitrou in branch 'default': Issue #7644: Add tests for the file argument of NNTP.head() and NNTP.body(). http://hg.python.org/cpython/rev/096b31e0f8ea
Author: Antoine Pitrou (pitrou) *
Date: 2012-02-15 17:57
Thank you! Closing now.
History
Date
User
Action
Args
2022-04-11 14:56:56
admin
set
github: 51893
2012-02-15 17:57:37
pitrou
set
status: open -> closed
resolution: fixed
messages: +
stage: test needed -> resolved
2012-02-15 17:57:03
python-dev
set
nosy: + python-dev
messages: +
2012-02-15 15:23:58
hynek
set
files: + nntp-file-test.diff
keywords: + patch
messages: +
2012-02-13 20:05:53
pitrou
set
nosy: + pitrou
messages: +
2012-02-13 08:15:33
hynek
set
nosy: + hynek
messages: +
versions: + Python 3.3, - Python 3.1
2010-01-07 12:37:16
r.david.murray
set
messages: +
2010-01-07 04:30:26
mdmullins
set
messages: +
2010-01-06 13:21:54
r.david.murray
set
priority: normal
type: crash -> behavior
versions: + Python 3.2
keywords: + easy
nosy: + r.david.murray
messages: +
stage: test needed
2010-01-06 10:35:39
mdmullins
set
type: crash
components: + Library (Lib)
2010-01-06 10:29:13
mdmullins
create