Return to create-mime.conf.pl CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / lighttpd / doc / scripts |
1.1 ! misho 1: #!/usr/bin/perl -w ! 2: ! 3: # Based on create-mime.assign.pl in debian lighttpd (1.4.x) package ! 4: # Creates an example mime.conf from /etc/mime.types ! 5: ! 6: use strict; ! 7: ! 8: # text/* subtypes to serve as "text/...; charset=utf-8" ! 9: # text/html IS NOT INCLUDED: html has its own method for defining charset ! 10: # (<meta>), but the standards specify that content-type in HTTP wins over ! 11: # the setting in the html document. ! 12: my %text_utf8 = map { $_ => 1 } qw( ! 13: css ! 14: csv ! 15: plain ! 16: x-bibtex ! 17: x-boo ! 18: x-c++hdr ! 19: x-c++src ! 20: x-chdr ! 21: x-csh ! 22: x-csrc ! 23: x-dsrc ! 24: x-diff ! 25: x-haskell ! 26: x-java ! 27: x-lilypond ! 28: x-literate-haskell ! 29: x-makefile ! 30: x-moc ! 31: x-pascal ! 32: x-perl ! 33: x-python ! 34: x-scala ! 35: x-sh ! 36: x-tcl ! 37: x-tex ! 38: ); ! 39: ! 40: # map extension to hash which maps types to the type they should be replaced with ! 41: my %manual_conflicts_resolve = ( ! 42: '.ra' => { ! 43: 'audio/x-pn-realaudio' => 'audio/x-realaudio', ! 44: }, ! 45: ); ! 46: ! 47: open MIMETYPES, "/etc/mime.types" or die "Can't open /etc/mime.types: $!"; ! 48: ! 49: my %extensions; ! 50: sub set { ! 51: my ($extension, $mimetype) = @_; ! 52: $extensions{$extension} = $mimetype; ! 53: } ! 54: sub add { ! 55: my ($extension, $mimetype) = @_; ! 56: my $have = $extensions{$extension}; ! 57: ! 58: my $r = $manual_conflicts_resolve{$extension}; ! 59: # update @_ too for calls to set ! 60: $_[1] = $mimetype = $r->{$mimetype} if $r && $r->{$mimetype}; ! 61: ! 62: # mime.types can have same extension for different mime types ! 63: if ($have) { ! 64: # application/octet-stream means we couldn't resolve another conflict ! 65: return if $have eq $mimetype || $have eq 'application/octet-stream'; ! 66: ! 67: my ($have_type, $have_subtype) = split /\//, $have, 2; ! 68: my ($type, $subtype) = split /\//, $mimetype, 2; ! 69: ! 70: my $have_x = ($have_type =~ /^x-/ || $have_subtype =~ /^x-/); ! 71: my $x = ($type =~ /^x-/ || $subtype =~ /^x-/); ! 72: ! 73: # entries without x- prefix in type/subtype win: ! 74: if ($have_x && !$x) { ! 75: return set @_; # overwrite ! 76: } elsif ($x && !$have_x) { ! 77: return; # ignore ! 78: } ! 79: ! 80: # text/ wins over application/ for same subtype ! 81: if ($subtype eq $have_subtype) { ! 82: if ($type eq "text" && $have_type eq "application") { ! 83: return set @_; # overwrite ! 84: } elsif ($have_type eq "text" && $type eq "application") { ! 85: return; # ignore ! 86: } ! 87: } ! 88: ! 89: print STDERR "Duplicate mimetype: '${extension}' => '${mimetype}' (already have '${have}'), merging to 'application/octet-stream'\n"; ! 90: set ($extension, 'application/octet-stream'); ! 91: } else { ! 92: set @_; ! 93: } ! 94: } ! 95: ! 96: sub print_type { ! 97: my ($extension, $mimetype) = @_; ! 98: if ($mimetype =~ /^text\/(.*)$/) { ! 99: $mimetype .= "; charset=utf-8" if $text_utf8{$1}; ! 100: } ! 101: ! 102: print "\t\"${extension}\" => \"${mimetype}\",\n"; ! 103: } ! 104: ! 105: while (<MIMETYPES>) { ! 106: chomp; ! 107: s/\#.*//; ! 108: next if /^\w*$/; ! 109: if (/^([a-z0-9\/+-.]+)\s+((?:[a-z0-9.+-]+[ ]?)+)$/i) { ! 110: my $mimetype = $1; ! 111: my @extensions = split / /, $2; ! 112: ! 113: foreach my $ext (@extensions) { ! 114: add(".${ext}", $mimetype); ! 115: } ! 116: } ! 117: } ! 118: ! 119: # missing in /etc/mime.types; ! 120: # from http://www.iana.org/assignments/media-types/media-types.xhtml ! 121: add(".dtd", "application/xml-dtd"); ! 122: ! 123: # other useful mappings ! 124: my %useful = ( ! 125: ".tar.gz" => "application/x-gtar-compressed", ! 126: ".gz" => "application/x-gzip", ! 127: ".tbz" => "application/x-gtar-compressed", ! 128: ".tar.bz2" => "application/x-gtar-compressed", ! 129: ".bz2" => "application/x-bzip", ! 130: ".log" => "text/plain", ! 131: ".conf" => "text/plain", ! 132: ".spec" => "text/plain", ! 133: "README" => "text/plain", ! 134: "Makefile" => "text/x-makefile", ! 135: ); ! 136: ! 137: while (my ($ext, $mimetype) = each %useful) { ! 138: add($ext, $mimetype) unless $extensions{$ext}; ! 139: } ! 140: ! 141: ! 142: print <<EOF; ! 143: # created by create-mime.conf.pl ! 144: ! 145: ####################################################################### ! 146: ## ! 147: ## MimeType handling ! 148: ## ------------------- ! 149: ## ! 150: ## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails ! 151: ! 152: ## ! 153: ## mimetype.xattr-name ! 154: ## Set the extended file attribute name used to obtain mime type ! 155: ## (must also set mimetype.use-xattr = "enable") ! 156: ## ! 157: ## Default value is "Content-Type" ! 158: ## ! 159: ## freedesktop.org Shared MIME-info Database specification suggests ! 160: ## user-defined value ("user.mime_type") as name for extended file attribute ! 161: #mimetype.xattr-name = "user.mime_type" ! 162: ! 163: ## ! 164: ## Use extended attribute named in mimetype.xattr-name (default "Content-Type") ! 165: ## to obtain mime type if possible ! 166: ## ! 167: ## Disabled by default ! 168: ## ! 169: #mimetype.use-xattr = "enable" ! 170: ! 171: ## ! 172: ## mimetype ("Content-Type" HTTP header) mapping for static file handling ! 173: ## ! 174: ## The first matching suffix is used. If no mapping is found ! 175: ## 'application/octet-stream' is used, and caching (etag/last-modified handling) ! 176: ## is disabled to prevent clients from caching "unknown" mime types. ! 177: ## ! 178: ## Therefore the last mapping is: ! 179: ## "" => "application/octet-stream" ! 180: ## This matches all extensions and acts as default mime type, and enables ! 181: ## caching for those. ! 182: mimetype.assign = ( ! 183: EOF ! 184: ! 185: # sort "x-" and "vnd." prefixed names after everything else ! 186: sub mimecmpvalue { ! 187: my ($mimetype) = @_; ! 188: $mimetype =~ s/(^|\/)(x-|vnd\.)/~$1$2/g; ! 189: return $mimetype; ! 190: } ! 191: sub countdots { ! 192: my ($s) = @_; ! 193: return scalar(() = $s =~ /\./g); ! 194: } ! 195: # the first matching suffix wins, so we have to sort by "length" ! 196: # as all extensions start with "." we use the number of "."s as length ! 197: # the exceptions are "README" and "Makefile" which are assumed not to conflict ! 198: # (i.e. are not a suffix of any other extension) ! 199: for my $ext (sort { countdots($b) <=> countdots($a) || mimecmpvalue($extensions{$a}) cmp mimecmpvalue($extensions{$b}) || $a cmp $b } keys(%extensions)) { ! 200: print_type($ext, $extensions{$ext}); ! 201: } ! 202: ! 203: print <<EOF; ! 204: ! 205: # enable caching for unknown mime types: ! 206: "" => "application/octet-stream" ! 207: ) ! 208: EOF