问题:当我发出包含重定向的请求时,最后一个重定向返回404,因为Location头中的URL包含'#'
个字符。 libcurl
将其编码为%23
,请求返回404(服务器的规则?),而其他一些重定向到包含'#'
的网址的请求正常工作。例如,Opera浏览器的404
%23
和200
的{{1}}也是'#'
。有谁知道如何更改此类行为并使libcurl
不对URL进行编码?所以此时我不想手动转到重定向网址...无论是否有代理,都会注意到这种行为。
Additional info
-------------------------------------
libcurl 7.27.0
Ubuntu 12.04
CURLOPT_FOLLOWLOCATION = true
CURLOPT_MAXREDIRS = -1
HTTP 1.1
CURLOPT_POSTREDIR = default
答案 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测试过这个,但是这样的东西应该有用,虽然它有点麻烦。