Annotation of embedaddon/lighttpd/doc/scripts/create-mime.conf.pl, revision 1.1.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>