[gnus git] branch master updated: m0-7-237-g0a63db6 =1= mm-decode.el (mm-dissect-buffer): Guess content-type if the first token is missing in the Content-Type header nndoc.el (nndoc-dissect-mime-parts-sub): Ditto

Katsumi Yamaoka <[email protected]>
Newsgroups gmane.emacs.gnus.cvs
Message-ID <[email protected]>
       via  0a63db68d21591915aa899eabbadb2320edbdb65 (commit)
      from  2d5dd67e2129eecf737b8df2f818cd1cabc1c222 (commit)


- Log -----------------------------------------------------------------
commit 0a63db68d21591915aa899eabbadb2320edbdb65
Author: Katsumi Yamaoka <[email protected]>
Date:   Tue Oct 22 10:22:25 2013 +0000

    mm-decode.el (mm-dissect-buffer): Guess content-type if the first token is missing in the Content-Type header
    nndoc.el (nndoc-dissect-mime-parts-sub): Ditto

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index fcd1cdd..617191d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
+2013-10-22  Katsumi Yamaoka  <[email protected]>
+
+	* mm-decode.el (mm-dissect-buffer): Guess content-type if the first
+	token is missing in the Content-Type header.
+
+	* nndoc.el (nndoc-dissect-mime-parts-sub): Ditto.
+
 2013-09-18  Glenn Morris  <[email protected]>
 
 	* gnus-util.el (image-size): Declare.
diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el
index 941849d..4a9007a 100644
--- a/lisp/mm-decode.el
+++ b/lisp/mm-decode.el
@@ -672,12 +672,39 @@ MIME-Version header before proceeding."
 				 description)))))
       (if (or (not ctl)
 	      (not (string-match "/" (car ctl))))
+	  (let ((cdl (and cd (mail-header-parse-content-disposition cd))))
 	    (mm-dissect-singlepart
-	   (list mm-dissect-default-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"
+	     (list (or
+		    (let ((tem
+			   (or (mail-content-type-get cdl 'filename)
+			       (and ct
+				    (with-temp-buffer
+				      (insert ct)
+				      (goto-char (point-min))
+				      (and (re-search-forward "\
+;[\t\n ]*name=\\([\"']\\|\\([^\t\n\r ]+\\)\\)" nil t)
+					   (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))))))))))
+		      (and tem
+			   (setq tem (file-name-extension tem))
+			   (require 'mailcap)
+			   (cdr (assoc (concat "." (downcase tem))
+				       mailcap-mime-extensions))))
+		    mm-dissect-default-type))
 	     (and cte (intern (downcase (mail-header-strip cte))))
-	   no-strict-mime
-	   (and cd (mail-header-parse-content-disposition cd))
-	   description)
+	     no-strict-mime cdl description))
 	(setq type (split-string (car ctl) "/"))
 	(setq subtype (cadr type)
 	      type (car type))
diff --git a/lisp/nndoc.el b/lisp/nndoc.el
index b17a7a6..00d9f4d 100644
--- a/lisp/nndoc.el
+++ b/lisp/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

-----------------------------------------------------------------------
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we listed those
revisions in full, above.

Summary of changes:
 lisp/ChangeLog    |    7 +++++++
 lisp/mm-decode.el |   39 ++++++++++++++++++++++++++++++++------
 lisp/nndoc.el     |   54 +++++++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 90 insertions(+), 10 deletions(-)

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Gnus Project".

The branch, master has been updated


hooks/post-receive
-- 
Gnus Project
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.