WEBrickの動作を調べてみる。
webrickのソースは、gentooでは/usr/lib/ruby19/1.9.1にあるwebrick.rb。
これは、/usr/lib/ruby19/1.9.1/webrick/下の他のファイルを読み込むの使われている。
webrick/httpserver.rb
WEBrick::HTTPServer < GenericServer
HTTPProxyServerのベースとなるWEBrick::HTTPServerの動作。
WEBrick::GenericServer#start -StartCallback -EndCallback ↓ WEBrick::GenericServer#start_thread -AcceptCallback ↓ WEBrick::HTTPServer#run req, resを生成してserviceに投げる -RequestCallback ↓ WEBrick::HTTPServer#service Servlet生成。 ↓ WEBrick::HTTPServlet(を継承したサムシング)#service
webrick/httpproxy.rb
require 'webrick/httpserver'
WEBrick::HTTPProxyServer < HTTPServer
WEBrick::GenericServer#start -StartCallback -EndCallback ↓ WEBrick::GenericServer#start_thread -AcceptCallback ↓ WEBrick::HTTPServer#run req, resを生成してserviceに投げる -RequestCallback ↓ (ここからHTTPServerと違う) ↓ WEBrick::HTTPProxyServer#service --> #do_CONNECT ↓ WEBrick::HTTPProxyServer#proxy_service ↓ WEBrick::HTTPProxyServer#do_GET + WEBrick::HTTPProxyServer#do_POST +-> #perform_proxy_request ☆res.bodyの内容を読み込む WEBrick::HTTPProxyServer#do_HEAD + ↓ -ProxyContentHandler
こんな感じでProxyContentHandlerに処理がわたってくる。
調べてみた目的は動画なんかのストリーミングデータを逐次送るようにする方法を探すことだったのだけど、どうやらない機能の様子。
WEBrick::HTTPProxyServer#perform_proxy_request
でNet::HTTPを使ってHTTPデータを読み込んでいるのでこのあたりを改造しないといかん。
Socketを直接操作して一定量読み込む度にコールバックに投げるような仕組みになるか。