SVN: toys/rsget.pl/RSGet/Curl.pm

sparky sparky at pld-linux.org
Wed Oct 14 22:55:59 CEST 2009


Author: sparky
Date: Wed Oct 14 22:55:59 2009
New Revision: 10786

Modified:
   toys/rsget.pl/RSGet/Curl.pm
Log:
- try to actually follow Content-Disposition rules instead of just catching
  the usual values


Modified: toys/rsget.pl/RSGet/Curl.pm
==============================================================================
--- toys/rsget.pl/RSGet/Curl.pm	(original)
+++ toys/rsget.pl/RSGet/Curl.pm	Wed Oct 14 22:55:59 2009
@@ -181,6 +181,40 @@
 	return "$fn-$i$ext";
 }
 
+sub content_filename
+{
+	# TODO: actually read rfc2183 and rfc2184
+	local $_ = shift;
+
+	s/\s*;?\s+$//; # remove at least last \r
+	unless ( s/^\s*attachment;\s*// ) {
+		warn "Not an attachment in C-D: '$_'\n" if verbose( 1 );
+		return;
+	}
+	unless ( s/^(.*?\s+)?filename// ) {
+		warn "No filename in C-D: '$_'\n" if verbose( 1 );
+		return;
+	}
+	if ( s/^\*=(.+?)('.*?')// ) {
+		warn "C-D: Unknown filename encoding: $1 $2\n"
+			if uc $1 ne "UTF-8" and verbose( 1 );
+		s/\s+.*//;
+		return $_;
+	}
+	return unless s/^\s*=\s*//;
+	if ( s/^"// ) {
+		unless ( s/".*// ) {
+			warn "C-D: Broken filename: \"$_\n"
+				if verbose( 1 );
+			return;
+		}
+		return $_;
+	} else {
+		s/[;\s].*//;
+		return $_;
+	}
+}
+
 sub file_init
 {
 	my $supercurl = shift;
@@ -211,13 +245,11 @@
 	my $fname;
 	if ( $supercurl->{force_name} ) {
 		$fname = $supercurl->{force_name};
-	} elsif ( $supercurl->{head} =~
-			/^Content-Disposition:[ \t]*attachment;[ \t]*filename\*=UTF-8''(.+?);?[ \t]*$/mi ) {
-		$fname = de_ml( uri_unescape( $1 ) );
-	} elsif ( $supercurl->{head} =~
-			/^Content-Disposition:[ \t]*attachment;[ \t]*filename[ \t]*=[ \t]*"?(.+?)"?;?[ \t]*$/mi ) {
-		$fname = de_ml( uri_unescape( $1 ) );
-	} else {
+	} elsif ( $supercurl->{head} =~ /^Content-Disposition:(.+?)$/mi ) {
+		my $cf = content_filename( $1 );
+		$fname = de_ml( uri_unescape( $cf ) ) if defined $cf and length $cf;
+	}
+	unless ( $fname ) {
 		my $eurl = $curl->getinfo( CURLINFO_EFFECTIVE_URL );
 		$eurl =~ s#^.*/##;
 		$eurl =~ s/\?.*$//;


More information about the pld-cvs-commit mailing list