ReverseHttpただ勘違いされやすいのが「何がReverseなの」という部分。通常ブラウザからリクエストが送信され、それに対する応答がサーバから返されます。ReverseHttpはサーバで何かアクションが起きた場合に、ブラウザ側がその通知を受信する...なんて事が出来るプロトコルです。仕組みはcometというlong pollに似た仕組みで、サイトのdemoを観るとなんなく理解出来るかと思います。Tunnel HTTP over HTTP, in a structured, controllable, securable way. Let programs claim part of URL space, and serve HTTP, all by using an ordinary HTTP client library.
http://www.reversehttp.net/
例えば何が出来るのか...
ローカルPC内で動作するファイアウォール内のwebアプリを外部に公開する
rubyにhookoutというライブラリがあり、これを使用するとrackアプリがさも外部に公開されているかの様に振舞う事が出来ます。paulj's hookout at master - GitHubグローバルIPが無くても、webアプリを公開出来るなんて素晴らしい!
Expose Ruby applications to the web via ReverseHTTP
http://github.com/paulj/hookout/tree/master
なお、ReverseHttpはプロトコルですのでhookout以外にも同様のソフトウェアはあります。例えばmiyagawaさんが書いたAnyEvent::ReverseHttpに含まれるeg/proxy.plを使うとローカルPC内のwebアプリを外部に公開する事が出来ます。
外部で起きたアクションをローカルPCに通知させる
例えば、はてなブックマークで自分のサイトがブックマークされた瞬間にデスクトップPCが反応したらどうしますか?スターを付けに行きませんか(笑)?ReverseHttpを使えば出来るのです。
今日はこの「はてなブックマーク通知」をやってみたいと思います。
使う材料は以下の通り。
- hookout : 上記で紹介したrackアプリを公開するライブラリ
- sinatra : ruby製webアプリケーションフレームワーク
- ruby_gntp : snakaさん作のruby用Growl For Windowsインタフェース
上記のサイトからhookoutを取得してインストールし、以下のsinatraアプリケーションを作成します。
my-hatebu-growler.rb
require 'rubygems'
require 'sinatra'
require 'ruby_gntp'
growl = GNTP.new
growl.register({
:app_name => "はてブ",
:notifies => [{
:name => "hatenabookmark",
:enabled => true,
}]
})
post '/' do
return "ng" if params[:status] !~ /add|update/
user = params[:username]
text = "#{params[:comment]}\r\r#{params[:title]}\r#{params[:url]}"
icon = "http://www.hatena.ne.jp/users/#{user[0,2]}/#{user}/profile.gif"
p params[:status]
growl.notify({
:name => "hatenabookmark",
:title => user,
:text => text,
:icon => icon,
})
'ok'
end
config.ru
require 'my-hatebu-growler'
set :run, false
run Sinatra::Application
これを以下の様に起動します。
hookout -a http:/www.reversehttp.net/reversehttp -n my-hatebu-growler-application -R config.ru start
my-hatebu-growler-applicationの部分は適当な物に変えて下さい。
起動すると以下の様に出力されます。
Bound to location http://my-hatebu-growler-application.www.reversehttp.net/
このURLを、はてなブックマークにwebhook登録します。あとは、じっとブクマされるのを待ちます。
デタ━━━゚(∀)゚━━━!!
秋の夜長に、こんなツールお一つどうでしょうか。
追記1
HTTP::Engine::Interface::ReverseHTTPもあるよとmiyagwawaさんに教えてもらいました。
hookout for HTTP::Engineらしいです。
追記2
例では分かり易くする為にwebhook APIのキー認証を省いていますが、本当はちゃんと判定する必要があります。
追記3
PerlでHTTP::Engine::Interface::ReverseHTTPを使ってみた。ネットワークGrowlにはアイコンが使える仕組みがないのが残念。