line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package HTTP::Proxy::Selective; |
2
|
|
|
|
|
|
|
|
3
|
6
|
|
|
6
|
|
190407
|
use base qw( HTTP::Proxy::HeaderFilter ); |
|
6
|
|
|
|
|
17
|
|
|
6
|
|
|
|
|
6794
|
|
4
|
6
|
|
|
6
|
|
2332
|
use strict; |
|
6
|
|
|
|
|
17
|
|
|
6
|
|
|
|
|
182
|
|
5
|
6
|
|
|
6
|
|
34
|
use warnings; |
|
6
|
|
|
|
|
16
|
|
|
6
|
|
|
|
|
185
|
|
6
|
6
|
|
|
6
|
|
30
|
use Carp (); |
|
6
|
|
|
|
|
12
|
|
|
6
|
|
|
|
|
102
|
|
7
|
|
|
|
|
|
|
|
8
|
6
|
|
|
6
|
|
8934
|
use Path::Class::File; |
|
6
|
|
|
|
|
539127
|
|
|
6
|
|
|
|
|
217
|
|
9
|
6
|
|
|
6
|
|
6766
|
use File::Slurp; |
|
6
|
|
|
|
|
115853
|
|
|
6
|
|
|
|
|
502
|
|
10
|
6
|
|
|
6
|
|
66
|
use File::stat; |
|
6
|
|
|
|
|
11
|
|
|
6
|
|
|
|
|
56
|
|
11
|
|
|
|
|
|
|
|
12
|
6
|
|
|
6
|
|
19915
|
use HTTP::Response; |
|
6
|
|
|
|
|
299116
|
|
|
6
|
|
|
|
|
15332
|
|
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
our $VERSION = '0.004'; |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
sub new { |
17
|
1
|
|
|
1
|
1
|
750
|
my ($class, $filter, $debug) = @_; |
18
|
1
|
|
|
|
|
10
|
my $self = $class->SUPER::new(); |
19
|
1
|
|
|
|
|
16
|
my $overrides = delete $filter->{mime_overrides}; |
20
|
1
|
|
50
|
|
|
9
|
$overrides ||= {}; |
21
|
1
|
|
|
|
|
3
|
my %mime_types = (_initial_mime_types(), %$overrides); |
22
|
1
|
|
|
|
|
31
|
$self->{_mime_types} = \%mime_types; |
23
|
1
|
|
|
|
|
5
|
$self->{_myfilter} = _generate_matches_from_config(%$filter); |
24
|
1
|
50
|
|
|
|
7
|
if ($debug) { |
25
|
0
|
|
|
|
|
0
|
$self->{_debug} = 1; |
26
|
0
|
|
|
|
|
0
|
warn("Debugging mode ON\nPaths this proxy will divert:\n"); |
27
|
0
|
|
|
|
|
0
|
foreach my $host (keys %{ $self->{_myfilter} }) { |
|
0
|
|
|
|
|
0
|
|
28
|
0
|
|
|
|
|
0
|
foreach my $array ( @{ $self->{_myfilter}{$host} } ) { |
|
0
|
|
|
|
|
0
|
|
29
|
0
|
|
|
|
|
0
|
warn($host . $array->[0] . "\n"); |
30
|
|
|
|
|
|
|
} |
31
|
|
|
|
|
|
|
} |
32
|
0
|
|
|
|
|
0
|
warn("\n"); |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
|
35
|
1
|
|
|
|
|
3
|
return $self; |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
sub _generate_matches_from_config { |
39
|
2
|
|
|
2
|
|
34
|
my (%filter) = @_; |
40
|
|
|
|
|
|
|
|
41
|
2
|
|
|
|
|
7
|
foreach my $site (keys %filter) { |
42
|
|
|
|
|
|
|
# Ensure all filter paths have a leading / |
43
|
4
|
|
|
|
|
6
|
foreach my $key (keys %{$filter{$site}}) { |
|
4
|
|
|
|
|
14
|
|
44
|
10
|
100
|
|
|
|
34
|
next if ($key =~ m|^/|); |
45
|
3
|
|
|
|
|
7
|
my $path = delete $filter{$site}->{$key}; |
46
|
3
|
|
|
|
|
10
|
$filter{$site}->{"/$key"} = $path; |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
# Re-shuffle into an array, with the longest (most specific) paths first. |
49
|
4
|
|
|
|
|
10
|
my @keys = sort { length $b <=> length $a } keys %{$filter{$site}}; |
|
7
|
|
|
|
|
21
|
|
|
4
|
|
|
|
|
17
|
|
50
|
4
|
|
|
|
|
7
|
my $new_filter = [ map { [$_, $filter{$site}->{$_} ] } @keys ]; |
|
10
|
|
|
|
|
35
|
|
51
|
4
|
|
|
|
|
13
|
$filter{$site} = $new_filter; |
52
|
|
|
|
|
|
|
} |
53
|
2
|
|
|
|
|
10
|
return \%filter; |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub filter { |
57
|
5
|
|
|
5
|
1
|
10837
|
my ( $self, $headers, $message ) = @_; |
58
|
5
|
|
|
|
|
36
|
my $uri = $message->uri; |
59
|
5
|
100
|
|
|
|
323
|
unless ($self->{_myfilter}{$uri->host}) { |
60
|
1
|
|
|
|
|
69
|
return; |
61
|
0
|
0
|
|
|
|
0
|
warn("Did not match host " . $uri->host . " from config.\n") if $self->{_debug}; |
62
|
|
|
|
|
|
|
} |
63
|
4
|
|
|
|
|
223
|
my $path = $uri->path; |
64
|
4
|
50
|
|
|
|
206
|
warn("Trying to match request path: $path\n") if $self->{_debug}; |
65
|
4
|
|
|
|
|
8
|
foreach my $myfilter (@{ $self->{_myfilter}{$uri->host} }) { |
|
4
|
|
|
|
|
22
|
|
66
|
5
|
|
|
|
|
201
|
my ($match_path, $on_disk) = @$myfilter; |
67
|
5
|
100
|
|
|
|
28
|
if ($self->_filter_applies($myfilter, $path)) { |
68
|
2
|
|
|
|
|
287
|
warn("Matched $match_path with path $path\n"); |
69
|
2
|
|
|
|
|
9
|
my $path_remainder = substr($path, length($match_path)); |
70
|
2
|
|
|
|
|
17
|
my $fn = Path::Class::File->new($on_disk, $path_remainder)->stringify; |
71
|
2
|
|
|
|
|
498
|
$fn =~ s/[\\\/]$//; |
72
|
2
|
|
|
|
|
49
|
my $res = $self->_serve_local($headers, $fn); |
73
|
2
|
|
|
|
|
209
|
$self->proxy->response($res); |
74
|
2
|
|
|
|
|
208
|
return; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
else { |
77
|
3
|
50
|
|
|
|
186
|
warn("Did not match $match_path with path $path\n") if $self->{_debug}; |
78
|
|
|
|
|
|
|
} |
79
|
|
|
|
|
|
|
} |
80
|
2
|
50
|
|
|
|
6
|
warn("No paths matched - sending request to original server.\n") if $self->{_debug}; |
81
|
2
|
|
|
|
|
6
|
return; |
82
|
|
|
|
|
|
|
} |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
sub __file_exists { |
85
|
0
|
|
|
0
|
|
0
|
my $fn = shift; |
86
|
0
|
|
|
|
|
0
|
return -f $fn; |
87
|
|
|
|
|
|
|
} |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
sub _serve_local { |
90
|
3
|
|
|
3
|
|
26957
|
my ($self, $req_headers, $fn) = @_; |
91
|
3
|
|
|
|
|
23
|
my $res = HTTP::Response->new(); |
92
|
3
|
100
|
|
|
|
167
|
if ( __file_exists($fn) ) { |
93
|
2
|
50
|
|
|
|
17
|
warn("File exists at $fn, serving from local disk\n") if $self->{_debug}; |
94
|
2
|
|
|
|
|
8
|
my $stat = stat($fn); |
95
|
2
|
100
|
|
|
|
30
|
if ($req_headers->header('If-Modified-Since') ) { |
96
|
1
|
50
|
|
|
|
94
|
if ( $req_headers->if_modified_since == $stat->mtime ) { |
97
|
1
|
|
|
|
|
114
|
$res->code(304); # Not modified |
98
|
1
|
|
|
|
|
10
|
return $res; |
99
|
|
|
|
|
|
|
} |
100
|
|
|
|
|
|
|
} |
101
|
1
|
|
|
|
|
84
|
$res->code(200); |
102
|
1
|
|
|
|
|
13
|
$res->headers->content_type($self->_mimetype($fn)); |
103
|
1
|
|
|
|
|
84
|
$res->headers->content_length( $stat->size ); |
104
|
1
|
|
|
|
|
98
|
$res->headers->last_modified( $stat->mtime ); |
105
|
1
|
|
|
|
|
17669
|
my $content = read_file($fn, binmode => ':raw'); |
106
|
1
|
|
|
|
|
12
|
$res->content($content); |
107
|
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
else { |
109
|
1
|
50
|
|
|
|
13
|
warn("File $fn does not exist on local disk\n") if $self->{_debug}; |
110
|
1
|
|
|
|
|
4
|
$res->code(404); |
111
|
1
|
|
|
|
|
14
|
$res->headers->content_type('text/html'); |
112
|
1
|
|
|
|
|
29
|
$res->content('Not foundNot found at ' . $fn . ''); |
113
|
|
|
|
|
|
|
} |
114
|
2
|
|
|
|
|
52
|
return $res; |
115
|
|
|
|
|
|
|
} |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
sub _filter_applies { |
118
|
4
|
|
|
4
|
|
21
|
my ($self, $myfilter, $path) = @_; |
119
|
4
|
|
|
|
|
9
|
my $match_path = @$myfilter[0]; |
120
|
4
|
100
|
|
|
|
26
|
return 1 if (index($path, $match_path) == 0); # Match at the beginning only |
121
|
2
|
|
|
|
|
9
|
return; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub _mimetype { |
125
|
0
|
|
|
0
|
|
0
|
my ($self, $fn) = @_; |
126
|
0
|
0
|
|
|
|
0
|
if ($fn) { |
127
|
0
|
0
|
|
|
|
0
|
if ($fn =~ /\.([^.]+)$/) { |
128
|
0
|
|
|
|
|
0
|
my $ext = lc($1); |
129
|
0
|
0
|
|
|
|
0
|
if ($self->{_mime_types}->{$ext}) { |
130
|
0
|
|
|
|
|
0
|
return $self->{_mime_types}->{$ext} |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
} |
133
|
|
|
|
|
|
|
} |
134
|
0
|
|
|
|
|
0
|
return 'application/octet-stream'; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
sub _initial_mime_types {( |
138
|
1
|
|
|
1
|
|
368
|
ez => "application/andrew-inset", |
139
|
|
|
|
|
|
|
atom => "application/atom", |
140
|
|
|
|
|
|
|
atomcat => "application/atomcat+xml", |
141
|
|
|
|
|
|
|
atomsrv => "application/atomserv+xml", |
142
|
|
|
|
|
|
|
cap => "application/cap", |
143
|
|
|
|
|
|
|
pcap => "application/cap", |
144
|
|
|
|
|
|
|
cu => "application/cu-seeme", |
145
|
|
|
|
|
|
|
tsp => "application/dsptype", |
146
|
|
|
|
|
|
|
spl => "application/futuresplash", |
147
|
|
|
|
|
|
|
hta => "application/hta", |
148
|
|
|
|
|
|
|
jar => "application/java-archive", |
149
|
|
|
|
|
|
|
ser => "application/java-serialized-object", |
150
|
|
|
|
|
|
|
class => "application/java-vm", |
151
|
|
|
|
|
|
|
hqx => "application/mac-binhex40", |
152
|
|
|
|
|
|
|
cpt => "application/mac-compactpro", |
153
|
|
|
|
|
|
|
nb => "application/mathematica", |
154
|
|
|
|
|
|
|
mdb => "application/msaccess", |
155
|
|
|
|
|
|
|
doc => "application/msword", |
156
|
|
|
|
|
|
|
dot => "application/msword", |
157
|
|
|
|
|
|
|
bin => "application/octet-stream", |
158
|
|
|
|
|
|
|
oda => "application/oda", |
159
|
|
|
|
|
|
|
ogg => "application/ogg", |
160
|
|
|
|
|
|
|
ogx => "application/ogg", |
161
|
|
|
|
|
|
|
pdf => "application/pdf", |
162
|
|
|
|
|
|
|
key => "application/pgp-keys", |
163
|
|
|
|
|
|
|
pgp => "application/pgp-signature", |
164
|
|
|
|
|
|
|
prf => "application/pics-rules", |
165
|
|
|
|
|
|
|
ps => "application/postscript", |
166
|
|
|
|
|
|
|
ai => "application/postscript", |
167
|
|
|
|
|
|
|
eps => "application/postscript", |
168
|
|
|
|
|
|
|
rar => "application/rar", |
169
|
|
|
|
|
|
|
rdf => "application/rdf+xml", |
170
|
|
|
|
|
|
|
rss => "application/rss+xml", |
171
|
|
|
|
|
|
|
rtf => "application/rtf", |
172
|
|
|
|
|
|
|
smi => "application/smil", |
173
|
|
|
|
|
|
|
smil => "application/smil", |
174
|
|
|
|
|
|
|
wpd => "application/wordperfect", |
175
|
|
|
|
|
|
|
wp5 => "application/wordperfect5.1", |
176
|
|
|
|
|
|
|
xhtml => "application/xhtml+xml", |
177
|
|
|
|
|
|
|
xht => "application/xhtml+xml", |
178
|
|
|
|
|
|
|
xml => "application/xml", |
179
|
|
|
|
|
|
|
xsl => "application/xml", |
180
|
|
|
|
|
|
|
zip => "application/zip", |
181
|
|
|
|
|
|
|
cdy => "application/vnd.cinderella", |
182
|
|
|
|
|
|
|
kml => "application/vnd.google-earth.kml+xml", |
183
|
|
|
|
|
|
|
kmz => "application/vnd.google-earth.kmz", |
184
|
|
|
|
|
|
|
xul => "application/vnd.mozilla.xul+xml", |
185
|
|
|
|
|
|
|
xls => "application/vnd.ms-excel", |
186
|
|
|
|
|
|
|
xlb => "application/vnd.ms-excel", |
187
|
|
|
|
|
|
|
xlt => "application/vnd.ms-excel", |
188
|
|
|
|
|
|
|
cat => "application/vnd.ms-pki.seccat", |
189
|
|
|
|
|
|
|
stl => "application/vnd.ms-pki.stl", |
190
|
|
|
|
|
|
|
ppt => "application/vnd.ms-powerpoint", |
191
|
|
|
|
|
|
|
pps => "application/vnd.ms-powerpoint", |
192
|
|
|
|
|
|
|
odc => "application/vnd.oasis.opendocument.chart", |
193
|
|
|
|
|
|
|
odb => "application/vnd.oasis.opendocument.databas", |
194
|
|
|
|
|
|
|
odf => "application/vnd.oasis.opendocument.formula", |
195
|
|
|
|
|
|
|
odg => "application/vnd.oasis.opendocument.graphics", |
196
|
|
|
|
|
|
|
otg => "application/vnd.oasis.opendocument.graphics-template", |
197
|
|
|
|
|
|
|
odi => "application/vnd.oasis.opendocument.image", |
198
|
|
|
|
|
|
|
odp => "application/vnd.oasis.opendocument.presentation", |
199
|
|
|
|
|
|
|
otp => "application/vnd.oasis.opendocument.presentation-template", |
200
|
|
|
|
|
|
|
ods => "application/vnd.oasis.opendocument.spreadsheet", |
201
|
|
|
|
|
|
|
ots => "application/vnd.oasis.opendocument.spreadsheet-template", |
202
|
|
|
|
|
|
|
odt => "application/vnd.oasis.opendocument.text", |
203
|
|
|
|
|
|
|
odm => "application/vnd.oasis.opendocument.text-master", |
204
|
|
|
|
|
|
|
ott => "application/vnd.oasis.opendocument.text-template", |
205
|
|
|
|
|
|
|
oth => "application/vnd.oasis.opendocument.text-web", |
206
|
|
|
|
|
|
|
cod => "application/vnd.rim.cod", |
207
|
|
|
|
|
|
|
mmf => "application/vnd.smaf", |
208
|
|
|
|
|
|
|
sdc => "application/vnd.stardivision.calc", |
209
|
|
|
|
|
|
|
sds => "application/vnd.stardivision.chart", |
210
|
|
|
|
|
|
|
sda => "application/vnd.stardivision.draw", |
211
|
|
|
|
|
|
|
sdd => "application/vnd.stardivision.impress", |
212
|
|
|
|
|
|
|
sdf => "application/vnd.stardivision.math", |
213
|
|
|
|
|
|
|
sdw => "application/vnd.stardivision.writer", |
214
|
|
|
|
|
|
|
sgl => "application/vnd.stardivision.writer-global", |
215
|
|
|
|
|
|
|
sxc => "application/vnd.sun.xml.calc", |
216
|
|
|
|
|
|
|
stc => "application/vnd.sun.xml.calc.template", |
217
|
|
|
|
|
|
|
sxd => "application/vnd.sun.xml.draw", |
218
|
|
|
|
|
|
|
std => "application/vnd.sun.xml.draw.template", |
219
|
|
|
|
|
|
|
sxi => "application/vnd.sun.xml.impress", |
220
|
|
|
|
|
|
|
sti => "application/vnd.sun.xml.impress.template", |
221
|
|
|
|
|
|
|
sxm => "application/vnd.sun.xml.math", |
222
|
|
|
|
|
|
|
sxw => "application/vnd.sun.xml.writer", |
223
|
|
|
|
|
|
|
sxg => "application/vnd.sun.xml.writer.global", |
224
|
|
|
|
|
|
|
stw => "application/vnd.sun.xml.writer.template", |
225
|
|
|
|
|
|
|
sis => "application/vnd.symbian.install", |
226
|
|
|
|
|
|
|
vsd => "application/vnd.visio", |
227
|
|
|
|
|
|
|
wbxml => "application/vnd.wap.wbxml", |
228
|
|
|
|
|
|
|
wmlc => "application/vnd.wap.wmlc", |
229
|
|
|
|
|
|
|
wmlsc => "application/vnd.wap.wmlscriptc", |
230
|
|
|
|
|
|
|
wk => "application/x-123", |
231
|
|
|
|
|
|
|
'7z' => "application/x-7z-compressed", |
232
|
|
|
|
|
|
|
abw => "application/x-abiword", |
233
|
|
|
|
|
|
|
dmg => "application/x-apple-diskimage", |
234
|
|
|
|
|
|
|
bcpio => "application/x-bcpio", |
235
|
|
|
|
|
|
|
torrent => "application/x-bittorrent", |
236
|
|
|
|
|
|
|
cab => "application/x-cab", |
237
|
|
|
|
|
|
|
cbr => "application/x-cbr", |
238
|
|
|
|
|
|
|
cbz => "application/x-cbz", |
239
|
|
|
|
|
|
|
cdf => "application/x-cdf", |
240
|
|
|
|
|
|
|
vcd => "application/x-cdlink", |
241
|
|
|
|
|
|
|
pgn => "application/x-chess-pgn", |
242
|
|
|
|
|
|
|
cpio => "application/x-cpio", |
243
|
|
|
|
|
|
|
csh => "application/x-csh", |
244
|
|
|
|
|
|
|
deb => "application/x-debian-package", |
245
|
|
|
|
|
|
|
udeb => "application/x-debian-package", |
246
|
|
|
|
|
|
|
dcr => "application/x-director", |
247
|
|
|
|
|
|
|
dir => "application/x-director", |
248
|
|
|
|
|
|
|
dxr => "application/x-director", |
249
|
|
|
|
|
|
|
dms => "application/x-dms", |
250
|
|
|
|
|
|
|
wad => "application/x-doom", |
251
|
|
|
|
|
|
|
dvi => "application/x-dvi", |
252
|
|
|
|
|
|
|
rhtml => "application/x-httpd-eruby", |
253
|
|
|
|
|
|
|
flac => "application/x-flac", |
254
|
|
|
|
|
|
|
pfa => "application/x-font", |
255
|
|
|
|
|
|
|
pfb => "application/x-font", |
256
|
|
|
|
|
|
|
gsf => "application/x-font", |
257
|
|
|
|
|
|
|
pcf => "application/x-font", |
258
|
|
|
|
|
|
|
'pcf.Z' => "application/x-font", |
259
|
|
|
|
|
|
|
mm => "application/x-freemind", |
260
|
|
|
|
|
|
|
spl => "application/x-futuresplash", |
261
|
|
|
|
|
|
|
gnumeric => "application/x-gnumeric", |
262
|
|
|
|
|
|
|
sgf => "application/x-go-sgf", |
263
|
|
|
|
|
|
|
gcf => "application/x-graphing-calculator", |
264
|
|
|
|
|
|
|
gtar => "application/x-gtar", |
265
|
|
|
|
|
|
|
tgz => "application/x-gtar", |
266
|
|
|
|
|
|
|
taz => "application/x-gtar", |
267
|
|
|
|
|
|
|
hdf => "application/x-hdf", |
268
|
|
|
|
|
|
|
phtml => "application/x-httpd-php", |
269
|
|
|
|
|
|
|
pht => "application/x-httpd-php", |
270
|
|
|
|
|
|
|
php => "application/x-httpd-php", |
271
|
|
|
|
|
|
|
phps => "application/x-httpd-php-source", |
272
|
|
|
|
|
|
|
php3 => "application/x-httpd-php3", |
273
|
|
|
|
|
|
|
php3p => "application/x-httpd-php3-preprocessed", |
274
|
|
|
|
|
|
|
php4 => "application/x-httpd-php4", |
275
|
|
|
|
|
|
|
ica => "application/x-ica", |
276
|
|
|
|
|
|
|
ins => "application/x-internet-signup", |
277
|
|
|
|
|
|
|
isp => "application/x-internet-signup", |
278
|
|
|
|
|
|
|
iii => "application/x-iphone", |
279
|
|
|
|
|
|
|
iso => "application/x-iso9660-image", |
280
|
|
|
|
|
|
|
jnlp => "application/x-java-jnlp-file", |
281
|
|
|
|
|
|
|
js => "application/x-javascript", |
282
|
|
|
|
|
|
|
jmz => "application/x-jmol", |
283
|
|
|
|
|
|
|
chrt => "application/x-kchart", |
284
|
|
|
|
|
|
|
kil => "application/x-killustrator", |
285
|
|
|
|
|
|
|
skp => "application/x-koan", |
286
|
|
|
|
|
|
|
skd => "application/x-koan", |
287
|
|
|
|
|
|
|
skt => "application/x-koan", |
288
|
|
|
|
|
|
|
skm => "application/x-koan", |
289
|
|
|
|
|
|
|
kpr => "application/x-kpresenter", |
290
|
|
|
|
|
|
|
kpt => "application/x-kpresenter", |
291
|
|
|
|
|
|
|
ksp => "application/x-kspread", |
292
|
|
|
|
|
|
|
kwd => "application/x-kword", |
293
|
|
|
|
|
|
|
kwt => "application/x-kword", |
294
|
|
|
|
|
|
|
latex => "application/x-latex", |
295
|
|
|
|
|
|
|
lha => "application/x-lha", |
296
|
|
|
|
|
|
|
lyx => "application/x-lyx", |
297
|
|
|
|
|
|
|
lzh => "application/x-lzh", |
298
|
|
|
|
|
|
|
lzx => "application/x-lzx", |
299
|
|
|
|
|
|
|
frm => "application/x-maker", |
300
|
|
|
|
|
|
|
maker => "application/x-maker", |
301
|
|
|
|
|
|
|
frame => "application/x-maker", |
302
|
|
|
|
|
|
|
fm => "application/x-maker", |
303
|
|
|
|
|
|
|
fb => "application/x-maker", |
304
|
|
|
|
|
|
|
book => "application/x-maker", |
305
|
|
|
|
|
|
|
fbdoc => "application/x-maker", |
306
|
|
|
|
|
|
|
mif => "application/x-mif", |
307
|
|
|
|
|
|
|
wmd => "application/x-ms-wmd", |
308
|
|
|
|
|
|
|
wmz => "application/x-ms-wmz", |
309
|
|
|
|
|
|
|
com => "application/x-msdos-program", |
310
|
|
|
|
|
|
|
exe => "application/x-msdos-program", |
311
|
|
|
|
|
|
|
bat => "application/x-msdos-program", |
312
|
|
|
|
|
|
|
dll => "application/x-msdos-program", |
313
|
|
|
|
|
|
|
msi => "application/x-msi", |
314
|
|
|
|
|
|
|
nc => "application/x-netcdf", |
315
|
|
|
|
|
|
|
pac => "application/x-ns-proxy-autoconfig", |
316
|
|
|
|
|
|
|
nwc => "application/x-nwc", |
317
|
|
|
|
|
|
|
o => "application/x-object", |
318
|
|
|
|
|
|
|
oza => "application/x-oz-application", |
319
|
|
|
|
|
|
|
p7r => "application/x-pkcs7-certreqresp", |
320
|
|
|
|
|
|
|
crl => "application/x-pkcs7-crl", |
321
|
|
|
|
|
|
|
pyc => "application/x-python-code", |
322
|
|
|
|
|
|
|
pyo => "application/x-python-code", |
323
|
|
|
|
|
|
|
qtl => "application/x-quicktimeplayer", |
324
|
|
|
|
|
|
|
rpm => "application/x-redhat-package-manager", |
325
|
|
|
|
|
|
|
sh => "application/x-sh", |
326
|
|
|
|
|
|
|
shar => "application/x-shar", |
327
|
|
|
|
|
|
|
swf => "application/x-shockwave-flash", |
328
|
|
|
|
|
|
|
swfl => "application/x-shockwave-flash", |
329
|
|
|
|
|
|
|
sit => "application/x-stuffit", |
330
|
|
|
|
|
|
|
sitx => "application/x-stuffit", |
331
|
|
|
|
|
|
|
sv4cpio => "application/x-sv4cpio", |
332
|
|
|
|
|
|
|
sv4crc => "application/x-sv4crc", |
333
|
|
|
|
|
|
|
tar => "application/x-tar", |
334
|
|
|
|
|
|
|
tcl => "application/x-tcl", |
335
|
|
|
|
|
|
|
gf => "application/x-tex-gf", |
336
|
|
|
|
|
|
|
pk => "application/x-tex-pk", |
337
|
|
|
|
|
|
|
texinfo => "application/x-texinfo", |
338
|
|
|
|
|
|
|
texi => "application/x-texinfo", |
339
|
|
|
|
|
|
|
bak => "application/x-trash", |
340
|
|
|
|
|
|
|
old => "application/x-trash", |
341
|
|
|
|
|
|
|
sik => "application/x-trash", |
342
|
|
|
|
|
|
|
t => "application/x-troff", |
343
|
|
|
|
|
|
|
tr => "application/x-troff", |
344
|
|
|
|
|
|
|
roff => "application/x-troff", |
345
|
|
|
|
|
|
|
man => "application/x-troff-man", |
346
|
|
|
|
|
|
|
me => "application/x-troff-me", |
347
|
|
|
|
|
|
|
ms => "application/x-troff-ms", |
348
|
|
|
|
|
|
|
ustar => "application/x-ustar", |
349
|
|
|
|
|
|
|
src => "application/x-wais-source", |
350
|
|
|
|
|
|
|
wz => "application/x-wingz", |
351
|
|
|
|
|
|
|
crt => "application/x-x509-ca-cert", |
352
|
|
|
|
|
|
|
xcf => "application/x-xcf", |
353
|
|
|
|
|
|
|
fig => "application/x-xfig", |
354
|
|
|
|
|
|
|
xpi => "application/x-xpinstall", |
355
|
|
|
|
|
|
|
au => "audio/basic", |
356
|
|
|
|
|
|
|
snd => "audio/basic", |
357
|
|
|
|
|
|
|
mid => "audio/midi", |
358
|
|
|
|
|
|
|
midi => "audio/midi", |
359
|
|
|
|
|
|
|
kar => "audio/midi", |
360
|
|
|
|
|
|
|
mpga => "audio/mpeg", |
361
|
|
|
|
|
|
|
mpega => "audio/mpeg", |
362
|
|
|
|
|
|
|
mp2 => "audio/mpeg", |
363
|
|
|
|
|
|
|
mp3 => "audio/mpeg", |
364
|
|
|
|
|
|
|
m4a => "audio/mpeg", |
365
|
|
|
|
|
|
|
m3u => "audio/mpegurl", |
366
|
|
|
|
|
|
|
oga => "audio/ogg", |
367
|
|
|
|
|
|
|
spx => "audio/ogg", |
368
|
|
|
|
|
|
|
sid => "audio/prs.sid", |
369
|
|
|
|
|
|
|
aif => "audio/x-aiff", |
370
|
|
|
|
|
|
|
aiff => "audio/x-aiff", |
371
|
|
|
|
|
|
|
aifc => "audio/x-aiff", |
372
|
|
|
|
|
|
|
gsm => "audio/x-gsm", |
373
|
|
|
|
|
|
|
m3u => "audio/x-mpegurl", |
374
|
|
|
|
|
|
|
wma => "audio/x-ms-wma", |
375
|
|
|
|
|
|
|
wax => "audio/x-ms-wax", |
376
|
|
|
|
|
|
|
ra => "audio/x-pn-realaudio", |
377
|
|
|
|
|
|
|
rm => "audio/x-pn-realaudio", |
378
|
|
|
|
|
|
|
ram => "audio/x-pn-realaudio", |
379
|
|
|
|
|
|
|
ra => "audio/x-realaudio", |
380
|
|
|
|
|
|
|
pls => "audio/x-scpls", |
381
|
|
|
|
|
|
|
sd2 => "audio/x-sd2", |
382
|
|
|
|
|
|
|
wav => "audio/x-wav", |
383
|
|
|
|
|
|
|
alc => "chemical/x-alchemy", |
384
|
|
|
|
|
|
|
cac => "chemical/x-cache", |
385
|
|
|
|
|
|
|
cache => "chemical/x-cache", |
386
|
|
|
|
|
|
|
csf => "chemical/x-cache-csf", |
387
|
|
|
|
|
|
|
cbin => "chemical/x-cactvs-binary", |
388
|
|
|
|
|
|
|
cascii => "chemical/x-cactvs-binary", |
389
|
|
|
|
|
|
|
ctab => "chemical/x-cactvs-binary", |
390
|
|
|
|
|
|
|
cdx => "chemical/x-cdx", |
391
|
|
|
|
|
|
|
cer => "chemical/x-cerius", |
392
|
|
|
|
|
|
|
c3d => "chemical/x-chem3d", |
393
|
|
|
|
|
|
|
chm => "chemical/x-chemdraw", |
394
|
|
|
|
|
|
|
cif => "chemical/x-cif", |
395
|
|
|
|
|
|
|
cmdf => "chemical/x-cmdf", |
396
|
|
|
|
|
|
|
cml => "chemical/x-cml", |
397
|
|
|
|
|
|
|
cpa => "chemical/x-compass", |
398
|
|
|
|
|
|
|
bsd => "chemical/x-crossfire", |
399
|
|
|
|
|
|
|
csml => "chemical/x-csml", |
400
|
|
|
|
|
|
|
csm => "chemical/x-csml", |
401
|
|
|
|
|
|
|
ctx => "chemical/x-ctx", |
402
|
|
|
|
|
|
|
cxf => "chemical/x-cxf", |
403
|
|
|
|
|
|
|
cef => "chemical/x-cxf", |
404
|
|
|
|
|
|
|
emb => "chemical/x-embl-dl-nucleotide", |
405
|
|
|
|
|
|
|
embl => "chemical/x-embl-dl-nucleotide", |
406
|
|
|
|
|
|
|
spc => "chemical/x-galactic-spc", |
407
|
|
|
|
|
|
|
inp => "chemical/x-gamess-input", |
408
|
|
|
|
|
|
|
gam => "chemical/x-gamess-input", |
409
|
|
|
|
|
|
|
gamin => "chemical/x-gamess-input", |
410
|
|
|
|
|
|
|
fch => "chemical/x-gaussian-checkpoint", |
411
|
|
|
|
|
|
|
fchk => "chemical/x-gaussian-checkpoint", |
412
|
|
|
|
|
|
|
cub => "chemical/x-gaussian-cube", |
413
|
|
|
|
|
|
|
gau => "chemical/x-gaussian-input", |
414
|
|
|
|
|
|
|
gjc => "chemical/x-gaussian-input", |
415
|
|
|
|
|
|
|
gjf => "chemical/x-gaussian-input", |
416
|
|
|
|
|
|
|
gal => "chemical/x-gaussian-log", |
417
|
|
|
|
|
|
|
gcg => "chemical/x-gcg8-sequence", |
418
|
|
|
|
|
|
|
gen => "chemical/x-genbank", |
419
|
|
|
|
|
|
|
hin => "chemical/x-hin", |
420
|
|
|
|
|
|
|
istr => "chemical/x-isostar", |
421
|
|
|
|
|
|
|
ist => "chemical/x-isostar", |
422
|
|
|
|
|
|
|
jdx => "chemical/x-jcamp-dx", |
423
|
|
|
|
|
|
|
dx => "chemical/x-jcamp-dx", |
424
|
|
|
|
|
|
|
kin => "chemical/x-kinemage", |
425
|
|
|
|
|
|
|
mcm => "chemical/x-macmolecule", |
426
|
|
|
|
|
|
|
mmd => "chemical/x-macromodel-input", |
427
|
|
|
|
|
|
|
mmod => "chemical/x-macromodel-input", |
428
|
|
|
|
|
|
|
mol => "chemical/x-mdl-molfile", |
429
|
|
|
|
|
|
|
rd => "chemical/x-mdl-rdfile", |
430
|
|
|
|
|
|
|
rxn => "chemical/x-mdl-rxnfile", |
431
|
|
|
|
|
|
|
sd => "chemical/x-mdl-sdfile", |
432
|
|
|
|
|
|
|
sdf => "chemical/x-mdl-sdfile", |
433
|
|
|
|
|
|
|
tgf => "chemical/x-mdl-tgf", |
434
|
|
|
|
|
|
|
mcif => "chemical/x-mmcif", |
435
|
|
|
|
|
|
|
mol2 => "chemical/x-mol2", |
436
|
|
|
|
|
|
|
b => "chemical/x-molconn-Z", |
437
|
|
|
|
|
|
|
gpt => "chemical/x-mopac-graph", |
438
|
|
|
|
|
|
|
mop => "chemical/x-mopac-input", |
439
|
|
|
|
|
|
|
mopcrt => "chemical/x-mopac-input", |
440
|
|
|
|
|
|
|
mpc => "chemical/x-mopac-input", |
441
|
|
|
|
|
|
|
dat => "chemical/x-mopac-input", |
442
|
|
|
|
|
|
|
zmt => "chemical/x-mopac-input", |
443
|
|
|
|
|
|
|
moo => "chemical/x-mopac-out", |
444
|
|
|
|
|
|
|
mvb => "chemical/x-mopac-vib", |
445
|
|
|
|
|
|
|
asn => "chemical/x-ncbi-asn1", |
446
|
|
|
|
|
|
|
prt => "chemical/x-ncbi-asn1-ascii", |
447
|
|
|
|
|
|
|
ent => "chemical/x-ncbi-asn1-ascii", |
448
|
|
|
|
|
|
|
val => "chemical/x-ncbi-asn1-binary", |
449
|
|
|
|
|
|
|
aso => "chemical/x-ncbi-asn1-binary", |
450
|
|
|
|
|
|
|
asn => "chemical/x-ncbi-asn1-spec", |
451
|
|
|
|
|
|
|
pdb => "chemical/x-pdb", |
452
|
|
|
|
|
|
|
ent => "chemical/x-pdb", |
453
|
|
|
|
|
|
|
ros => "chemical/x-rosdal", |
454
|
|
|
|
|
|
|
sw => "chemical/x-swissprot", |
455
|
|
|
|
|
|
|
vms => "chemical/x-vamas-iso14976", |
456
|
|
|
|
|
|
|
vmd => "chemical/x-vmd", |
457
|
|
|
|
|
|
|
xtel => "chemical/x-xtel", |
458
|
|
|
|
|
|
|
xyz => "chemical/x-xyz", |
459
|
|
|
|
|
|
|
gif => "image/gif", |
460
|
|
|
|
|
|
|
ief => "image/ief", |
461
|
|
|
|
|
|
|
jpeg => "image/jpeg", |
462
|
|
|
|
|
|
|
jpg => "image/jpeg", |
463
|
|
|
|
|
|
|
jpe => "image/jpeg", |
464
|
|
|
|
|
|
|
pcx => "image/pcx", |
465
|
|
|
|
|
|
|
png => "image/png", |
466
|
|
|
|
|
|
|
svg => "image/svg+xml", |
467
|
|
|
|
|
|
|
svgz => "image/svg+xml", |
468
|
|
|
|
|
|
|
tiff => "image/tiff", |
469
|
|
|
|
|
|
|
tif => "image/tiff", |
470
|
|
|
|
|
|
|
djvu => "image/vnd.djvu", |
471
|
|
|
|
|
|
|
djv => "image/vnd.djvu", |
472
|
|
|
|
|
|
|
wbmp => "image/vnd.wap.wbmp", |
473
|
|
|
|
|
|
|
ras => "image/x-cmu-raster", |
474
|
|
|
|
|
|
|
cdr => "image/x-coreldraw", |
475
|
|
|
|
|
|
|
pat => "image/x-coreldrawpattern", |
476
|
|
|
|
|
|
|
cdt => "image/x-coreldrawtemplate", |
477
|
|
|
|
|
|
|
cpt => "image/x-corelphotopaint", |
478
|
|
|
|
|
|
|
ico => "image/x-icon", |
479
|
|
|
|
|
|
|
art => "image/x-jg", |
480
|
|
|
|
|
|
|
jng => "image/x-jng", |
481
|
|
|
|
|
|
|
bmp => "image/x-ms-bmp", |
482
|
|
|
|
|
|
|
psd => "image/x-photoshop", |
483
|
|
|
|
|
|
|
pnm => "image/x-portable-anymap", |
484
|
|
|
|
|
|
|
pbm => "image/x-portable-bitmap", |
485
|
|
|
|
|
|
|
pgm => "image/x-portable-graymap", |
486
|
|
|
|
|
|
|
ppm => "image/x-portable-pixmap", |
487
|
|
|
|
|
|
|
rgb => "image/x-rgb", |
488
|
|
|
|
|
|
|
xbm => "image/x-xbitmap", |
489
|
|
|
|
|
|
|
xpm => "image/x-xpixmap", |
490
|
|
|
|
|
|
|
xwd => "image/x-xwindowdump", |
491
|
|
|
|
|
|
|
eml => "message/rfc822", |
492
|
|
|
|
|
|
|
igs => "model/iges", |
493
|
|
|
|
|
|
|
iges => "model/iges", |
494
|
|
|
|
|
|
|
msh => "model/mesh", |
495
|
|
|
|
|
|
|
mesh => "model/mesh", |
496
|
|
|
|
|
|
|
silo => "model/mesh", |
497
|
|
|
|
|
|
|
wrl => "model/vrml", |
498
|
|
|
|
|
|
|
vrml => "model/vrml", |
499
|
|
|
|
|
|
|
ics => "text/calendar", |
500
|
|
|
|
|
|
|
icz => "text/calendar", |
501
|
|
|
|
|
|
|
css => "text/css", |
502
|
|
|
|
|
|
|
csv => "text/csv", |
503
|
|
|
|
|
|
|
323 => "text/h323", |
504
|
|
|
|
|
|
|
html => "text/html", |
505
|
|
|
|
|
|
|
htm => "text/html", |
506
|
|
|
|
|
|
|
shtml => "text/html", |
507
|
|
|
|
|
|
|
uls => "text/iuls", |
508
|
|
|
|
|
|
|
mml => "text/mathml", |
509
|
|
|
|
|
|
|
asc => "text/plain", |
510
|
|
|
|
|
|
|
txt => "text/plain", |
511
|
|
|
|
|
|
|
text => "text/plain", |
512
|
|
|
|
|
|
|
pot => "text/plain", |
513
|
|
|
|
|
|
|
rtx => "text/richtext", |
514
|
|
|
|
|
|
|
sct => "text/scriptlet", |
515
|
|
|
|
|
|
|
wsc => "text/scriptlet", |
516
|
|
|
|
|
|
|
tm => "text/texmacs", |
517
|
|
|
|
|
|
|
ts => "text/texmacs", |
518
|
|
|
|
|
|
|
tsv => "text/tab-separated-values", |
519
|
|
|
|
|
|
|
jad => "text/vnd.sun.j2me.app-descriptor", |
520
|
|
|
|
|
|
|
wml => "text/vnd.wap.wml", |
521
|
|
|
|
|
|
|
wmls => "text/vnd.wap.wmlscript", |
522
|
|
|
|
|
|
|
bib => "text/x-bibtex", |
523
|
|
|
|
|
|
|
boo => "text/x-boo", |
524
|
|
|
|
|
|
|
'h++' => "text/x-c++hdr", |
525
|
|
|
|
|
|
|
hpp => "text/x-c++hdr", |
526
|
|
|
|
|
|
|
hxx => "text/x-c++hdr", |
527
|
|
|
|
|
|
|
hh => "text/x-c++hdr", |
528
|
|
|
|
|
|
|
'c++' => "text/x-c++src", |
529
|
|
|
|
|
|
|
cpp => "text/x-c++src", |
530
|
|
|
|
|
|
|
cxx => "text/x-c++src", |
531
|
|
|
|
|
|
|
cc => "text/x-c++src", |
532
|
|
|
|
|
|
|
h => "text/x-chdr", |
533
|
|
|
|
|
|
|
htc => "text/x-component", |
534
|
|
|
|
|
|
|
csh => "text/x-csh", |
535
|
|
|
|
|
|
|
c => "text/x-csrc", |
536
|
|
|
|
|
|
|
d => "text/x-dsrc", |
537
|
|
|
|
|
|
|
diff => "text/x-diff", |
538
|
|
|
|
|
|
|
patch => "text/x-diff", |
539
|
|
|
|
|
|
|
hs => "text/x-haskell", |
540
|
|
|
|
|
|
|
java => "text/x-java", |
541
|
|
|
|
|
|
|
lhs => "text/x-literate-haskell", |
542
|
|
|
|
|
|
|
moc => "text/x-moc", |
543
|
|
|
|
|
|
|
p => "text/x-pascal", |
544
|
|
|
|
|
|
|
pas => "text/x-pascal", |
545
|
|
|
|
|
|
|
gcd => "text/x-pcs-gcd", |
546
|
|
|
|
|
|
|
pl => "text/x-perl", |
547
|
|
|
|
|
|
|
pm => "text/x-perl", |
548
|
|
|
|
|
|
|
py => "text/x-python", |
549
|
|
|
|
|
|
|
etx => "text/x-setext", |
550
|
|
|
|
|
|
|
sh => "text/x-sh", |
551
|
|
|
|
|
|
|
tcl => "text/x-tcl", |
552
|
|
|
|
|
|
|
tk => "text/x-tcl", |
553
|
|
|
|
|
|
|
tex => "text/x-tex", |
554
|
|
|
|
|
|
|
ltx => "text/x-tex", |
555
|
|
|
|
|
|
|
sty => "text/x-tex", |
556
|
|
|
|
|
|
|
cls => "text/x-tex", |
557
|
|
|
|
|
|
|
vcs => "text/x-vcalendar", |
558
|
|
|
|
|
|
|
vcf => "text/x-vcard", |
559
|
|
|
|
|
|
|
'3gp' => "video/3gpp", |
560
|
|
|
|
|
|
|
dl => "video/dl", |
561
|
|
|
|
|
|
|
dif => "video/dv", |
562
|
|
|
|
|
|
|
dv => "video/dv", |
563
|
|
|
|
|
|
|
fli => "video/fli", |
564
|
|
|
|
|
|
|
gl => "video/gl", |
565
|
|
|
|
|
|
|
mpeg => "video/mpeg", |
566
|
|
|
|
|
|
|
mpg => "video/mpeg", |
567
|
|
|
|
|
|
|
mpe => "video/mpeg", |
568
|
|
|
|
|
|
|
mp4 => "video/mp4", |
569
|
|
|
|
|
|
|
ogv => "video/ogg", |
570
|
|
|
|
|
|
|
qt => "video/quicktime", |
571
|
|
|
|
|
|
|
mov => "video/quicktime", |
572
|
|
|
|
|
|
|
mxu => "video/vnd.mpegurl", |
573
|
|
|
|
|
|
|
lsf => "video/x-la-asf", |
574
|
|
|
|
|
|
|
lsx => "video/x-la-asf", |
575
|
|
|
|
|
|
|
mng => "video/x-mng", |
576
|
|
|
|
|
|
|
asf => "video/x-ms-asf", |
577
|
|
|
|
|
|
|
asx => "video/x-ms-asf", |
578
|
|
|
|
|
|
|
wm => "video/x-ms-wm", |
579
|
|
|
|
|
|
|
wmv => "video/x-ms-wmv", |
580
|
|
|
|
|
|
|
wmx => "video/x-ms-wmx", |
581
|
|
|
|
|
|
|
wvx => "video/x-ms-wvx", |
582
|
|
|
|
|
|
|
avi => "video/x-msvideo", |
583
|
|
|
|
|
|
|
movie => "video/x-sgi-movie", |
584
|
|
|
|
|
|
|
ice => "x-conference/x-cooltalk", |
585
|
|
|
|
|
|
|
sisx => "x-epoc/x-sisx-app", |
586
|
|
|
|
|
|
|
vrm => "x-world/x-vrml", |
587
|
|
|
|
|
|
|
vrml => "x-world/x-vrml", |
588
|
|
|
|
|
|
|
wrl => "x-world/x-vrml", |
589
|
|
|
|
|
|
|
)} |
590
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
1; |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
__END__ |