ダウンロードカウンタのスクリプト

昨日作ったダウンロードカウンタのRubyスクリプトを貼っときます。

例としてaiue.jadのカウントをしたいとすると、

device:jam?http://hoge/ez_download.cgi?file=aiue

のようにします。

file=の後に指定するファイル名は、半角英数字とアンダーバーしか使えないようにしてます。

それから、カウンタファイルが無かったりロック中だったりでカウントアップに失敗した場合も、ダウンロード自体は正常に完了するようにしてあります。ダウンロードカウンタごときにそこまで厳密性を求めても仕方がないと思ったので。

テストは適当にしかしてませんが、一応auケータイ実機でjad/jarのダウンロードが正常にできることは確認してあります。

#!/usr/local/bin/ruby -Ku

require "cgi"

cgi = CGI.new
req_filename = cgi.params["file"][0]

if req_filename.nil? || /\W/ =~ req_filename
  cgi.out({"status" => "BAD_REQUEST"}) {
    "Bad request"
  }
  exit
end

jad_filename = req_filename + ".jad"
counter_filename = req_filename + "_cnt.txt"

### Send JAD file
begin
  File.open(jad_filename, "rb") { |f|
    jad_file = f.read
    cgi.out({"type" => "text/vnd.sun.j2me.app-descriptor"}) {
      jad_file
    }
  }
rescue
  cgi.out({"status" => "NOT_FOUND"}) {
    "File not found"
  }
  exit
end

### Count up
begin
  File.open(counter_filename, "r+") { |f|
    begin
      f.flock(File::LOCK_EX)
      counter = f.read.to_i
      f.rewind
      f.puts(counter + 1)
    ensure
      f.flock(File::LOCK_UN)
    end
  }
rescue
  # When count up failed, continue downloading
end