curlcurlコマンドをつかって、同じ動作をするC/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コマンドを公式リポジトリからインストールしてみることをおすすめします。
コメント