You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2011/05/03 14:12:35 UTC
svn commit: r1099032 - in /tomcat/trunk/res/scripts: ./ check-mime.pl
Author: rjung
Date: Tue May 3 12:12:35 2011
New Revision: 1099032
URL: http://svn.apache.org/viewvc?rev=1099032&view=rev
Log:
Add a script to check web.xml and httpd mime.types
for differences.
Added:
tomcat/trunk/res/scripts/
tomcat/trunk/res/scripts/check-mime.pl (with props)
Added: tomcat/trunk/res/scripts/check-mime.pl
URL: http://svn.apache.org/viewvc/tomcat/trunk/res/scripts/check-mime.pl?rev=1099032&view=auto
==============================================================================
--- tomcat/trunk/res/scripts/check-mime.pl (added)
+++ tomcat/trunk/res/scripts/check-mime.pl Tue May 3 12:12:35 2011
@@ -0,0 +1,410 @@
+#!/usr/bin/perl
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Merge the MIME type definitions contained in the
+# file mime.types from the httpd project into Tomcat web.xml.
+#
+# $Id$
+# -----------------------------------------------------------------------------
+
+# The script uses two mime type lists to describe
+# the merging between httpd and Tomcat mime types.
+#
+# 1) %TOMCAT_ONLY: Additional extensions for Tomcat that do not exist in httpd
+# 2) %TOMCAT_KEEP: Mime type differences for common extensions where we stick to
+# the Tomcat definition
+
+# The script checks consistency between Tomcat and httpd according
+# to the lists 1) and 2) and generates a new web.xml:
+#
+# A) Additional extensions in Tomcat which are not part of 1)
+# are logged. They will be removed in the generated new web.xml.
+# If you want to keep them, add them to the list 1) and run the
+# script again. If you want to remove them, commit the generated
+# new web.xml.
+# B) Mime type differences for the same extension between httpd
+# and Tomcat that are not part of the list 2) are logged.
+# They will be overwritten wit the httpd definition in the generated
+# new web.xml. If you want to keep their Tomcat definition, add them
+# to the list 1) and run the script again. If you want to use the
+# definitions from httpd, commit the generated new web.xml.
+# C) Additional extensions in httpd are logged. The script outputs a
+# merged web.xml, which already includes all those additional
+# extensions. If you want to keep them, update web.xml with the
+# generated new web.xml.
+# D) If the extensions are not sorted alphabetically, a message is logged.
+# The generated web.xml will be always be sorted alphabetically.
+# If you want to fix the sort order, update web.xml with the generated
+# new web.xml.
+
+use strict;
+use locale;
+use POSIX qw(locale_h);
+use Getopt::Std;
+
+################### BEGIN VARIABLES WHICH MUST BE MAINTAINED #####################
+
+# Script version, printed via getopts with "--version"
+$main::VERSION = '1.0';
+
+# Locale used via LC_COLLATE when sorting extensions
+my $LOCALE = 'en.UTF-8';
+
+# Mime types that are part of the Tomcat
+# configuration, but missing from httpd
+
+my %TOMCAT_ONLY = qw(
+ abs audio/x-mpeg
+ aim application/x-aim
+ anx application/annodex
+ art image/x-jg
+ avx video/x-rad-screenplay
+ axa audio/annodex
+ axv video/annodex
+ body text/html
+ dib image/bmp
+ dv video/x-dv
+ flac audio/flac
+ gz application/x-gzip
+ hqx application/mac-binhex40
+ htc text/x-component
+ jsf text/plain
+ jspf text/plain
+ m4a audio/mp4
+ m4b audio/mp4
+ m4r audio/mp4
+ mp1 audio/mpeg
+ mpa audio/mpeg
+ mac image/x-macpaint
+ mpega audio/x-mpeg
+ mpv2 video/mpeg2
+ pict image/pict
+ pnt image/x-macpaint
+ qti image/x-quicktime
+ qtif image/x-quicktime
+ shtml text/x-server-parsed-html
+ ulw audio/basic
+ z application/x-compress
+ Z application/x-compress
+);
+
+# Mime types, that are defined differently
+# in Tomcat than in httpd
+
+my %TOMCAT_KEEP = qw(
+ cdf application/x-cdf
+ class application/java
+ exe application/octet-stream
+ m4v video/mp4
+ mif application/x-mif
+ pct image/pict
+ pic image/pict
+ pls audio/x-scpls
+);
+
+################### END VARIABLES WHICH MUST BE MAINTAINED #####################
+
+# Global data variables
+# Mime type definitions from httpd
+my %httpd;
+# Mime type definitions from Tomcat
+my %tomcat;
+# Comments found when parsing mime type definitions
+my %tomcat_comments;
+# Is the whole mime type commented out?
+my %tomcat_commented;
+# List of extensions found in the original order
+my @tomcat_extensions;
+# Text in web.xml before and after the mime-type definitions
+my $tomcat_pre; my $tomcat_post;
+
+
+# Helper variables
+my $i;
+my $line;
+my @cols;
+my $extension;
+my $type;
+my $comment;
+my $commented;
+my $check;
+my $msg;
+
+
+# Usage/Help
+sub HELP_MESSAGE {
+ my $fh = shift;
+ print $fh "Usage:: $0 -m MIMEFILE -i INPUTFILE -o OUTPUTFILE\n";
+ print $fh " MIMEFILE: path to mime.types from the httpd project\n";
+ print $fh " INPUTFILE: path to existing web.xml, which will be checked\n";
+ print $fh " OUTPUTFILE: path to the new (generated) web.xml. Any existing\n";
+ print $fh " file will be overwritten.\n";
+}
+
+
+# Parse arguments:
+# -m: mime.types file (httpd) to use
+# -i: input web.xml file to check
+# -o: output web.xml file (gets generated and overwritten)
+
+$Getopt::Std::STANDARD_HELP_VERSION = 1;
+our($opt_m, $opt_i, $opt_o);
+getopts('m:i:o:');
+
+
+# Check whether mandatory arguments are given
+if ($opt_m eq '' || $opt_i eq '' || $opt_o eq '') {
+ HELP_MESSAGE(*STDOUT);
+ exit 1;
+}
+
+
+# Switch locale for alphabetical ordering
+setlocale(LC_COLLATE, $LOCALE);
+
+# Read and parse httpd mime.types, build up hash extension->mime-type
+open(MIMETYPES, "<$opt_m") or die "Could not open file '$opt_m' for read - Aborting!";
+while (<MIMETYPES>) {
+ chomp($_);
+ $line = $_;
+ $line =~ s/#.*//;
+ $line =~ s/^\s+//;
+ if ($line ne '') {
+ @cols = split(/\s+/, $line);
+ if ($#cols > 0) {
+ for ($i=1; $i <= $#cols; $i++) {
+ $httpd{$cols[$i]} = $cols[0];
+ }
+ } else {
+ print STDERR "WARN mime.types line ignored: $_\n";
+ }
+ }
+}
+close(MIMETYPES);
+
+# Read and parse web.xml, build up hash extension->mime-type
+# and store the file parts form before and after mime mappings.
+open(WEBXML, "<$opt_i") or die "Could not open file '$opt_i' for read - Aborting!";
+
+# Skip and record all lines before the first mime type definition.
+# Because of comment handling we need to read one line ahead.
+$line = '';
+while (<WEBXML>) {
+ if ($_ !~ /<mime-mapping>/) {
+ $tomcat_pre .= $line;
+ } else {
+ last;
+ }
+ $line = $_;
+}
+
+$commented = 0;
+# If the previous line was start of a comment
+# set marker, else add it to pre.
+if ($line =~ /^\s*<!--[^>]*$/) {
+ $commented = 1;
+} else {
+ $tomcat_pre .= $line;
+}
+
+# Now we parse blocks of the form:
+# <mime-mapping>
+# <extension>abs</extension>
+# <mime-type>audio/x-mpeg</mime-type>
+# </mime-mapping>
+# Optional single comment lines directly after "<mime-mapping>"
+# are allowed. The whole block is also allowed to be commented out.
+
+while ($_ =~ /^\s*<mime-mapping>\s*$/) {
+ $_ = <WEBXML>;
+ chomp($_);
+ $comment = '';
+ if ($_ =~ /^\s*<!--([^>]*)-->\s*$/) {
+ $comment = $1;
+ $_ = <WEBXML>;
+ chomp($_);
+ }
+ if ($_ =~ /^\s*<extension>([^<]*)<\/extension>\s*$/ ) {
+ $extension = $1;
+ $extension =~ s/^\s+//;
+ $extension =~ s/\s+$//;
+ } else {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected <extension>...</extension>', got '$_' - Aborting!\n";
+ close(WEBXML);
+ exit 2;
+ }
+ $_ = <WEBXML>;
+ chomp($_);
+ if ($_ =~ /^\s*<mime-type>([^<]*)<\/mime-type>\s*$/ ) {
+ $type = $1;
+ $type =~ s/^\s+//;
+ $type =~ s/\s+$//;
+ if (exists($tomcat{$extension}) && $tomcat{$extension} ne $type) {
+ print STDERR "WARN MIME mapping redefinition detected!\n";
+ print STDERR "WARN Kept '$extension' -> '$tomcat{$extension}'\n";
+ print STDERR "WARN Ignored '$extension' -> '$type'\n";
+ } else {
+ $tomcat{$extension} = $type;
+ if ($comment ne '') {
+ $tomcat_comments{$extension} = $comment;
+ }
+ if ($commented) {
+ $tomcat_commented{$extension} = 1;
+ }
+ push(@tomcat_extensions, $extension);
+ }
+ } else {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected <mime-type>...</mime-type>', got '$_' - Aborting!\n";
+ close(WEBXML);
+ exit 3;
+ }
+ $_ = <WEBXML>;
+ chomp($_);
+ if ($_ !~ /^\s*<\/mime-mapping>\s*$/) {
+ print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
+ print STDERR "ERROR Expected '</mime-mapping>', got '$_' - Aborting!\n";
+ close(WEBXML);
+ exit 4;
+ }
+ $_ = <WEBXML>;
+ # Check for comment closure
+ if ($commented && $_ =~ /^[^<]*-->\s*$/) {
+ $commented = 0;
+ $_ = <WEBXML>;
+ }
+ # Check for comment opening
+ if ($_ =~ /^\s*<!--[^>]*$/) {
+ $commented = 1;
+ $line = $_;
+ $_ = <WEBXML>;
+ }
+}
+
+# Add back the last comment line already digested
+if ($commented) {
+ $tomcat_post = $line;
+}
+
+# Read and record the remaining lines
+$tomcat_post .= $_;
+while (<WEBXML>) {
+ if ($_ =~ /<mime-mapping>/) {
+ print STDERR "ERROR mime-mapping blocks are not consecutive\n";
+ print STDERR "ERROR See line $. in $opt_i - Aborting!\n";
+ close(WEBXML);
+ exit 5;
+ }
+ $tomcat_post .= $_;
+}
+
+close(WEBXML);
+
+
+# Look for extensions existing for Tomcat but not for httpd.
+# Log them if they are not in TOMCAT_ONLY
+for $extension (@tomcat_extensions) {
+ if (!exists($httpd{$extension})) {
+ if (!exists($TOMCAT_ONLY{$extension})) {
+ print STDERR "WARN Extension '$extension' found in web.xml but not in mime.types is missing from TOMCAT_ONLY list.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be removed from generated web.xml.\n";
+ } elsif ($tomcat{$extension} ne $TOMCAT_ONLY{$extension}) {
+ print STDERR "WARN Additional extension '$extension' allowed by TOMCAT_ONLY list, but has new definition.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
+ " by '$extension' -> '$TOMCAT_ONLY{$extension}' in generated web.xml.\n";
+ }
+ }
+}
+
+
+# Look for extensions with inconsistent mime types for Tomcat and httpd.
+# Log them if they are not in TOMCAT_KEEP
+for $extension (@tomcat_extensions) {
+ if (exists($httpd{$extension}) && $tomcat{$extension} ne $httpd{$extension}) {
+ if (!exists($TOMCAT_KEEP{$extension})) {
+ print STDERR "WARN Mapping '$extension' inconsistency is missing from TOMCAT_KEEP list.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
+ " by '$extension' -> '$httpd{$extension}' in generated web.xml.\n";
+ } elsif ($tomcat{$extension} ne $TOMCAT_KEEP{$extension}) {
+ print STDERR "WARN Extension '$extension' inconsistency allowed by TOMCAT_KEEP list, but has new definition.\n";
+ print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
+ " by '$extension' -> '$TOMCAT_KEEP{$extension}' in generated web.xml.\n";
+ }
+ }
+}
+
+
+# Log if extensions in web.xml are not sorted alphabetically.
+$check = 0;
+$msg = '';
+for ($i=1; $i <= $#tomcat_extensions; $i++) {
+ if ($tomcat_extensions[$i - 1] ge $tomcat_extensions[$i]) {
+ $check = 1;
+ $msg .= "WARN Extension '" . $tomcat_extensions[$i - 1] . "' defined before '" . $tomcat_extensions[$i] . "'\n";
+ }
+}
+if ($check) {
+ print STDERR "WARN MIME type definitions in web.xml were not sorted alphabetically by extension\n";
+ print STDERR $msg;
+ print STDERR "WARN This will be fixed in the new generated web.xml file '$opt_o'.\n";
+}
+
+
+# Log all extensions defined for httpd but not for Tomcat
+for $extension (sort keys %httpd) {
+ if (!exists($tomcat{$extension})) {
+ print STDERR "INFO Extension '$extension' found for httpd, but not for Tomcat.\n";
+ print STDERR "INFO Definition '$extension' -> '$httpd{$extension}' will be added" .
+ " to the generated web.xml.\n";
+ }
+}
+
+
+# Generate new web.xml:
+# - Use definitions from httpd
+# - Add TOMCAT_ONLY
+# - Fix TOMCAT_KEEP
+# - output tomcat_pre, sorted mime-mappings, tomcat_post.
+for $extension (keys %TOMCAT_ONLY) {
+ $httpd{$extension} = $TOMCAT_ONLY{$extension};
+}
+for $extension (keys %TOMCAT_KEEP) {
+ $httpd{$extension} = $TOMCAT_KEEP{$extension};
+}
+open (NEW, ">$opt_o") or die "Could not open file '$opt_o' for write - Aborting!";
+print NEW $tomcat_pre;
+for $extension (sort keys %httpd) {
+ if (exists($tomcat_commented{$extension})) {
+ print NEW " <!--\n";
+ }
+ print NEW " <mime-mapping>\n";
+ if (exists($tomcat_comments{$extension})) {
+ print NEW " <!--$tomcat_comments{$extension}-->\n";
+ }
+ print NEW " <extension>$extension</extension>\n";
+ print NEW " <mime-type>$httpd{$extension}</mime-type>\n";
+ print NEW " </mime-mapping>\n";
+ if (exists($tomcat_commented{$extension})) {
+ print NEW " -->\n";
+ }
+}
+print NEW $tomcat_post;
+close(NEW);
+print "New file '$opt_o' has been written.\n";
+
Propchange: tomcat/trunk/res/scripts/check-mime.pl
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tomcat/trunk/res/scripts/check-mime.pl
------------------------------------------------------------------------------
svn:executable = *
Propchange: tomcat/trunk/res/scripts/check-mime.pl
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r1099032 - in /tomcat/trunk/res/scripts: ./
check-mime.pl
Posted by Felix Schumacher <fe...@internetallee.de>.
Hi Rainer,
Am Sonntag, den 08.05.2011, 14:20 +0200 schrieb Rainer Jung:
> Hi Felix,
>
> TMTOWTDI. For standalone scripts I don't care very much about style.
right :)
> Let's see below ...
>
> On 08.05.2011 13:17, Felix Schumacher wrote:
> > Hi Rainer,
> >
> >> +
> >> +# Parse arguments:
> >> +# -m: mime.types file (httpd) to use
> >> +# -i: input web.xml file to check
> >> +# -o: output web.xml file (gets generated and overwritten)
> >> +
> >> +$Getopt::Std::STANDARD_HELP_VERSION = 1;
> >> +our($opt_m, $opt_i, $opt_o);
> > Why should those options be visible by everyone outside this package?
> > 'my' should be enough:
> > my ($opt_m, $opt_i, $opt_o);
>
> Doesn't work. Seems getopts needs "our".
I tried it and I thougt it works, but you are right. In my tests it eats
$opt_m if used with my, the other parameters are set though :( I usually
use getopt with a hash reference...
But enough of those bagatelles.
Regards
Felix
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r1099032 - in /tomcat/trunk/res/scripts: ./ check-mime.pl
Posted by Rainer Jung <ra...@kippdata.de>.
Hi Felix,
TMTOWTDI. For standalone scripts I don't care very much about style.
Let's see below ...
On 08.05.2011 13:17, Felix Schumacher wrote:
> Hi Rainer,
>
> Am Dienstag, den 03.05.2011, 12:12 +0000 schrieb rjung@apache.org:
>> Author: rjung
>> Date: Tue May 3 12:12:35 2011
>> New Revision: 1099032
>>
>> URL: http://svn.apache.org/viewvc?rev=1099032&view=rev
>> Log:
>> Add a script to check web.xml and httpd mime.types
>> for differences.
>>
>> Added:
>> tomcat/trunk/res/scripts/
>> tomcat/trunk/res/scripts/check-mime.pl (with props)
>>
>> Added: tomcat/trunk/res/scripts/check-mime.pl
>> URL: http://svn.apache.org/viewvc/tomcat/trunk/res/scripts/check-mime.pl?rev=1099032&view=auto
>> ==============================================================================
>> --- tomcat/trunk/res/scripts/check-mime.pl (added)
>> +++ tomcat/trunk/res/scripts/check-mime.pl Tue May 3 12:12:35 2011
>> @@ -0,0 +1,410 @@
>> +#!/usr/bin/perl
>> +
> ...
>> +# Script version, printed via getopts with "--version"
>> +$main::VERSION = '1.0';
> Any reason for not using 'our' like
> our $VERSION = '1.0'; ?
Done.
>> +
> ...
>> +
>> +# Parse arguments:
>> +# -m: mime.types file (httpd) to use
>> +# -i: input web.xml file to check
>> +# -o: output web.xml file (gets generated and overwritten)
>> +
>> +$Getopt::Std::STANDARD_HELP_VERSION = 1;
>> +our($opt_m, $opt_i, $opt_o);
> Why should those options be visible by everyone outside this package?
> 'my' should be enough:
> my ($opt_m, $opt_i, $opt_o);
Doesn't work. Seems getopts needs "our".
>> +getopts('m:i:o:');
>> +
>> +
>> +# Check whether mandatory arguments are given
>> +if ($opt_m eq '' || $opt_i eq '' || $opt_o eq '') {
>> + HELP_MESSAGE(*STDOUT);
>> + exit 1;
>> +}
>> +
>> +
>> +# Switch locale for alphabetical ordering
>> +setlocale(LC_COLLATE, $LOCALE);
>> +
>> +# Read and parse httpd mime.types, build up hash extension->mime-type
>> +open(MIMETYPES, "<$opt_m") or die "Could not open file '$opt_m' for read - Aborting!";
> You could use three param open and use lexical filehandles like
> open my $mimetpyes_fh, '<', $opt_m or die "...";
DONE
>> +while (<MIMETYPES>) {
>> + chomp($_);
>> + $line = $_;
> while (my $line =<$mimetypes_fh>) {
> chomp($line);
Keep as is, because I used the original line in the below WARN message.
>> + $line =~ s/#.*//;
>> + $line =~ s/^\s+//;
>> + if ($line ne '') {
>> + @cols = split(/\s+/, $line);
>> + if ($#cols> 0) {
>> + for ($i=1; $i<= $#cols; $i++) {
>> + $httpd{$cols[$i]} = $cols[0];
>> + }
>> + } else {
>> + print STDERR "WARN mime.types line ignored: $_\n";
>> + }
>> + }
>> +}
>> +close(MIMETYPES);
>>
>
> ($mimetype, @endings) = split(/\s+/, $line);
> if (@endings> 0) {
> for my $ending (@endings) {
> $httpd{$ending} = $mimetype;
> }
> } else {
> print STDERR "WARN mime.types line ignored: $_\n";
> }
> close $mimetypes_fh;
>
> would be possible also.
DONE
>> +
>> +# Read and parse web.xml, build up hash extension->mime-type
>> +# and store the file parts form before and after mime mappings.
>> +open(WEBXML, "<$opt_i") or die "Could not open file '$opt_i' for read - Aborting!";
> three-params open could be used again.
>
>> +
>> +# Skip and record all lines before the first mime type definition.
>> +# Because of comment handling we need to read one line ahead.
>> +$line = '';
>> +while (<WEBXML>) {
>> + if ($_ !~ /<mime-mapping>/) {
>> + $tomcat_pre .= $line;
>> + } else {
>> + last;
>> + }
>> + $line = $_;
>> +}
>> +
>> +$commented = 0;
>> +# If the previous line was start of a comment
>> +# set marker, else add it to pre.
>> +if ($line =~ /^\s*<!--[^>]*$/) {
>> + $commented = 1;
>> +} else {
>> + $tomcat_pre .= $line;
>> +}
>> +
>> +# Now we parse blocks of the form:
>> +#<mime-mapping>
>> +#<extension>abs</extension>
>> +#<mime-type>audio/x-mpeg</mime-type>
>> +#</mime-mapping>
>> +# Optional single comment lines directly after "<mime-mapping>"
>> +# are allowed. The whole block is also allowed to be commented out.
>> +
>> +while ($_ =~ /^\s*<mime-mapping>\s*$/) {
>> + $_ =<WEBXML>;
>> + chomp($_);
>> + $comment = '';
>> + if ($_ =~ /^\s*<!--([^>]*)-->\s*$/) {
>> + $comment = $1;
>> + $_ =<WEBXML>;
>> + chomp($_);
>> + }
>> + if ($_ =~ /^\s*<extension>([^<]*)<\/extension>\s*$/ ) {
>> + $extension = $1;
>> + $extension =~ s/^\s+//;
>> + $extension =~ s/\s+$//;
>> + } else {
>> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
>> + print STDERR "ERROR Expected<extension>...</extension>', got '$_' - Aborting!\n";
>> + close(WEBXML);
>> + exit 2;
>> + }
>> + $_ =<WEBXML>;
>> + chomp($_);
>> + if ($_ =~ /^\s*<mime-type>([^<]*)<\/mime-type>\s*$/ ) {
>> + $type = $1;
>> + $type =~ s/^\s+//;
>> + $type =~ s/\s+$//;
>> + if (exists($tomcat{$extension})&& $tomcat{$extension} ne $type) {
>> + print STDERR "WARN MIME mapping redefinition detected!\n";
>> + print STDERR "WARN Kept '$extension' -> '$tomcat{$extension}'\n";
>> + print STDERR "WARN Ignored '$extension' -> '$type'\n";
>> + } else {
>> + $tomcat{$extension} = $type;
>> + if ($comment ne '') {
>> + $tomcat_comments{$extension} = $comment;
>> + }
>> + if ($commented) {
>> + $tomcat_commented{$extension} = 1;
>> + }
>> + push(@tomcat_extensions, $extension);
>> + }
>> + } else {
>> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
>> + print STDERR "ERROR Expected<mime-type>...</mime-type>', got '$_' - Aborting!\n";
>> + close(WEBXML);
>> + exit 3;
>> + }
>> + $_ =<WEBXML>;
>> + chomp($_);
>> + if ($_ !~ /^\s*<\/mime-mapping>\s*$/) {
>> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
>> + print STDERR "ERROR Expected '</mime-mapping>', got '$_' - Aborting!\n";
>> + close(WEBXML);
>> + exit 4;
>> + }
>> + $_ =<WEBXML>;
>> + # Check for comment closure
>> + if ($commented&& $_ =~ /^[^<]*-->\s*$/) {
>> + $commented = 0;
>> + $_ =<WEBXML>;
>> + }
>> + # Check for comment opening
>> + if ($_ =~ /^\s*<!--[^>]*$/) {
>> + $commented = 1;
>> + $line = $_;
>> + $_ =<WEBXML>;
>> + }
>> +}
>> +
>> +# Add back the last comment line already digested
>> +if ($commented) {
>> + $tomcat_post = $line;
>> +}
>> +
>> +# Read and record the remaining lines
>> +$tomcat_post .= $_;
>> +while (<WEBXML>) {
>> + if ($_ =~ /<mime-mapping>/) {
>> + print STDERR "ERROR mime-mapping blocks are not consecutive\n";
>> + print STDERR "ERROR See line $. in $opt_i - Aborting!\n";
>> + close(WEBXML);
>> + exit 5;
>> + }
>> + $tomcat_post .= $_;
>> +}
>> +
>> +close(WEBXML);
>> +
>> +
>> +# Look for extensions existing for Tomcat but not for httpd.
>> +# Log them if they are not in TOMCAT_ONLY
>> +for $extension (@tomcat_extensions) {
>> + if (!exists($httpd{$extension})) {
>> + if (!exists($TOMCAT_ONLY{$extension})) {
>> + print STDERR "WARN Extension '$extension' found in web.xml but not in mime.types is missing from TOMCAT_ONLY list.\n";
>> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be removed from generated web.xml.\n";
>> + } elsif ($tomcat{$extension} ne $TOMCAT_ONLY{$extension}) {
>> + print STDERR "WARN Additional extension '$extension' allowed by TOMCAT_ONLY list, but has new definition.\n";
>> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
>> + " by '$extension' -> '$TOMCAT_ONLY{$extension}' in generated web.xml.\n";
>> + }
>> + }
>> +}
>> +
>> +
>> +# Look for extensions with inconsistent mime types for Tomcat and httpd.
>> +# Log them if they are not in TOMCAT_KEEP
>> +for $extension (@tomcat_extensions) {
>> + if (exists($httpd{$extension})&& $tomcat{$extension} ne $httpd{$extension}) {
>> + if (!exists($TOMCAT_KEEP{$extension})) {
>> + print STDERR "WARN Mapping '$extension' inconsistency is missing from TOMCAT_KEEP list.\n";
>> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
>> + " by '$extension' -> '$httpd{$extension}' in generated web.xml.\n";
>> + } elsif ($tomcat{$extension} ne $TOMCAT_KEEP{$extension}) {
>> + print STDERR "WARN Extension '$extension' inconsistency allowed by TOMCAT_KEEP list, but has new definition.\n";
>> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
>> + " by '$extension' -> '$TOMCAT_KEEP{$extension}' in generated web.xml.\n";
>> + }
>> + }
>> +}
>> +
>> +
>> +# Log if extensions in web.xml are not sorted alphabetically.
>> +$check = 0;
>> +$msg = '';
>> +for ($i=1; $i<= $#tomcat_extensions; $i++) {
>> + if ($tomcat_extensions[$i - 1] ge $tomcat_extensions[$i]) {
>> + $check = 1;
>> + $msg .= "WARN Extension '" . $tomcat_extensions[$i - 1] . "' defined before '" . $tomcat_extensions[$i] . "'\n";
>> + }
>> +}
> my $last_line = $tomcat_extensions[0];
> for my $current_line (@tomcat_extensions) {
> if ($last_line ge $current_line) {
> $check = 1;
> $msg .= "WARN Extension '$last_line' defined before
> '$current_line'\n";
> }
> $last_line = $current_line;
> }
>
DONE
> Not really shorter, but we don't have to look up array elements.
>> +if ($check) {
> We could check for $msg and get rid of $check.
DONE
>> + print STDERR "WARN MIME type definitions in web.xml were not sorted alphabetically by extension\n";
>> + print STDERR $msg;
>> + print STDERR "WARN This will be fixed in the new generated web.xml file '$opt_o'.\n";
>> +}
>> +
>> +
>> +# Log all extensions defined for httpd but not for Tomcat
>> +for $extension (sort keys %httpd) {
>> + if (!exists($tomcat{$extension})) {
>> + print STDERR "INFO Extension '$extension' found for httpd, but not for Tomcat.\n";
>> + print STDERR "INFO Definition '$extension' -> '$httpd{$extension}' will be added" .
>> + " to the generated web.xml.\n";
>> + }
>> +}
>> +
>> +
>> +# Generate new web.xml:
>> +# - Use definitions from httpd
>> +# - Add TOMCAT_ONLY
>> +# - Fix TOMCAT_KEEP
>> +# - output tomcat_pre, sorted mime-mappings, tomcat_post.
>> +for $extension (keys %TOMCAT_ONLY) {
>> + $httpd{$extension} = $TOMCAT_ONLY{$extension};
>> +}
> while (my ($mimetype, $file_extension) = each %TOMCAT_ONLY) {
> $httpd{file_extension) = $mimetype;
> }
>
> We don't have to lookup the file extension ourself.
DONE with a bit of syntax fixing :)
>> +for $extension (keys %TOMCAT_KEEP) {
>> + $httpd{$extension} = $TOMCAT_KEEP{$extension};
>> +}
> see above
DONE
>> +open (NEW, ">$opt_o") or die "Could not open file '$opt_o' for write - Aborting!";
> three params open and lexical filehandle?
DONE
>> +print NEW $tomcat_pre;
>> +for $extension (sort keys %httpd) {
> while combined whith each %httpd to omit hash lookup a little bit later
> while (my ($mimetype, $file_extension) = each %httpd) {
> ...
Not here, because I want keys sorted.
> Regards
> Felix
Thanks!
Committed in r1100724.
Rainer
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r1099032 - in /tomcat/trunk/res/scripts: ./
check-mime.pl
Posted by Felix Schumacher <fe...@internetallee.de>.
Hi Rainer,
Am Dienstag, den 03.05.2011, 12:12 +0000 schrieb rjung@apache.org:
> Author: rjung
> Date: Tue May 3 12:12:35 2011
> New Revision: 1099032
>
> URL: http://svn.apache.org/viewvc?rev=1099032&view=rev
> Log:
> Add a script to check web.xml and httpd mime.types
> for differences.
>
> Added:
> tomcat/trunk/res/scripts/
> tomcat/trunk/res/scripts/check-mime.pl (with props)
>
> Added: tomcat/trunk/res/scripts/check-mime.pl
> URL: http://svn.apache.org/viewvc/tomcat/trunk/res/scripts/check-mime.pl?rev=1099032&view=auto
> ==============================================================================
> --- tomcat/trunk/res/scripts/check-mime.pl (added)
> +++ tomcat/trunk/res/scripts/check-mime.pl Tue May 3 12:12:35 2011
> @@ -0,0 +1,410 @@
> +#!/usr/bin/perl
> +
...
> +# Script version, printed via getopts with "--version"
> +$main::VERSION = '1.0';
Any reason for not using 'our' like
our $VERSION = '1.0'; ?
> +
...
> +
> +# Parse arguments:
> +# -m: mime.types file (httpd) to use
> +# -i: input web.xml file to check
> +# -o: output web.xml file (gets generated and overwritten)
> +
> +$Getopt::Std::STANDARD_HELP_VERSION = 1;
> +our($opt_m, $opt_i, $opt_o);
Why should those options be visible by everyone outside this package?
'my' should be enough:
my ($opt_m, $opt_i, $opt_o);
> +getopts('m:i:o:');
> +
> +
> +# Check whether mandatory arguments are given
> +if ($opt_m eq '' || $opt_i eq '' || $opt_o eq '') {
> + HELP_MESSAGE(*STDOUT);
> + exit 1;
> +}
> +
> +
> +# Switch locale for alphabetical ordering
> +setlocale(LC_COLLATE, $LOCALE);
> +
> +# Read and parse httpd mime.types, build up hash extension->mime-type
> +open(MIMETYPES, "<$opt_m") or die "Could not open file '$opt_m' for read - Aborting!";
You could use three param open and use lexical filehandles like
open my $mimetpyes_fh, '<', $opt_m or die "...";
> +while (<MIMETYPES>) {
> + chomp($_);
> + $line = $_;
while (my $line = <$mimetypes_fh>) {
chomp($line);
> + $line =~ s/#.*//;
> + $line =~ s/^\s+//;
> + if ($line ne '') {
> + @cols = split(/\s+/, $line);
> + if ($#cols > 0) {
> + for ($i=1; $i <= $#cols; $i++) {
> + $httpd{$cols[$i]} = $cols[0];
> + }
> + } else {
> + print STDERR "WARN mime.types line ignored: $_\n";
> + }
> + }
> +}
> +close(MIMETYPES);
>
($mimetype, @endings) = split(/\s+/, $line);
if (@endings > 0) {
for my $ending (@endings) {
$httpd{$ending} = $mimetype;
}
} else {
print STDERR "WARN mime.types line ignored: $_\n";
}
close $mimetypes_fh;
would be possible also.
> +
> +# Read and parse web.xml, build up hash extension->mime-type
> +# and store the file parts form before and after mime mappings.
> +open(WEBXML, "<$opt_i") or die "Could not open file '$opt_i' for read - Aborting!";
three-params open could be used again.
> +
> +# Skip and record all lines before the first mime type definition.
> +# Because of comment handling we need to read one line ahead.
> +$line = '';
> +while (<WEBXML>) {
> + if ($_ !~ /<mime-mapping>/) {
> + $tomcat_pre .= $line;
> + } else {
> + last;
> + }
> + $line = $_;
> +}
> +
> +$commented = 0;
> +# If the previous line was start of a comment
> +# set marker, else add it to pre.
> +if ($line =~ /^\s*<!--[^>]*$/) {
> + $commented = 1;
> +} else {
> + $tomcat_pre .= $line;
> +}
> +
> +# Now we parse blocks of the form:
> +# <mime-mapping>
> +# <extension>abs</extension>
> +# <mime-type>audio/x-mpeg</mime-type>
> +# </mime-mapping>
> +# Optional single comment lines directly after "<mime-mapping>"
> +# are allowed. The whole block is also allowed to be commented out.
> +
> +while ($_ =~ /^\s*<mime-mapping>\s*$/) {
> + $_ = <WEBXML>;
> + chomp($_);
> + $comment = '';
> + if ($_ =~ /^\s*<!--([^>]*)-->\s*$/) {
> + $comment = $1;
> + $_ = <WEBXML>;
> + chomp($_);
> + }
> + if ($_ =~ /^\s*<extension>([^<]*)<\/extension>\s*$/ ) {
> + $extension = $1;
> + $extension =~ s/^\s+//;
> + $extension =~ s/\s+$//;
> + } else {
> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
> + print STDERR "ERROR Expected <extension>...</extension>', got '$_' - Aborting!\n";
> + close(WEBXML);
> + exit 2;
> + }
> + $_ = <WEBXML>;
> + chomp($_);
> + if ($_ =~ /^\s*<mime-type>([^<]*)<\/mime-type>\s*$/ ) {
> + $type = $1;
> + $type =~ s/^\s+//;
> + $type =~ s/\s+$//;
> + if (exists($tomcat{$extension}) && $tomcat{$extension} ne $type) {
> + print STDERR "WARN MIME mapping redefinition detected!\n";
> + print STDERR "WARN Kept '$extension' -> '$tomcat{$extension}'\n";
> + print STDERR "WARN Ignored '$extension' -> '$type'\n";
> + } else {
> + $tomcat{$extension} = $type;
> + if ($comment ne '') {
> + $tomcat_comments{$extension} = $comment;
> + }
> + if ($commented) {
> + $tomcat_commented{$extension} = 1;
> + }
> + push(@tomcat_extensions, $extension);
> + }
> + } else {
> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
> + print STDERR "ERROR Expected <mime-type>...</mime-type>', got '$_' - Aborting!\n";
> + close(WEBXML);
> + exit 3;
> + }
> + $_ = <WEBXML>;
> + chomp($_);
> + if ($_ !~ /^\s*<\/mime-mapping>\s*$/) {
> + print STDERR "ERROR Parse error in Tomcat mime-mapping line $.\n";
> + print STDERR "ERROR Expected '</mime-mapping>', got '$_' - Aborting!\n";
> + close(WEBXML);
> + exit 4;
> + }
> + $_ = <WEBXML>;
> + # Check for comment closure
> + if ($commented && $_ =~ /^[^<]*-->\s*$/) {
> + $commented = 0;
> + $_ = <WEBXML>;
> + }
> + # Check for comment opening
> + if ($_ =~ /^\s*<!--[^>]*$/) {
> + $commented = 1;
> + $line = $_;
> + $_ = <WEBXML>;
> + }
> +}
> +
> +# Add back the last comment line already digested
> +if ($commented) {
> + $tomcat_post = $line;
> +}
> +
> +# Read and record the remaining lines
> +$tomcat_post .= $_;
> +while (<WEBXML>) {
> + if ($_ =~ /<mime-mapping>/) {
> + print STDERR "ERROR mime-mapping blocks are not consecutive\n";
> + print STDERR "ERROR See line $. in $opt_i - Aborting!\n";
> + close(WEBXML);
> + exit 5;
> + }
> + $tomcat_post .= $_;
> +}
> +
> +close(WEBXML);
> +
> +
> +# Look for extensions existing for Tomcat but not for httpd.
> +# Log them if they are not in TOMCAT_ONLY
> +for $extension (@tomcat_extensions) {
> + if (!exists($httpd{$extension})) {
> + if (!exists($TOMCAT_ONLY{$extension})) {
> + print STDERR "WARN Extension '$extension' found in web.xml but not in mime.types is missing from TOMCAT_ONLY list.\n";
> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be removed from generated web.xml.\n";
> + } elsif ($tomcat{$extension} ne $TOMCAT_ONLY{$extension}) {
> + print STDERR "WARN Additional extension '$extension' allowed by TOMCAT_ONLY list, but has new definition.\n";
> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
> + " by '$extension' -> '$TOMCAT_ONLY{$extension}' in generated web.xml.\n";
> + }
> + }
> +}
> +
> +
> +# Look for extensions with inconsistent mime types for Tomcat and httpd.
> +# Log them if they are not in TOMCAT_KEEP
> +for $extension (@tomcat_extensions) {
> + if (exists($httpd{$extension}) && $tomcat{$extension} ne $httpd{$extension}) {
> + if (!exists($TOMCAT_KEEP{$extension})) {
> + print STDERR "WARN Mapping '$extension' inconsistency is missing from TOMCAT_KEEP list.\n";
> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
> + " by '$extension' -> '$httpd{$extension}' in generated web.xml.\n";
> + } elsif ($tomcat{$extension} ne $TOMCAT_KEEP{$extension}) {
> + print STDERR "WARN Extension '$extension' inconsistency allowed by TOMCAT_KEEP list, but has new definition.\n";
> + print STDERR "WARN Definition '$extension' -> '$tomcat{$extension}' will be replaced" .
> + " by '$extension' -> '$TOMCAT_KEEP{$extension}' in generated web.xml.\n";
> + }
> + }
> +}
> +
> +
> +# Log if extensions in web.xml are not sorted alphabetically.
> +$check = 0;
> +$msg = '';
> +for ($i=1; $i <= $#tomcat_extensions; $i++) {
> + if ($tomcat_extensions[$i - 1] ge $tomcat_extensions[$i]) {
> + $check = 1;
> + $msg .= "WARN Extension '" . $tomcat_extensions[$i - 1] . "' defined before '" . $tomcat_extensions[$i] . "'\n";
> + }
> +}
my $last_line = $tomcat_extensions[0];
for my $current_line (@tomcat_extensions) {
if ($last_line ge $current_line) {
$check = 1;
$msg .= "WARN Extension '$last_line' defined before
'$current_line'\n";
}
$last_line = $current_line;
}
Not really shorter, but we don't have to look up array elements.
> +if ($check) {
We could check for $msg and get rid of $check.
> + print STDERR "WARN MIME type definitions in web.xml were not sorted alphabetically by extension\n";
> + print STDERR $msg;
> + print STDERR "WARN This will be fixed in the new generated web.xml file '$opt_o'.\n";
> +}
> +
> +
> +# Log all extensions defined for httpd but not for Tomcat
> +for $extension (sort keys %httpd) {
> + if (!exists($tomcat{$extension})) {
> + print STDERR "INFO Extension '$extension' found for httpd, but not for Tomcat.\n";
> + print STDERR "INFO Definition '$extension' -> '$httpd{$extension}' will be added" .
> + " to the generated web.xml.\n";
> + }
> +}
> +
> +
> +# Generate new web.xml:
> +# - Use definitions from httpd
> +# - Add TOMCAT_ONLY
> +# - Fix TOMCAT_KEEP
> +# - output tomcat_pre, sorted mime-mappings, tomcat_post.
> +for $extension (keys %TOMCAT_ONLY) {
> + $httpd{$extension} = $TOMCAT_ONLY{$extension};
> +}
while (my ($mimetype, $file_extension) = each %TOMCAT_ONLY) {
$httpd{file_extension) = $mimetype;
}
We don't have to lookup the file extension ourself.
> +for $extension (keys %TOMCAT_KEEP) {
> + $httpd{$extension} = $TOMCAT_KEEP{$extension};
> +}
see above
> +open (NEW, ">$opt_o") or die "Could not open file '$opt_o' for write - Aborting!";
three params open and lexical filehandle?
> +print NEW $tomcat_pre;
> +for $extension (sort keys %httpd) {
while combined whith each %httpd to omit hash lookup a little bit later
while (my ($mimetype, $file_extension) = each %httpd) {
...
Regards
Felix
> + if (exists($tomcat_commented{$extension})) {
> + print NEW " <!--\n";
> + }
> + print NEW " <mime-mapping>\n";
> + if (exists($tomcat_comments{$extension})) {
> + print NEW " <!--$tomcat_comments{$extension}-->\n";
> + }
> + print NEW " <extension>$extension</extension>\n";
> + print NEW " <mime-type>$httpd{$extension}</mime-type>\n";
> + print NEW " </mime-mapping>\n";
> + if (exists($tomcat_commented{$extension})) {
> + print NEW " -->\n";
> + }
> +}
> +print NEW $tomcat_post;
> +close(NEW);
> +print "New file '$opt_o' has been written.\n";
> +
>
> Propchange: tomcat/trunk/res/scripts/check-mime.pl
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Propchange: tomcat/trunk/res/scripts/check-mime.pl
> ------------------------------------------------------------------------------
> svn:executable = *
>
> Propchange: tomcat/trunk/res/scripts/check-mime.pl
> ------------------------------------------------------------------------------
> svn:keywords = Author Date Id Revision
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org