読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

AS3でちょっとしたサーバサイドのプログラムが必要になる時に毎回書くのが面倒なので、適当に sinatra で書いた

ruby sinatra actionscript flash

Flash で外部から XML とかを取ってくる時に

とりあえず手元で試したい、というときって結構あると思う。それに、作ってる途中で毎回変動するようなデータが送られてくるとどっちが悪いんだ、ということもあるだろうし。
で、ぼくは Ruby厨だし、sinatra厨なので、 sinatra でサクっと書くんだけど、crossdomain.xml とか用意しなきゃいけないし、何より毎回書くのが面倒なので、ちょっとだけ汎用的に動くようなスクリプトを書いてみた。

これだ

ソース
#!/usr/bin/env ruby

require 'rubygems'
require 'sinatra'

#############################
# !!!README!!!
# /hoge で任意のファイルを content-type:text で返却します
# /xml/hoge.xml で content-type:xml で返却します
# /swf/hoge.swf で content-type:application/x-shockwave-flash で返却します
# どのファイルにしても、このファイルと同じ階層を基点とします。
# たとえば、 /xml/hoge.xml なら、このファイルと同じ階層に hoge.xml を、
# /xml/hoge/fuga.xml なら、 このファイルのあるディレクトリの中の、hoge ディレクトリ内のファイルになります。
#############################

# クロスドメインファイルの定義をしておくよ
before do
@crossdomain = <<EOS
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <site-control permitted-cross-domain-policies="all"/>
  <allow-access-from domain="*" />
</cross-domain-policy>
EOS
end

# ここのリクエスト名が GET する XML のファイル名になる
get '/:filename' do
  # クロスドメインだったら、下のリクエストへ
  pass if params[:filename] == 'crossdomain.xml'
  
  # ファイルパス作成
  path = File.dirname(__FILE__) + '/' + params[:filename]

  if File.file? path
    file = File.read(path)
  else
    file = "not found => #{path}"
  end

  content_type :text
  file
end

# クロスドメイン用
get '/crossdomain.xml' do
  content_type :xml
  @crossdomain
end

# http://localhost:4567/xml/hoge.xml でアクセスできるよ
get '/xml/:filename' do
  # ファイルパス作成
  path = File.dirname(__FILE__) + '/' + params[:filename]

  if File.file? path
    file = File.read(path)
  else
    file = "<?xml version=\"1.0\"?><message>not found => #{path}</message>"
  end
  content_type :xml
  file
end

# http://localhost:4567/swf/hoge.xml でアクセスできるよ
get '/swf/:filename' do
  path = File.dirname(__FILE__) + '/' + params[:filename]

  if File.file? path
    file = File.open(path, "rb") {|f| f.read }
  else
    file = ""
  end
  content_type "application/x-shockwave-flash"
  file
end
使い方

sinatra が入っていれば、上記ファイルに実行権限を付けて、ファイルを実行するか、ruby hoge.rb*1 とすれば良い。
README と書いた所にウダウダ書いてある通りで、 http://localhost4567/xml/* で、XML 用のレスポンスを、 http://localhost:4567/swf/* で SWF 用のレスポンスを返す。
とりあえず、 http://localhost:4567/* にアクセスしたら text で返すようにしてる。
アクセスされた時は、上記スクリプトと同じ階層を基点にファイルを探します。
例えば、 http://localhost:4567/xml/hoge.xml なら、スクリプトと同じ階層にある hoge.xml を見に行きます。

というわけで

完全に自分用のメモですが、rubyrubygems と、sinatra を入れてるような希有な方は使ってみると良いかもしれないです。

Windows で Ruby をインストールするなら

ここらへんを参考にすると良いんじゃないですかね。

sinatra のインストールは

rubygems がインストールされている状態で

gem install sinatra

とすればできます。

*1:上記スクリプトが hoge.rb だった場合