CurlコマンドをC/C++のコードに変換する方法

C++

curlcurlコマンドをつかって、同じ動作をするC/C++のソースコードを自動生成する方法を紹介します。

スポンサーリンク

curlコマンドにはソースコード生成機能がついている!

curlコマンドには、C/C++のソースコードを自動生成してくれる機能が搭載されています。libcurlオプションを使うことにより、コマンドで実行したのとまったく同じ動作をするC++のソースコードを出力することができます。curlコマンドで行っていた動作をC/C++アプリケーションに組み込みたいときなどにつかうと便利です。

スポンサーリンク

C/C++のコードを生成するには?

コードを生成させる方法ですが、とってもかんたん。

curl実行時に--libcurl <ソースを出力するファイル名>.cppを追加するだけです。

test@sv02:~ $curl https://takabus.com --libcurl code.cpp

このサイトのホームページにアクセスするコマンドに、–libcurlを追加しました。

すると、カレントディレクトリにcode.cppファイルが生成されています。

/********* Sample code generated by the curl command line tool **********
 * All curl_easy_setopt() options are documented at:
 * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
 ************************************************************************/
#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "https://takabus.com");
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.64.0");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/home/test/.ssh/known_hosts");
  curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_INTERLEAVEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer
  CURLOPT_READDATA set to a objectpointer
  CURLOPT_READFUNCTION set to a functionpointer
  CURLOPT_SEEKDATA set to a objectpointer
  CURLOPT_SEEKFUNCTION set to a functionpointer
  CURLOPT_ERRORBUFFER set to a objectpointer
  CURLOPT_STDERR set to a objectpointer
  CURLOPT_HEADERFUNCTION set to a functionpointer
  CURLOPT_HEADERDATA set to a objectpointer

  */

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;

  return (int)ret;
}
/**** End of sample code ****/

生成されたファイルを確認してみると、ご覧の通り、C++のコードが作成されています。あとはこれをビルドすれば、実行したcurlコマンドと同じ動作をするバイナリを作成することができます。

注意点

自動生成されたソースコードには、自動的に一部のオプションが追加されています。

  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "https://takabus.com");
  curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.64.0");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_SSH_KNOWNHOSTS, "/home/test/.ssh/known_hosts");
  curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

注意すべきは CURLOPT_USERAGENT や CURLOPT_SSH_KNOWNHOSTS のあたりでしょうか。

CURLOPT_USERAGENTはユーザーエージェントを指定するオプションで、コマンド実行時に指定しないとcurlのバージョンが自動的に追加されます。ユーザーエージェントを手動で指定したい場合は、編集が必要です。

また、CURLOPT_SSH_KNOWNHOSTSも不要でしょうから、ビルド前に削除することをおすすめします。

コンパイルするには?

libcurlのインストール

自動生成されたソースコードは、libcurlを必要とします。コンパイル前にlibcurl-devをインストールしておいてください。

Linuxであれば、コンパイル前にlibcurl-devをインストールしておく必要があります。

$sudo apt install libcurl4-openssl-dev

コンパイル

コンパイルするには、gccコマンドを実行します。

$gcc code.cpp -lcurl

「-lcurl」オプションをつけてください。libcurlをリンクする必要があります。

$ls a.out
a.out

実行すると、バイナリファイルが出力されます。これを実行すると、ソースコード生成時に行ったcurlコマンドと同じ動作が行われます。

まとめ

curlコマンドでC/C++のソースコードを生成させる方法を紹介しました。

既存のアプリケーションにGET・POST機能を組み込みたい場合などもあるでしょう。今回紹介した方法を使えば、curlコマンドでテストしてから、そのままソースコードを生成し、カスタマイズしてプログラムに組み込むことができてしまいます。

なお、今回紹介したlibcurlオプションは、一部環境では実行できない場合があるようです。MacOSにデフォルトインストールされているcurlコマンドでは動かないといったことを聞いたことがありますので、動作しない場合はcurlコマンドを公式リポジトリからインストールしてみることをおすすめします。

curl

コメント

タイトルとURLをコピーしました