diff options
author | Katsumi Yamaoka <yamaoka@jpl.org> | 2013-10-22 10:22:59 +0000 |
---|---|---|
committer | Katsumi Yamaoka <yamaoka@jpl.org> | 2013-10-22 10:22:59 +0000 |
commit | 84efb042f3afe859e279015a22ce53cbc3aecd7a (patch) | |
tree | 967a5d6d16cdbf180683f0ab2ad903e7d29c230b /lisp/gnus/nndoc.el | |
parent | d40a46d75b4d2c8858d2d83b64c0eb8aaf2c8d5f (diff) | |
download | emacs-84efb042f3afe859e279015a22ce53cbc3aecd7a.tar.gz |
lisp/gnus/mm-decode.el (mm-dissect-buffer): Guess content-type if the first token is missing in the Content-Type header
lisp/gnus/nndoc.el (nndoc-dissect-mime-parts-sub): Ditto
Diffstat (limited to 'lisp/gnus/nndoc.el')
-rw-r--r-- | lisp/gnus/nndoc.el | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/lisp/gnus/nndoc.el b/lisp/gnus/nndoc.el index b17a7a6ecd8..00d9f4d4dd0 100644 --- a/lisp/gnus/nndoc.el +++ b/lisp/gnus/nndoc.el @@ -968,15 +968,61 @@ PARENT is the message-ID of the parent summary line, or nil for none." (goto-char head-begin) (setq content-type (message-fetch-field "Content-Type")) (when content-type - (when (string-match - "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" content-type) + (with-temp-buffer + (insert content-type) + (goto-char (point-min)) + (when (re-search-forward ";[\t\n ]*name=\\([\"']\\|\\([^\t\n\r ]+\\)\\)" + nil t) + (setq subject (or (match-string 2) + (progn + (goto-char (match-beginning 1)) + (condition-case nil + (progn + (forward-sexp 1) + (buffer-substring + (1+ (match-beginning 1)) (1- (point)))) + (error nil))))))) + (when (or (string-match "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" + content-type) + ;; Guess Content-Type from the file name extention. + ;; Some mailer sends a part without type like this: + ;; Content-Type: ; name="IMG_3156.JPG" + ;; Content-Disposition: attachment; filename="IMG_3156.JPG" + (let ((tem (message-fetch-field "Content-Disposition")) + (case-fold-search t) + len) + (when (and + (setq tem + (or (and tem + (mail-content-type-get + (mail-header-parse-content-disposition + tem) + 'filename)) + subject)) + (setq tem (file-name-extension tem)) + (require 'mailcap) + (setq content-type + (cdr (assoc (concat "." (downcase tem)) + mailcap-mime-extensions))) + (string-match "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" + content-type)) + (save-match-data + (goto-char (point-min)) + (when (re-search-forward "^Content-Type:\\([^;]*\\);" + nil t) + (setq len (- (match-end 1) (match-beginning 1) + (length content-type)) + head-end (- head-end len) + body-begin (- body-begin len) + body-end (- body-end len)) + (replace-match (concat "Content-Type: " content-type + ";")))) + t))) (setq type (downcase (match-string 1 content-type)) subtype (downcase (match-string 2 content-type)) message-rfc822 (and (string= type "message") (string= subtype "rfc822")) multipart-any (string= type "multipart"))) - (when (string-match ";[ \t\n]*name=\\([^ \t\n;]+\\)" content-type) - (setq subject (match-string 1 content-type))) (when (string-match "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)" content-type) (setq boundary-regexp (concat "^--" (regexp-quote |