libcurl如何更改编码url行为

时间:2012-10-28 17:05:40

标签: c++ c http curl libcurl

问题:当我发出包含重定向的请求时,最后一个重定向返回404,因为Location头中的URL包含'#'个字符。 libcurl将其编码为%23,请求返回404(服务器的规则?),而其他一些重定向到包含'#'的网址的请求正常工作。例如,Opera浏览器的404 %23200的{​​{1}}也是'#'。有谁知道如何更改此类行为并使libcurl不对URL进行编码?所以此时我不想手动转到重定向网址...无论是否有代理,都会注意到这种行为。

Additional info
-------------------------------------
libcurl 7.27.0
Ubuntu 12.04
CURLOPT_FOLLOWLOCATION = true
CURLOPT_MAXREDIRS = -1
HTTP 1.1
CURLOPT_POSTREDIR = default

1 个答案:

答案 0 :(得分:1)

我不知道你是否可以直接在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倍,确认我们已经覆盖了默认罪。

在你的情况下,你将覆盖curl_easy_escape,首先调用真正的curl_easy_escape,然后运行生成的字符串,用#替换%23,然后返回修改后的字符串。我没有为libcurl测试过这个,但是这样的东西应该有用,虽然它有点麻烦。