#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にブラウザで開くことを想定している。