RustのHyperで使えるMultipartライブラリ調査(問題点とか)
#Hyper #Rust
以下が一番良く出てくると思う。
https://gh-card.dev/repos/abonander/multipart.svg https://github.com/abonander/multipart
https://github.com/abonander/multipart
multipartの問題点
使用できるHyperのバージョンが>=0.9, <0.11であること
参考:
RustのHyperでNode.jsライクなハンドラーは0.10だと使えていた様子でわかったように0.11で大幅に使い方(HyperのAPI)に変更があった。そのためそれに追従していない様子。
このissueSupport async Hyper · Issue #40 · abonander/multipartでも触れられている
そこで下記のmultipart-asyncについて触れられている
multipart-async
https://gh-card.dev/repos/abonander/multipart-async.svg https://github.com/abonander/multipart-async
https://github.com/abonander/multipart-async
hyper = { version = "0.11", optional = true }風になっていて新しいHyperでも使えると思う。
https://github.com/abonander/multipart-async/blob/0a1652f35cdd51329ac81e9cd6b5007daba5ca4e/Cargo.toml#L28
現在のHyperは0.12.xだが、多分そこまで変更しなくても大丈夫な気がする。
multipart-asyncの問題点
最終コミットが「Dec 29, 2017」で止まっている
安定しているというわけではない。
pre-alpha software, mostly untested and still in development. Early feedback is welcome, but use at your own risk.
rust-multipart-rfc7578について
https://github.com/ferristseng/rust-multipart-rfc7578
サーバーサイドの実装は今の所するつもりはないとのこと。サーバーサイドでメインにmultipartしたいのでこまる。
I don't have any plans on implementing the server-side of this any time soon. I ended up implementing the client-side because I couldn't find any good libraries that were compatible with hyper >= 0.11.
formdataについて
https://github.com/mikedilger/formdata
hyper = { version = "0.10" }。
https://github.com/mikedilger/formdata/blob/b40f00c6ad7355ad2c5a91848b9d8b5b60360b24/Cargo.toml#L16
issueもある: Update to hyper 0.12 · Issue #38 · mikedilger/formdata
現在の結論
結局どれを使えばよいか?
いまの最新のHyperの0.12.xに対応しているライブラリはなさそう
最新のHyperを使いたいならどれも難しそう
なおかつ、これからのHyperの更新に積極的に追従してくれそうな感じが無くて、選んでもそれが足を引っ張ってHyperを更新できない問題を抱えそうなので、自分用に保守していくライブラリを作ったりしない限りMultipartはやめておきたい気分
hr.icon
追記:
以下のmpart-asyncのAPIが素晴らしく、boundaryとbodyさえ渡せばMultipartのパースができて利用できる。
https://gh-card.dev/repos/cetra3/mpart-async.svg https://github.com/cetra3/mpart-async
Hyperのサーバーサイドからどのように使うかは、以下で使っているので参考になるかもしれない。
https://github.com/nwtgck/piping-server-rust/blob/c8e6ae0fb76d3cc5057f1fa2802ffd8313cf791f/src/piping_server.rs#L374-L415
このAPIの良さから、piping-server-rust 0.9.0のMultipartの対応でも利用した。