#HTTP
知りたいこと
HTTPのTransfer-Encoding: chunkedした時に、元データと比べてどれぐらい増えるのかを知りたい。
Base64だとバイナリデータと比べて約133%増えるなどと言われていてそういった具合にTransfer-Encoding: chunkedの場合のデータの増加ぐあいを知りたい。(Base64 - Wikipedia)
検証方法
fetch() はブラウザ標準で使えるHTTPのリクエストをするクライアント。HTTPクライアントだとaxiosは人気のようだが fetch() は外部のライブラリ使用せず最初から使えるWeb標準の関数(広まって欲しい)。また XMLHttpRequest よりもモダンなAPIになっている。 body に ReadableStream が使えるようにだいぶ前から書かれていた。だが調べた限りそれを実装しているメジャーなブラウザは一つもなかった(https://github.com/whatwg/fetch/pull/425#issuecomment-462634914)。 chrome://flags/ にアクセスして以下の「Experimental Web Platform features」をEnabledにする必要がある(トークンを使う方法もある)。 allowHTTP1ForStreamingUpload: true はGoogle Chromeの一時的なプロパティ。これはHTTP/1.1でもこの機能を利用するため。(https://github.com/chromium/chromium/commit/4c75c0c9f730589ad8d6c33af919d6b105be1462#diff-0f684d35848d8674d6bd9c5673588856) POST /hogehoge したデータが GET /hogehoge で取得できる。 docker run -p 8181:8080 nwtgck/piping-server で出来る。その他の方法:「Piping Serverを自前でホストする方法をいくつか」 readableStream.pipeThrough(new TextEncoderStream()) を使うとよりストリームを使っている感じになる。(フル: https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/text_stream_with_text_encoder_stream.html) fetch() ではクライアントサイドで暗号化するときはデータをすべてメモリ上に展開する必要があった。だが今回のfetch()の機能によりストリームの暗号化ができるようになりWebブラウザでのE2E暗号化での可能性が広がった。 TransformStream ではなく ReadableStream を使った実装例: https://github.com/nwtgck/piping-server-streaming-upload-htmls/blob/a107dd1fb1bbee9991a9278b10d9eaf88b52c395/file_upload_progress.html "[object ReadableStream]" がアップロードされてしまうことを利用している様子。その結果おそらく Content-Type: text/plain ... がつく仕様になっているのだと思う。 const res = await fetch(...) の res.body もReadableStreamになっている。アップロードが完了するまでPromiseがresolveせず await し続ける様子。 python3 -m http.server などして、https://localhost:8000にブラウザで開くことを想定している。