diff options
author | Guido van Rossum <guido@python.org> | 2001-10-01 13:46:55 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-10-01 13:46:55 (GMT) |
commit | d1d584f4e820dc893175cdde74b901b6808ed3ab (patch) | |
tree | 95c5640828bf644513dfb57c332ae95dcb88cbf6 /Lib | |
parent | d016e45fdb21691def79d00b41e20bd64adbc85a (diff) | |
download | cpython-d1d584f4e820dc893175cdde74b901b6808ed3ab.zip cpython-d1d584f4e820dc893175cdde74b901b6808ed3ab.tar.gz cpython-d1d584f4e820dc893175cdde74b901b6808ed3ab.tar.bz2 |
SF patch #462628 (Travers Naran) NNTPLib supports saving BODY to a file.
I modified nntplib so the body method can accept an
optional second parameter pointing to a filehandle or
filename (string). This way, really long body
articles can be stored to disk instead of kept in
memory. The way I made the modification should make
it easy to extend this functionality to other extended
return methods.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/nntplib.py | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/Lib/nntplib.py b/Lib/nntplib.py index d97813f..d5bc902 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -31,6 +31,7 @@ are strings, not numbers, since they are rarely used for calculations. # Imports import re import socket +import types __all__ = ["NNTP","NNTPReplyError","NNTPTemporaryError", "NNTPPermanentError","NNTPProtocolError","NNTPDataError", @@ -210,20 +211,35 @@ class NNTP: raise NNTPProtocolError(resp) return resp - def getlongresp(self): + def getlongresp(self,fileHandle=None): """Internal: get a response plus following text from the server. Raise various errors if the response indicates an error.""" - resp = self.getresp() - if resp[:3] not in LONGRESP: - raise NNTPReplyError(resp) - list = [] - while 1: - line = self.getline() - if line == '.': - break - if line[:2] == '..': - line = line[1:] - list.append(line) + + openedFile = None + try: + # If a string was passed then open a file with that name + if isinstance(fileHandle, types.StringType): + openedFile = fileHandle = open(fileHandle, "w") + + resp = self.getresp() + if resp[:3] not in LONGRESP: + raise NNTPReplyError(resp) + list = [] + while 1: + line = self.getline() + if line == '.': + break + if line[:2] == '..': + line = line[1:] + if fileHandle: + fileHandle.write(line + "\n") + else: + list.append(line) + finally: + # If this method created the file, then it must close it + if openedFile: + openedFile.close() + return resp, list def shortcmd(self, line): @@ -231,10 +247,10 @@ class NNTP: self.putcmd(line) return self.getresp() - def longcmd(self, line): + def longcmd(self, line, fileHandle=None): """Internal: send a command and get the response plus following text.""" self.putcmd(line) - return self.getlongresp() + return self.getlongresp(fileHandle) def newgroups(self, date, time): """Process a NEWGROUPS command. Arguments: @@ -339,9 +355,9 @@ class NNTP: """Process a LAST command. No arguments. Return as for STAT.""" return self.statcmd('LAST') - def artcmd(self, line): + def artcmd(self, line, fileHandle=None): """Internal: process a HEAD, BODY or ARTICLE command.""" - resp, list = self.longcmd(line) + resp, list = self.longcmd(line,fileHandle) resp, nr, id = self.statparse(resp) return resp, nr, id, list @@ -356,16 +372,18 @@ class NNTP: return self.artcmd('HEAD ' + id) - def body(self, id): + def body(self, id, fileHandle=None): """Process a BODY command. Argument: - id: article number or message id + - fileHandle: Filename string or file object to store the article in Returns: - resp: server response if successful - nr: article number - id: message id - - list: the lines of the article's body""" + - list: the lines of the article's body or an empty list + if fileHandle was used""" - return self.artcmd('BODY ' + id) + return self.artcmd('BODY ' + id, fileHandle) def article(self, id): """Process an ARTICLE command. Argument: |