http://subtech.g.hatena.ne.jp/miyagawa/20060531/1149080673
で、id:miyagawaさんと話したりしてたのだけど、PoCo::Client::HTTPは拡張性という点に関しては設計が悪い。オンメモリでデータを詰め込んでくところなんかは実際xangoを使ったシステムではハックしてファイルに書き出すようにしてるんだけど、これが本当に*hack*って感じのハックで、醜いったらありゃしない(気軽にPoCo::Client::HTTPをアップグレードできないし)
で、PoCo::Client::HTTPの基本的な構成としては
POE::Component::Client::HTTP
-> dispatch to POE::Component::Client::HTTP::RequestFactory
<- get POE::Component::Client::HTTP::Requestmonitor socket via Driver::RW
while (read_ready) {
request->add_content(data);
}
みたいな感じなんだけど、このadd_contentとかをオーバーライドしたい。そのためには結局RequestFactoryとRequestを継承する必要があるんだけど、問題点としては:
- PoCo::Client::HTTPの中でPoCo::Client::HTTP::RequestFactoryがハードコードされてる
- create_factory みたいなステートが欲しい
- PoCo::Client::HTTP::RequestFactoryの中でPoCo::Client::HTTP::Requestがハードコードされてる
- create_requestみたいなステートが欲しい
- PoCo::Client::HTTP::Requestの中でデータを保存するためだけのメソッドが欲しい。
- それがないのでしょうがなくadd_content()全体をコピってハックしてる。
実はこの辺のRequestやらRequestFactoryもXangoを最初に作り始めた時にはなかったもの。改良されてるのはいいんだけど、拡張してるユーザーがもう少し使いやすいようにしてもらえると嬉しかったり。
で、今発見したんだけどPoCo::Client::Keepaliveは余計な事にPoCo::Client::DNSを勝手にspawnしてやがる。こっちがわざわざDNSキャッシュしてるのに・・・そういうわけでもう一つRFC:
- PoCo::Client::Keepaliveの中のDNS解決するかどうかをClient::HTTPからのパラメターで指定でいると嬉しい。
そんなもんかなぁ。