0

問題: リダイレクトを含むリクエストを行うと、Location ヘッダーの URL に文字が含まれているため、最後のリダイレクトで 404 が返されます'#'libcurlそれをにエンコードし%23、リクエストは 404 (サーバーのルール?) を返しますが、他のいくつかのリクエストは正常に動作する URL へのリダイレクトを含みます'#'。たとえば、Opera ブラウザは404with%23200withも取得し'#'ます。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 をハイジャックして、必要な動作を得ることができます。これはハックですが、最後の手段として使用できると思います。

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 分の 1 になり、デフォルトの sin を上書きしたことが確認されました。

あなたの場合、最初に実際のcurl_easy_escapeを呼び出してから、結果の文字列を実行し、%23を#に置き換えてから、変更された文字列を返すことにより、代わりにcurl_easy_escapeをオーバーライドします。私はこれをlibcurlでテストしていませんが、少し面倒ですが、このようなものはうまくいくはずです。

于 2012-10-29T14:57:45.683 に答える