【问题标题】:libcurl how to change encoding url behaviorlibcurl 如何更改编码 url 行为
【发布时间】:2012-10-28 17:05:39
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c http curl libcurl


    【解决方案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 倍,确认我们已经覆盖了默认的 sin。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2013-12-18
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多