Allow nnimap to parse headers with spaces in odd places
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 7 Feb 2012 02:32:39 +0000 (03:32 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 7 Feb 2012 02:32:39 +0000 (03:32 +0100)
(nnimap-transform-headers): Fix parsing BODYSTRUCTURE elements that
have newlines within the strings, and where the UID comes after the
BODYSTRUCTURE element (bug#10537).

lisp/ChangeLog
lisp/nnimap.el

index 2ce4cae..26547d1 100644 (file)
@@ -1,8 +1,11 @@
 2012-02-07  Lars Ingebrigtsen  <larsi@gnus.org>
 
-       * nnimap.el (nnimap-transform-headers): Removed unused variable.
+       * nnimap.el (nnimap-transform-headers): Remove unused variable.
+       (nnimap-transform-headers): Fix parsing BODYSTRUCTURE elements that
+       have newlines within the strings, and where the UID comes after the
+       BODYSTRUCTURE element (bug#10537).
 
-       * shr-color.el (shr-color-set-minimum-interval): Renamed to add prefix
+       * shr-color.el (shr-color-set-minimum-interval): Rename to add prefix
        (bug#10732).
 
        * shr.el (shr-insert-document): Add doc string.
index 57c81ad..c5b77db 100644 (file)
@@ -192,21 +192,30 @@ textual parts.")
   (let (article lines size string)
     (block nil
       (while (not (eobp))
-       (while (not (looking-at "\\* [0-9]+ FETCH.+?UID \\([0-9]+\\)"))
+       (while (not (looking-at "\\* [0-9]+ FETCH"))
          (delete-region (point) (progn (forward-line 1) (point)))
          (when (eobp)
            (return)))
-       (setq article (match-string 1))
+       (goto-char (match-end 0))
        ;; Unfold quoted {number} strings.
-       (while (re-search-forward "[^]][ (]{\\([0-9]+\\)}\r?\n"
-                                 (1+ (line-end-position)) t)
+       (while (re-search-forward
+               "[^]][ (]{\\([0-9]+\\)}\r?\n"
+               (save-excursion
+                 (or (re-search-forward "\\* [0-9]+ FETCH" nil t)
+                     (point-max)))
+               t)
          (setq size (string-to-number (match-string 1)))
          (delete-region (+ (match-beginning 0) 2) (point))
          (setq string (buffer-substring (point) (+ (point) size)))
          (delete-region (point) (+ (point) size))
-         (insert (format "%S" string)))
-       (setq lines nil)
+         (insert (format "%S" (subst-char-in-string
+                               ?\n ?\s string))))
        (beginning-of-line)
+       (setq article
+             (and (re-search-forward "UID \\([0-9]+\\)" (line-end-position)
+                                     t)
+                  (match-string 1)))
+       (setq lines nil)
        (setq size
              (and (re-search-forward "RFC822.SIZE \\([0-9]+\\)"
                                      (line-end-position)