From: Lars Ingebrigtsen Date: Tue, 7 Feb 2012 02:46:47 +0000 (+0000) Subject: nnimap.el: Allow nnimap to parse headers with spaces in odd places X-Git-Tag: emacs-pretest-24.0.94~269 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=827235c3cef884d38353c789c60543df2af27ee7;p=emacs.git nnimap.el: Allow nnimap to parse headers with spaces in odd places --- diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index 7c6388f6f25..383addc8369 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,5 +1,10 @@ 2012-02-07 Lars Ingebrigtsen + * 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 (bug#10732). diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 09cf554312b..c5b77dbef4a 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -189,25 +189,33 @@ textual parts.") (defun nnimap-transform-headers () (goto-char (point-min)) - (let (article bytes lines size string) + (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 bytes (nnimap-get-length) - 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)