2012-10-28 25 views
0

问题:当我发出包含重定向的请求时,最后一个重定向返回404,因为位置标题中的URL包含'#'字符。 libcurl将它编码为%23,并且请求返回404(服务器规则?),而其他一些请求重定向到包含'#'的URL时正常工作。例如,Opera浏览器也获得404%23200'#'。有谁知道我怎么能改变这种行为,并使libcurl不编码的URL?所以在这个时候,我不想手动去重定向网址......这种行为被记录为有和没有代理。libcurl如何更改编码url行为

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

回答

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; 
} 

并与海湾合作委员会`-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,但是这样的东西应该可以工作,尽管它有点麻烦。