Annotation of embedaddon/lighttpd/doc/scripts/create-mime.conf.pl, revision 1.1
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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>