3 ポイント 投稿者 GN⁺ 2024-01-30 | 1件のコメント | WhatsAppで共有

--libcurl の使い方

  • libcurl の使用を推奨: ユーザーには、まず curl コマンドラインツールを使って望む転送を試し、だいたい期待どおりに動作したら、コマンドラインに --libcurl [ファイル名] オプションを追加して再実行することが推奨される。
  • コード生成: --libcurl コマンドラインオプションは、指定されたファイル名で C プログラムを生成する。この C プログラムは libcurl を使って、curl コマンドラインツールが実行した転送を実行する。
  • 例外と違い: 常に 100% 一致するわけではないが、使いたい libcurl オプションや追加引数について優れたヒントを与えてくれる。

サンプルコード

  • 実行例: curl http://example.com --libcurl example.c コマンドを実行すると、現在のディレクトリに example.c ファイルが生成される。
  • 生成されたコード: 生成されたコードには、curl_easy_setopt() を使ったさまざまなオプション設定が含まれており、一部のオプションはソースとして簡単に生成できないため、ユーザーが自分で実装するか使用しない場合もある。

GN⁺の意見

  • libcurl の有用性: この機能は、開発者がコマンドラインで動作する curl コマンドを C プログラムへ簡単に変換できるようにし、libcurl を使うアプリケーション開発を加速させる。
  • コード生成の利点: 自動生成されたコードは、開発者が libcurl API をより速く理解して適用するのに役立つ。
  • 学習ツールとしての価値: 初級ソフトウェアエンジニアにとって、libcurl オプションやネットワークプログラミングの実際の適用例を示す優れた学習資料になり得る。

1件のコメント

 
GN⁺ 2024-01-30
Hacker Newsのコメント
  • ブラウザの開発者ツールのネットワークタブで目的のリクエストを見つけて「copy as curl」でコピーし、https://curlconverter.com/ のようなツールで使いたい言語のリクエストコードに変換するパターンはとても良い
    ある意味で curl はどこへでも翻訳できる 中間表現 のように使われている

    • R ユーザーは、最近書き直された httr2 パッケージの curl_translate 関数で「copy as curl」コマンドをリクエストコードに変換できる
      https://httr2.r-lib.org/reference/curl_translate.html
    • curlconverter.com はすぐにブックマークしたくなるほど良さそう
      ブラウザの「copy as curl」は認証やエンコーディングのヘッダーが確実に動く状態で入るので、自分で複数行の curl コマンドをいじるよりずっと便利
    • API エンドポイント のトラブルシューティングがずっと楽になった
      リクエストパラメータを変えてローカルインスタンスに投げてみることもできるし、jq にパイプして出力形式を整えることもできる
    • エンドポイントが動かないときの最初のステップが「curl では動くか?」になるのは本当にその通り
    • HTTP 自体に中間表現が必要なわけではないが、cURL の普遍性 のおかげで事実上そのように機能している
      あまりにも広く使われているので、リクエストを cURL に書き出すツールも生まれ、cURL を取り込むツールも生まれている
  • コマンドラインインターフェースに、現在のコマンドと同じことをする プログラムのソースコード を吐き出すフラグがあるのはかなり素晴らしい
    ボンネットを開けて内部で何が起きているかを見せる感じで、動作をよりよく理解できるだけでなく、必要に応じて修正や拡張もしやすくなる

    • プログラミングライブラリのドキュメントとしても優秀
      libcurl を使っていて範囲リクエストのようなものが必要になったり、ブラウザのネットワークタブで「copy as curl」をしたりしたなら、コマンドラインで実行してから --libcurl を付けるだけで、C ライブラリ で正確にどうやるのか分かる
    • こういう仕組みが Gnome の設定、ネットワーク設定、ファイアウォール設定 GUI、そして CLI コマンドで実行可能なあらゆるものにも適用されるといい
  • このような仕組みは Microsoft Office の Visual Basic マクロ が成功した理由の一つだった
    Word や Excel で操作を実行し、生成されたマクロを見て、そのコードを自分の用途に合わせて修正できた。単純だが強力な概念で、curl でも見られるのはうれしい

    • Microsoft も同様に便利なツールを作っていて、特定の Office 文書の構造を調べ、その構成要素を生成する C# コード を見られるようにしていた
      かなり長く更新されていないようだ: https://github.com/dotnet/Open-XML-SDK/releases/tag/v2.5
    • こういうものには一般化されたパターンがありそう
      Amiga の AREXX も思い出す
    • Visual Studio の WPF エディタで見た、Excel 側の並行物である XAML/UI も同じように思い出す
  • コンパイルするには、gcc-lcurl を付けるように libcurl へのリンク を指定する必要がある
    たとえば curl https://ifconfig.me --libcurl ip_fetcher.c で IP アドレスと ip_fetcher.c を作り、gcc -o ip_fetcher ip_fetcher.c -lcurl でコンパイルしてから ./ip_fetcher を実行すれば IP アドレスが出力される
    毎日 C コードを書くわけではない人にとっては、こうした基本的なリンク手順も役立つ情報

    • 自分で cc コマンドを打つより make のほうが楽なら、もっと簡単な方法もある
      curl https://ifconfig.me --libcurl ip_fetcher.c の後に make LDFLAGS=-lcurl ip_fetcher、それから ./ip_fetcher を実行すればよい
  • 少し宣伝すると、Hurl は libcurl を利用してプレーンテキストで HTTP リクエストを実行・テストするオープンソース CLI
    libcurl の高い信頼性や HTTP/3 のような機能を使いつつ、リクエストの連結、レスポンスからのデータ取得と次のリクエストへの受け渡し、JSONPath・XPath のようなレスポンステスト機能を追加している
    REST/SOAP/GraphQL API リクエスト向けの糖衣構文もあるが、核となるのは単なる libcurl で、verbose オプションを使えば curl コマンドも grep できる。自分はメンテナーとして参加している
    https://hurl.dev

  • こういう機能が ffmpeg にもあるといい

  • Daniel Stenberg は細部や開発者・ユーザー体験を本当に丁寧に気にかけている
    ここまで磨き込まれているのは驚くべきこと

  • Daniel Stenberg 本人が curl のコマンドラインオプションの大半を見ていく 3時間の動画 で、このオプションにも触れていた記憶がある
    https://www.youtube.com/watch?v=V5vZWHP-RqU

  • 投稿タイトルは全角ダッシュとハイフンの組み合わせ(—-)ではなく、ハイフン2つ--)であるべき

    • フッターの Contact リンクから運営者にメールすれば、これを見て修正してくれるはず
  • このオプションは、もともと curl 呼び出しを包んでいたスクリプトの代わりになる コンパイル可能な C プログラム を作ってくれるという意味?

    • その通り。libcurl では元から可能だったが、これまでは 定型コード を自分で書く必要があった
    • 生成された C コードを既存プログラムにコピーして貼り付けたり、少なくともその curl 呼び出しを再現するにはどんな libcurl API 呼び出し が必要かを確認するための参考資料として使える、という発想
    • 一般的な Web ページなどで実用的に使うには、いくつかパラメータを修正する必要がある可能性が高い
      数時間ドキュメントを掘り返さずに済む出発点と考えるのが適切