Piping Server (TypeScript版)の0.14.0まで質素なWeb UIでXMLHttpRequestを使わなかった理由と0.15.0で使うようになった理由
書きたいこと
Piping Server(TypeScript版)の0.15.0で質素なWeb UI上でXMLHttpRequestを使ってファイルやテキストをPOSTするようになった。その理由とそれまでXMLHttpRequestを使っていなかった理由を書きたい。
0.15.0の変更: https://github.com/nwtgck/piping-server/compare/v0.14.0...v0.15.0
サーバーのロジックは一切変更を加えてない。
GET /のインデックスのページのHTML/JavaScriptを変更しただけ。
XMLHttpRequestを使っていなかった理由
質素なWeb UIをシンプルに抑えられる。
「なぜPiping ServerのデフォルトのWeb UIは質素なのか?」に質素なWeb UIの定義とシンプルに抑える理由を書いている。
HTTPでファイルやテキストをPOSTしたときのエラーハンドリングなどをブラウザ側に任せることができる。
これにより、より質素なWeb UIのコードが短くなり、コードを読んで検証したりすることが容易になる
<form>を使っていた。
サーバー実装とは無関係なのでテキストインライン表示をブラウザでしたいなら「現在のPiping UIみたいなものを作ればよいな」という構想があったため。
そのためPiping UIを作ることを優先した。
Piping UIの方がアップデートをしたときの浸透率が高くなるためPiping UI内でXMLHttpRequest使った方法に問題があっても修正がしやすい。
対して、セルフホストされたPiping Serverのアップデートはホストした人が気が付かないといけなく、変更を加えて不具合があったときに最新版を浸透させづらいため、XMLHttpRequestへの変更はやるなら慎重に行いたかった。
0.15.0でXMLHttpRequestを使うようになった理由
質素なWeb UIでテキストを送って、それをブラウザで開こうとするとテキストがダウンロードされてしまうから。
<form>が付与するContent-Dispositionの影響でテキストがダウンロードされるようになっていた。
<form>が自動で付与するContent-Dispositionをinlineに変更しようと調べたがなさそうだった。
つまり、<form>に関係しないテキストを普通にcurlやPiping UIで送って、ブラウザで開けば0.14.0でもインラインで表示される。
テキストならブラウザ上でインラインで表示される方が嬉しい。
保存されてファイルがストレージに増えずに済む。
ファイルを開いたときに、ファイルを開くアプリの脆弱性をついた攻撃の可能性をゼロにできる。
(ブラウザのテキストレンダラに脆弱性がある可能性もあるが)
Piping Server (Rust版)に歩み寄るWeb UIの実装になる。
Rust版はMultipartに対応していなく、質素なWeb UIでXMLHttpRequestを使っている。
TypeScript版のMultipart対応ライブラリがパッケージのサイズを大きくしているし、よりシンプルに一貫させて他言語でのPiping Serverの実装を容易にするためにMultipartのサポートを切るのありかもしれない。(ただし、いまのところ互換性重視でサポートしなくなる予定はない。)
https://gyazo.com/07836f3f247aaa05dcaa120e9b9e4508
より。