[Mew-dist 06347] Re: imjoin adds extra header fields

Motonori Nakamura motonori at example.com
1998年 9月 8日 (火) 12:50:31 JST


>>>>> "OBATA" == OBATA Noboru <obata at example.com> writes:

OBATA> 時々 message/partial なメールが届き imjoin のお世話になっている
OBATA> のですが、その結果得られたメールに、いくつかのヘッダが重複する
OBATA> ことがあります。

OBATA> そこで、これを修正しようとしたパッチを作りました。このあたりの
OBATA> 事情に詳しい方に何とかして頂けたらと思います。よろしくお願いし
OBATA> ます。

本文を読まずに例を見ながら実装したのがばれてしまいましたが、
だいたいそれで OK だと思います。あと、imcat, imput にも
修正を加えました。im-100 へのパッチです。

- motonori

-------------- next part --------------
diff -cr ../im-100-/IM/Message.pm ./IM/Message.pm
*** ../im-100-/IM/Message.pm	Sat Sep  5 08:04:24 1998
--- ./IM/Message.pm	Tue Sep  8 10:47:44 1998
***************
*** 253,259 ****
  
      im_debug("entering put_header\n")
        if (&debug('header') || &debug('put'));
!     hdr: foreach $line (@$Header) {
  	next if ($line =~ /^ KILLED /);
  	if ($line =~ /^ ORIGINAL /) {
  	    next if ($sel ne 'original');
--- 253,260 ----
  
      im_debug("entering put_header\n")
        if (&debug('header') || &debug('put'));
!     hdr: foreach (@$Header) {
! 	$line = $_;
  	next if ($line =~ /^ KILLED /);
  	if ($line =~ /^ ORIGINAL /) {
  	    next if ($sel ne 'original');
***************
*** 264,271 ****
  	    }
  	}
  	if ($sel =~ /^partial:/) {
! 	    if ($line =~ /^(Mime-Version|Message-Id|Encrypted|Lines):/i
! 	     || $line =~ /^Content-/i) {
  		next if ($sel =~ /:ext$/);
  	    } else {
  		next if ($sel =~ /:int$/);
--- 265,272 ----
  	    }
  	}
  	if ($sel =~ /^partial:/) {
! 	    if ($line =~ /^(Subject|Mime-Version|Message-Id|Encrypted|Lines):/i
! 	          || $line =~ /^Content-/i) {
  		next if ($sel =~ /:ext$/);
  	    } else {
  		next if ($sel =~ /:int$/);
***************
*** 422,428 ****
  	$end = $#$Body;
      } else {
  	$start = $main::Lines_to_partial * ($part - 1);
! 	$end = $main::Lines_to_partial * $part - 1;
  	$end = $#$Body if ($end > $#$Body);
      }
      im_debug("entering put_body\n") if (&debug('put'));
--- 423,430 ----
  	$end = $#$Body;
      } else {
  	$start = $main::Lines_to_partial * ($part - 1);
! 	$end = $main::Lines_to_partial * $part;
! 	$start++ if ($part > 1);
  	$end = $#$Body if ($end > $#$Body);
      }
      im_debug("entering put_body\n") if (&debug('put'));
***************
*** 530,535 ****
--- 532,539 ----
  	print CHAN "Message-Id: $main::Cur_mid$crlf";
  	$First_part_mid = $main::Cur_mid if ($part == 1);
      }
+     my $subj = &header_value($Header, 'Subject');
+     print CHAN "Subject: $subj (part $part of $total)$crlf";
      print CHAN "Mime-Version: 1.0$crlf";
      print CHAN "Content-Type: Message/partial;$crlf";
      printf CHAN "\tid=\"%s\"; number=%d; total=%d$crlf",
diff -cr ../im-100-/imcat.in ./imcat.in
*** ../im-100-/imcat.in	Sat Sep  5 08:03:48 1998
--- ./imcat.in	Tue Sep  8 10:55:55 1998
***************
*** 341,359 ****
      for ($i = 1; $i <= $#paths; $i++) {
  	if (open(MSG, "<$paths[$i]")) {
  	    $/ = "\n\n";
! 	    if ($i == 1) {
! 		my $header = <MSG>;
  		my $skip = 0;
  		foreach (split("\n", $header)) {
  		    next if (/^[ \t]/ && $skip);
  		    $skip = 0;
! 		    if (/^(Content|Message-ID)/i) {
  			$skip = 1;
  			next;
  		    }
! 		    last if (/^\n/);
  		    print "$_\n";
  		}
  	    } else {
  		# skip header part
  		<MSG>;
--- 341,372 ----
      for ($i = 1; $i <= $#paths; $i++) {
  	if (open(MSG, "<$paths[$i]")) {
  	    $/ = "\n\n";
! 	    if ($i == 1) {		# first partial message
! 		my $header = <MSG>;	# header of enclosing message
  		my $skip = 0;
  		foreach (split("\n", $header)) {
  		    next if (/^[ \t]/ && $skip);
  		    $skip = 0;
! 		    if (/^(Content-|Subject|Message-ID|Encrypted|MIME-Version)/i) {
  			$skip = 1;
  			next;
  		    }
! 		    last if (/^$/);
  		    print "$_\n";
  		}
+ 		$header = <MSG>;	# header of enclosed message
+ 		$skip = 0;
+ 		foreach (split("\n", $header)) {
+ 		    next if (/^[ \t]/ && $skip);
+ 		    $skip = 0;
+ 		    unless (/^(Content-|Subject|Message-ID|Encrypted|MIME-Version)/i) {
+ 			$skip = 1;
+ 			next;
+ 		    }
+ 		    last if (/^$/);
+ 		    print "$_\n";
+ 		}
+ 		print "\n";
  	    } else {
  		# skip header part
  		<MSG>;
diff -cr ../im-100-/imjoin.in ./imjoin.in
*** ../im-100-/imjoin.in	Sat Sep  5 08:03:54 1998
--- ./imjoin.in	Tue Sep  8 10:57:13 1998
***************
*** 161,179 ****
      for ($i = 1; $i <= $#index; $i++) {
  	if (open(MSG, "<$index[$i]")) {
  	    $/ = "\n\n";
! 	    if ($i == 1) {
! 		my $header = <MSG>;
  		my $skip = 0;
  		foreach (split("\n", $header)) {
  		    next if (/^[ \t]/ && $skip);
  		    $skip = 0;
! 		    if (/^(Content|Message-ID)/i) {
  			$skip = 1;
  			next;
  		    }
! 		    last if (/^\n/);
  		    push (@Message, "$_\n");
  		}
  	    } else {
  		# skip header part
  		<MSG>;
--- 161,192 ----
      for ($i = 1; $i <= $#index; $i++) {
  	if (open(MSG, "<$index[$i]")) {
  	    $/ = "\n\n";
! 	    if ($i == 1) {		# first partial message
! 		my $header = <MSG>;	# header of enclosing message
  		my $skip = 0;
  		foreach (split("\n", $header)) {
  		    next if (/^[ \t]/ && $skip);
  		    $skip = 0;
! 		    if (/^(Content-|Subject|Message-ID|Encrypted|MIME-Version)/i) {
  			$skip = 1;
  			next;
  		    }
! 		    last if (/^$/);
  		    push (@Message, "$_\n");
  		}
+ 		$header = <MSG>;	# header of enclosed message
+ 		$skip = 0;
+ 		foreach (split("\n", $header)) {
+ 		    next if (/^[ \t]/ && $skip);
+ 		    $skip = 0;
+ 		    unless (/^(Content-|Subject|Message-ID|Encrypted|MIME-Version)/i) {
+ 			$skip = 1;
+ 			next;
+ 		    }
+ 		    last if (/^$/);
+ 		    push (@Message, "$_\n");
+ 		}
+ 		push (@Message, "\n");
  	    } else {
  		# skip header part
  		<MSG>;


Mew-dist メーリングリストの案内