WEBrickの動作を調べてみる。

webrickのソースは、gentooでは/usr/lib/ruby19/1.9.1にあるwebrick.rb。
これは、/usr/lib/ruby19/1.9.1/webrick/下の他のファイルを読み込むの使われている。

webrick/server.rb

WEBrick::GenericServer
HTTPProxyServer < HTTPServer < GenericServerという継承の元となる。

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を直接操作して一定量読み込む度にコールバックに投げるような仕組みになるか。