0

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

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

1 回答 1

1

不知道能不能直接在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 测试过这个,但是这样的东西应该可以工作,虽然它有点麻烦。

于 2012-10-29T14:57:45.683 回答