RustのHyperでクライアントの接続が閉じたことを知る方法はない?
やりたいこと
サーバーにアクセスしたクライアントが接続を切った時を知りたい。Node.jsとかなら普通にあるon("close")みたいなやつ。
見つかるIssueたち
Issueとしては以下が見つかる。
使えるかもしれないソース
2017年のIssueにリンクがあったもの。リポジトリになっていて、Cargoでビルドもできて再現的に動くと思われる。
Hyperのバージョンは0.11.0-a.0であった。
解読できたところ
まず、2つのissueで共通して言えるのは、HyperのAPIは多少今の0.12とは違う。
それと両方共closeしている。
2015年の方は、ハンドラーは違うし、「Blocking IOのせいでできない」みたいに書いてあるように見える。ただし、0.12現在ならnon-blocking IOになっているはず。non-blockingなのは、の0.11.0のときの変更コミットを見ればわかる。そのため現在はnon-blockingだと思われる。 2017年の方は、解決したのかどうかは不明。
ただ、issueの報告者でない人()も同じ問題に直面している言っている。その人のコメント内のコードでは、試しにクライアントのBodyを書こうとしてみてOkかErrで判断するみたい。Body::pair()は0.12だとBody::channel()でできるはず。ただ、クライアントのボディに書き込むことはかなりの副作用だし、すごく良くない方法だと思う。読み取りでもできるかもしれないけど、読み取ってしまった部分と残った部分をどうやってあとでくっつけるとか問題もあるし、どちらにせよcloseの検出のAPIがほしい。 簡単なまとめ
結局、「このメソッド使ったらいいよ」みたいな回答はないようみえる。つまり、現時点でHyperで接続切れを判定できるAPIは提供されていないのではないかと思っている。