diff -urN ../htmllint.orig/htmllint.cgi ./htmllint.cgi
--- ../htmllint.orig/htmllint.cgi Fri Sep 28 15:00:00 2012
+++ ./htmllint.cgi Tue Oct 16 08:20:00 2012
@@ -140,14 +140,28 @@
}
}
-$URL = $RURL = ($cgi->param('Method') =~ /^(?:Data|File)$/oi)? '': &htmllint::AbsoluteURL($ENV{HTTP_REFERER}, $cgi->param('URL'));
+if ($cgi->param('Method') =~ /^(?:Data|File)$/oi) {
+ $RURL = $URL = '';
+} else {
+ $URL = $cgi->param('URL');
+ # AbsoluteURLで前後の空白は除去されるが
+ # 以下のコードではAbsoluteURLを通らない場合があるので
+ $URL =~ s/^\s*//;
+ $URL =~ s/\s*$//;
+ # 日本語文字が含まれている$URLをエラーメッセージの中に表示する場合に備え、
+ # $URLの文字コードをスクリプトの文字コード($myCODE)に合わせておく。
+ # さもないとフォームの文字コードが$myCODEと異なる場合に文字化けが起こる。
+ &Jconvert(\$URL, $myCODE, $formCODE);
-# 日本語文字が含まれている$URLをエラーメッセージの中に表示する場合に備え、
-# $URLの文字コードをスクリプトの文字コード($myCODE)に合わせておく。
-# さもないとフォームの文字コードが$myCODEと異なる場合に文字化けが起こる。
-# 現状ではフォームはUTF-8、スクリプトはEUC-JP/Shift_JISなので、
-# プライマリサイトなどでも実際に文字化けが発生しています。
-&Jconvert(\$URL, $myCODE, $formCODE);
+ # http:もしくは相対パスの場合のみAbsoluteURLを通す
+ # AbsoluteURLではホスト名が空になっているURLはうまく扱えないようで、
+ # file:/// が file:/ に直されてしまってfile:指定が動作しなくなってしまう。
+ # 他にも、UNCパスを表すfile:指定はやや特殊な構文になっているので、
+ # URL中の連続する/を一つにまとめられると動作しなくなってしまう。
+ $URL = &htmllint::AbsoluteURL($ENV{HTTP_REFERER}, $URL)
+ if $URL =~ m#^https?:(?!//$)#oi || $URL !~ m#^([\w.+-]*:|\\\\)#oi; # http://のみ、UNCパスも除外
+ $RURL = $URL;
+}
# チェックオプションを得る
&GetOptions;
@@ -175,9 +189,31 @@
}
if ($URL ne '') {
if ($GETLOCALFILE) {
- if ($URL =~ m#^file:///?(.*)#oi) {
- ($LOCALFILE = $1) =~ s/^(\w)\|(.*)/$1:$2/o;
- } elsif ($WIN && $URL =~ /^\w:/o) {
+ # Windowsの各ブラウザが認識できる形式(*はアドレスバーの表示形式)
+ # ie=ie8 fx=firefox15 ch=chrome22 op=opera12
+ # ie* fx ch op C:\dir\file.html
+ # ie ch op C:/dir/file.html
+ # ie fx ch op file://C:/dir/file.html
+ # ie fx ch op file://C|/dir/file.html
+ # ie fx* ch* op file:///C:/dir/file.html
+ # ie fx* ch op file:///C|/dir/file.html
+ # ie fx ch op* file://localhost/C:/dir/file.html
+ # ie fx ch op* file://localhost/C|/dir/file.html
+ # ie* fx ch op \\host\share\dir\file.html
+ # ie ch* op* file://host/share/dir/file.html
+ # ie ch file:////host/share/dir/file.html
+ # ie fx* ch file://///host/share/dir/file.html
+ # ie fx file://localhost///host/share/dir/file.html
+ # file://C:/は初期のIE、file:///C|/は初期のNetscapeが発祥だったと思う。
+ # Windowsの場合は例外的構文が多すぎるので、分解パターンを別にした。
+ if (!$WIN && $URL =~ m#^file://[\w.-]*/(.*)#oi) {
+ $LOCALFILE = $1;
+ $LOCALFILE =~ s#^([^/].*)#/$1#o if $UNIX;
+ } elsif ($WIN && $URL =~ m#^file://([\w.-]*/)?((?://)?[^/].*)#oi) {
+ my $h = $1;
+ ($LOCALFILE = $2) =~ s/^(\w)\|(.*)/$1:$2/o;
+ $LOCALFILE = '//'.$h.$LOCALFILE if $h =~ m#^(?!localhost/).+/#oi;
+ } elsif ($WIN && $URL =~ /^(\w:|\\\\)/o) {
$LOCALFILE = $URL;
}
}
diff -urN ../htmllint.orig/htmllintenv ./htmllintenv
--- ../htmllint.orig/htmllintenv Sat May 19 17:36:51 2007
+++ ./htmllintenv Tue Oct 16 08:20:00 2012
@@ -73,7 +73,9 @@
# この指定により、file:// で始まるプロトコルを URL に指定できるようになります
# ブラウザは、これをクライアント上のファイルとして取得しますが、ここではサーバ上
# のファイルとして取得するので注意してください
-# Windows上のサーバでは、C: のようなドライブ名から始まるファイル名も記述できます
+# Windows上のサーバでは、C: のようなドライブ名から始まるファイル名や、
+# \\ から始まるUNCパス名も記述できます
+# いずれも、CGIの実行権限で取得対象のローカルファイルを読めることが必要です
#$GETLOCALFILE = 1;
# CGI が出力する HTML の漢字コードの既定値 (コメントアウトしても可)