詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

curl でデータを逐次アップロードするには -T (--upload-file) を使う

最近知ってへーとなったのでメモ。標準入力から 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.

はてなで一緒に働きませんか?