]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
added seekable option; save unix from lines; speed up islast()
authorGuido van Rossum <guido@python.org>
Thu, 22 Jun 1995 19:06:57 +0000 (19:06 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 22 Jun 1995 19:06:57 +0000 (19:06 +0000)
Lib/rfc822.py

index 0e9122fa139f5676c5a0df189cd4295dc9f29297..3cec6df6fa2d7970f1f6fea6c33520ae273116e6 100644 (file)
@@ -43,29 +43,39 @@ import string
 import time
 
 
+_blanklines = ('\r\n', '\n')           # Optimization for islast()
+
+
 class Message:
 
        # Initialize the class instance and read the headers.
        
-       def __init__(self, fp):
+       def __init__(self, fp, seekable = 1):
                self.fp = fp
+               self.seekable = seekable
+               self.startofheaders = None
+               self.startofbody = None
                #
-               try:
-                       self.startofheaders = self.fp.tell()
-               except IOError:
-                       self.startofheaders = None
+               if self.seekable:
+                       try:
+                               self.startofheaders = self.fp.tell()
+                       except IOError:
+                               self.seekable = 0
                #
                self.readheaders()
                #
-               try:
-                       self.startofbody = self.fp.tell()
-               except IOError:
-                       self.startofbody = None
+               if self.seekable:
+                       try:
+                               self.startofbody = self.fp.tell()
+                       except IOError:
+                               self.seekable = 0
 
 
        # Rewind the file to the start of the body (if seekable).
 
        def rewindbody(self):
+               if not self.seekable:
+                       raise IOError, "unseekable file"
                self.fp.seek(self.startofbody)
 
 
@@ -83,6 +93,7 @@ class Message:
        # reproduce the header exactly as it appears in the file).
 
        def readheaders(self):
+               self.unixfrom = ''
                self.headers = list = []
                self.status = ''
                headerseen = 0
@@ -94,6 +105,7 @@ class Message:
                                break
                        # Skip unix From name time lines
                        if firstline and line[:5] == 'From ':
+                               self.unixfrom = self.unixfrom + line
                                continue
                        firstline = 0
                        if self.islast(line):
@@ -112,9 +124,9 @@ class Message:
                                else:
                                        self.status = 'Bad header'
                                # Try to undo the read.
-                               try:
+                               if self.seekable:
                                        self.fp.seek(-len(line), 1)
-                               except IOError:
+                               else:
                                        self.status = \
                                                self.status + '; bad seek'
                                break
@@ -128,7 +140,7 @@ class Message:
        # sockets) a line consisting of \r\n also matches.
 
        def islast(self, line):
-               return line == '\n' or line == '\r\n'
+               return line in _blanklines
 
 
        # Look through the list of headers and find all lines matching