不知道能不能直接在libcurl中控制这个。但即使你不能,也不是所有的希望都消失了。您的代码可以劫持 curl_easy_escape 以获得您想要的行为。这是一个 hack,但我猜你可以将它作为最后的手段。
这是一个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 倍,确认我们已经覆盖了默认罪。
在您的情况下,您将覆盖 curl_easy_escape,首先调用真正的 curl_easy_escape,然后运行生成的字符串,将 %23 替换为 #,然后返回修改后的字符串。我还没有为 libcurl 测试过这个,但是这样的东西应该可以工作,虽然它有点麻烦。