きりかノート 3冊め

おあそびプログラミング

SandTrip 0.9.5 リリース - PATH_INFO 対応など

WebKit なブラウザにローカル CGI 機能を追加する SIMBL プラグインSandTrip バージョン 0.9.5 をリリースしました。

  • PATH_INFO 対応
  • HTTP 応答ステータスをきちんと
  • リロードによる環境設定の再読み込み

を実装しました。PATH_INFO に対応したので ViewVC など今までより多くの CGI ソフトウェアが利用できるようになりました。

もっとくわしく

指定された URL が、CGI として利用可能な拡張子(.cgi, .rb など)を含むとき、PATH_INFO として解釈されます。複数の拡張子を含むとき、最短のパスが実行ファイルとなります。

  • file://.../foo.cgi/bar/baz -> foo.cgi を実行、PATH_INFO は "/bar/baz"
  • file://.../foo.cgi/bar.rb/baz -> foo.cgi を実行、PATH_INFO は "/bar.rb/baz"
  • file://.../foo-cgi/bar.rb/baz -> foo-cgi/bar.rb を実行、PATH_INFO は "/baz"
  • file://.../foo.cgi/ -> foo.cgi を実行、PATH_INFO は "/"

もちろん、ディレクトリにこのような拡張子(に見える名前)がついていると正しく動作しなくなってしまいますので、注意が必要です。たぶん大丈夫だと期待。

HTTP 応答は今まで固定で 200 OK にしていましたが、ちゃんと出力結果に含まれる HTTP ステータスの値を返すようにしました。CGI 出力の先頭 5 バイトを見て、"HTTP/" なら CFHTTPMessageCreateEmpty() で空の CFHTTPMessage を生成します。そうでなければ、CFHTTPMessageCreateResponse() で応答ステータスを指定して CFHTTPMessage を生成します。後者の場合は、今までどおり 200 になります。(2007.06.01 まちがい!0.9.6 で修正しました)

こっそりと default.plist とユーザデフォルトの値をマージして読み込みするようにしたので、default write コマンドなどでデフォルトデータベースに設定値を保存しておくと、SandTrip のリビルドに影響されずに設定することができます。Property List Editor などで ASCII 形式の plist を作成しておいて

 % defaults write jp.nifty.i.kimuraw.SandTrip "`cat my_default.plist`"

などとするとよいでしょう。設定用の GUI はつくるつもりはありますが、まだありませんので。

今回のハマりポイント

NSURL#path は末尾の "/" を省略してしまうのにハマりました。困ったときの CoreFoundation で CFURLHasDirectoryPath() で判定。

 % irb -rosx/cocoa 
irb:001> url = OSX::NSURL.URLWithString("file:///foo/bar/")
irb:002> url.path.to_s
=> "/foo/bar"
irb:003> OSX.CFURLHasDirectoryPath(url)
=> true

で、このときは "/" をもう一度追加して処理するようにしました。ってか、カテゴリで NSURL にメソッドを追加。