最近知ってへーとなったのでメモ。標準入力から curl
を通じてサーバにデータを送信したい場合、
curl --data-binary @- <url>
というのがイディオムだと思うけど、この場合は標準入力から全部読みきってからサーバに接続・送信するので、データをストリーミングすることができない。コマンドライン経由のリアルタイムなコミュニケーションに HTTP を気軽に使いたい身としては、これは不便。
不便だなーと思って調べていたら、curl には -T
(--upload-file
) というオプションがあって、これは PUT
でファイルを送信するのだけど、これは Transfer-Encoding: chunked
しつつ、データを逐次読み取りながらサーバに送信するものらしい。
たとえば
# Linux なら nc -l -p 9999
nc -l 9999
しつつ、別のシェルで
curl -s -T - localhost:9999
すれば、毎行を入力するごとにサーバ側で受信できていることが確認できる。
とくに標準入力から入力を受けとる場合、-T -
の代わりに -T .
とすれば標準入力がノンブロッキングになって、入力を待たずにサーバからの応答を得ることができる(のだと思ってる。細かい挙動がよくわかってない)。
Use the file name "-" (a single dash) to use stdin instead of a given file. Alternately, the file name "." (a single period) may be specified instead of "-" to use stdin in non-blocking mode to allow reading server output while stdin is being uploaded.