これを libcurl で直接制御できるかどうかはわかりません。しかし、たとえそれができなくても、すべての希望が失われるわけではありません。コードは curl_easy_escape をハイジャックして、必要な動作を得ることができます。これはハックですが、最後の手段として使用できると思います。
double sin(double)
これは、数学ライブラリから関数をハイジャックする簡単な例です。最初に使用するメインファイルsin
:
sin_test.c:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
double x = atof(argv[1]);
printf("sin(%f) = %f\n", x, sin(x));
return 0;
}
次のファイルをコンパイルgcc -o sin_test sin_test.c -lm
して、動作することを確認します。
./sin_test 1
sin(1.000000) = 0.841471
これを与えられたものとして、ソース コードを変更せずに動作をオーバーライドしようとします。これを行うには、次のように共有ライブラリを定義しsin_override.so
ます。sin_override.c
次の内容でファイルを作成します。
#include <math.h>
#include <stdlib.h>
#define __USE_GNU
#include <dlfcn.h>
double sin(double x)
{
double (*real_sin)(double) = NULL;
if(!real_sin) real_sin = dlsym(RTLD_NEXT,"sin");
return real_sin(x)/10;
}
そして、`gcc -fPIC -shared -o sin_override.so sin_override.c -ldl でコンパイルします。次に、プログラム自体の前にこの共有ライブラリをロードするようにシステムに指示します。
LD_PRELOAD=/full/path/to/sin_override.so ./sin_test 1
sin(1.000000) = 0.084147
答えは以前の 10 分の 1 になり、デフォルトの sin を上書きしたことが確認されました。
あなたの場合、最初に実際のcurl_easy_escapeを呼び出してから、結果の文字列を実行し、%23を#に置き換えてから、変更された文字列を返すことにより、代わりにcurl_easy_escapeをオーバーライドします。私はこれをlibcurlでテストしていませんが、少し面倒ですが、このようなものはうまくいくはずです。