いわゆるダウンロードカウンタです。 ダウンロードさせたいファイルの URL へ転送する方式と、 ファイルを実際に読み出して渡す方式が選べます。
本スクリプトはまた、dlc.cgi から DLC.pm にリネームする事で、 ダウンロードカウンタを作成する為の Perl モジュールとしても利用できます。
本スクリプト (dlc.cgi) の先頭に書かれている perl(1) のパスを確認し、もし必要ならば変更して下さい。
#!/usr/bin/perl
本スクリプト内に書かれている設定項目 (後述) を、 設置環境や好みに合わせて適宜変更して下さい。
各ファイルを設定内容に合わせて置いて下さい。
カウントファイルは自動的に作成する事も可能です。 その場合、カウントファイルを置くディレクトリには書込権限が必要です。 書込権限がなければ、ファイルを予め用意する必要があります。
ロックファイルは本スクリプトが作成します。 ロックファイルを置くディレクトリには必ず書込権限が必要です。
本スクリプト内に以下の設定項目があるので、必要があれば変更して下さい。
ダウンロードさせるファイルの設定と、それを呼び出す為のキーの対応表です。
$Conf = {
KEY => {
location => 'https://domain.tld/~you/archive/foo.zip',
count_file => '/home/you/var/foo.count',
lock_file => '/home/you/var/foo.lock',
},
};
[!\$&-;=?-Z_a-z~]+
にマッチする文字列のみが利用可能です。
デッドロックした際に自動で解除するまでの時間 (単位: 秒) です。 0 を指定すると自動解除は行いません。 デフォルトでは 300 秒です。
拡張子と MIME Types (Internet Media Types) の対応表です。 拡張子は全て小文字で指定して下さい。
ここに無い拡張子のファイルは、 Default に設定された MIME Type を使用します。
$Conf に設定した KEY をクエリに与えて呼び出すと、 count_file の値をカウントアップ後、 location の URL へリダイレクトするか、 archive のファイルをクライアントに送ります。
KEY を省略した場合、 $Conf にキーが一つしか定義されていない場合はその設定を、 二つ以上存在する場合はキー Default の設定を利用します。
この章は本スクリプトをモジュールとして利用する場合のリファレンスです。 通常の CGI プログラムとしてのみ利用する方は読み飛ばして構いません。
use DLC;
$obj = DLC->new or DLC->end($@);
$obj->load_conf($file, $key) or $obj->end;
$obj->count_up or $obj->end;
$obj->send or $obj->end;
exit;
モジュールとして利用する場合、 本ファイル上の $Conf による設定は利用できません。 上記例のようにインスタンスメソッド load_conf によって外部ファイルから設定を読み込むか、 コンストラクタ new の引数に必要な設定を全て指定する事になります。
外部ファイルは require された時に $Conf と同様のハッシュリファレンスを返すよう作られている必要があります。 最も単純な設定ファイルの内容は以下の様になります;
{
key1 => {
...
},
key2 => {
...
},
};
本クラスのオブジェクトは以下のインスタンス属性を持ちます。
KEY | DEFAULT |
---|---|
error | undef |
location | undef |
lock_refresh | $LockRefresh |
mime_type | $MimeType{'Default'} |
use_flock | undef |
archive_dir | undef |
archive_name | undef |
count_file_dir | archive_dir の値 |
count_file_name | archive_name の値 + .count |
lock_file_dir | count_file_dir の値 |
lock_file_name | count_file_name の値 + .lock |
archive_size | undef |
lock_key | undef |
コンストラクタ new 以外は全てインスタンスメソッドです。
count_up
カウントファイルの値をインクリメントします。 何らかのエラーが起こった場合は偽値を返します。
new([KEY => VALUE [, KEY => VALUE [...]]])
コンストラクタです。 生成するインスタンスに持たせる属性値を引数に与える事ができます。
何らかのエラーが起こった場合は $@ にエラーメッセージをセット後、偽を返します
load_conf(FILE [, KEY])
外部ファイル FILE の KEY から設定を取り出し、 自身の属性値に定義します。KEY を省略した場合、 FILE にキーが一つしか定義されていない場合はその設定を、 二つ以上存在する場合はキー Default の設定を利用します。
lockup([OPERATION])
unlock が呼び出されるまで排他的ロックを行います。
インスタンス属性 use_flock に真値が定義されている場合、lockup は組込関数 flock に対するラッパーとなり、 OPERATION は flock に渡されます。
$self->use_flock(1);
$self->lockup(1);
... # 共有ロック
$self->unlock;
$self->lockup(6);
... # ブロックしない排他的ロック
$self->unlock;
send
ダウンロードさせるファイルをクライアントに渡します。 何らかのエラーが起こった場合は偽値を返します。
unlock
ロックを解除します。
以下に挙げる関数は、 同名のインスタンス属性に対する読み書き両用のアクセスメソッドです。
$obj = $obj->method($value);
$value = $obj->method;
archive([FILE])
インスタンス属性 archive_dir と archive_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。
ファイルの読込権限が無い場合は偽を返します。 location 属性が空でない場合は常に偽を返します。
archive_dir([DIR])
アーカイヴを置くディレクトリです。 ディレクトリの実行権限が無い場合は偽を返します。
location 属性が空でない場合は常に偽を返します。
archive_name([FILENAME])
アーカイヴのファイル名です。 ファイルの読込権限が無い場合は偽を返します。
location 属性が空でない場合は常に偽を返します。
archive_size
アーカイヴのファイルサイズです。 このメソッドは読み出し専用です。
location 属性が空でない場合は常に偽を返します。
count_file([FILE])
インスタンス属性 count_file_dir と count_file_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。
count_file_dir([DIR])
カウントファイルを置くディレクトリです。 ディレクトリの実行権限が無い場合は偽を返します。
count_file_dir 属性に値が定義される前に読み出した場合、 archive_dir 属性と同じ値が定義されます。
count_file_name([FILENAME])
カウントファイルのファイル名です。
count_file_name 属性に値が定義される前に読み出した場合、 archive_name 属性の値に拡張子 .count をつけた値が定義されます。
error([LIST])
エラーメッセージです。 LIST を連結し、末尾に error が呼び出された行番号を追加した文字列が定義されます。
location([URL])
ダウンロードさせるファイルの URL です。 指定した URL が正しい absoluteURI (RFC 2396 参照) で無かった場合は偽を返します。
lock_file([FILE])
インスタンス属性 lock_file_dir と lock_file_name を同時に扱うアクセスメソッドです。 パス付きファイル名を指定して下さい。
lock_file_dir([DIR])
ロックファイルを置くディレクトリです。 ディレクトリの書込権限が無い場合は偽を返します。
lock_file_dir 属性に値が定義される前に読み出した場合、 count_file_dir 属性と同じ値が定義されます。
lock_file_name([FILENAME])
ロックファイルのファイル名です。
lock_file_name 属性に値が定義される前に読み出した場合、 count_file_name 属性の値に拡張子 .lock をつけた値が定義されます。
lock_refresh([EXPR])
デッドロックした際に自動で解除するまでの時間 (単位: 秒) です。 0 を指定すると自動解除は行いません。 デフォルトでは $LockRefresh 秒です。
mime_type([MIMETYPE])
ダウンロードさせるファイルの MIME Type (正確には Internet Media Type (RFC 2045 及び RFC 2616 参照)) です。 指定した MIMETYPE が正しい書式で無かった場合は偽を返します。
mime_type 属性に値が定義される前に読み出した場合、 archive 属性が既に定義されていればそのファイルの拡張子に応じた MIME Type が、 定義されていないか判別できなければ $MimeType{'Default'} が、それぞれ定義されます。
use_flock([EXPR])
本モジュールでは通常 Perl の組込関数 rename を用いた排他処理を行いますが、 この属性に真値を定義すると、 排他処理に flock を用います。 ロックファイルとカウントファイルを共用する事が可能になります。
flock は NFS 越しだと有効に働かない事と、 実装されていないプラットフォームが存在する事を理解した上で使用して下さい。
以下に挙げる関数は、メソッドとして呼び出す事も、 通常の関数として呼び出す事もできます。 また use 時に輸入リストに加える事ができます。
end([LIST])
LIST を連結した文字列を表示する HTTP レスポンスメッセージを STDOUT に出力し、exit します。
インスタンスメソッドとして呼び出した場合、 LIST が省略されていれば error 属性の値を用います。
is_valid_absolute_uri(ABSOLUTEURI)
文字列 ABSOLUTEURI が RFC 2396 の 3. URI Syntactic Components で定義されている absoluteURI にマッチするか調べ、真偽値を返します。
is_valid_absolute_uri(MEDIATYPE)
文字列 MEDIATYPE が RFC 2616 の 3.7 Media Types で定義されている media-type にマッチするか調べ、真偽値を返します。
unify_dir_delimiter(PATH)
PATH のディレクトリ区切り文字を / に統一した文字列を返します。 PATH が . か / で始まらない場合は、 先頭に ./ を付加します。
Internet Explorer でダウンロードを行うと、 ファイル名の拡張子直前に [1] という文字列が挿入されてしまいます。
中央集権的なサーバに多数のクライアントがぶら下がる、 いわゆる「パソコン通信 (Bulletin Board System)」タイプのネットワーク構成とは違い、 インターネット上では本来、各ホスト間の地位は対等で上下関係はありません。 よってこの文書中に頻出する「ダウンロード」という表現は不適切です。 HTTP や FTP に於いては、 「GET」という用語が定義されています。
この観点では、本スクリプトの DLC (DownLoad Counter) という名前は、 インターネット上で用いられる CGI プログラムの名前としては不適切です。 しかし一般には既に「ダウンロード」という用語が定着しており、 また筆者がより「良い」(= このスクリプトを利用するであろう人達に分かってもらい易い) 名前を思いつかなかった為に、この誤った、投げやりな名称が付けられています。 こういったいい加減な行動が用語の混乱を助長するのでしょう。 :p
Copyright © 2002 Yaminusi. All rights reserved.
本スクリプトは修正 BSD ライセンスにて公開されています。