1

組み込みルーチンHttpQueryInfoは、実際のバイトではなく文字列を返します。通常、それは問題ではありません。

ただし、最近、サーバーがリダイレクトを発行する問題が発生し始めました。ロケーションヘッダーフィールドに、パーセンテージエンコードされていないUnicode /または?を含むURLが含まれています。文字。これを回避する方法はありますか?

        var
          vContent_Wide: WideString;
        begin 
          vBufferSize := 4096;
          GetMem(vBufferPtr, vBufferSize);
          while True do
          begin
            TmpFakeCardinal := 0;
            vErrorNone := HttpQueryInfo(
              hHttpOpen_Request,
              HTTP_QUERY_RAW_HEADERS_CRLF,
              vBufferPtr,
              vBufferSize,
              TmpFakeCardinal
            );
            if (vErrorNone = False) then
              begin
                vErrorID := GetLastError;
                if (vErrorID = ERROR_INSUFFICIENT_BUFFER) then
                  begin
                    FreeMem(vBufferPtr);
                    GetMem(vBufferPtr, vBufferSize);
                  end
                else Break;
              end
            else
              begin
                vContent_Wide := PWideChar(vBufferPtr); 
                Result := vContent_Wide;
                Break;
              end
            ;
          end;
          FreeMem(vBufferPtr, vBufferSize);
4

1 に答える 1

3

URI は、エンコードされていない Unicode 文字をサポートしていません。サーバーがヘッダーでパーセントでエンコードされていない Unicode 文字列を送信している場合、サーバーにバグがあり、これはRFC 2616 セクション 14.30Locationの明らかな違反であるため、修正する必要があります。私の推測では、サーバーは実際には URI ( RFC 3986 ) ではなく、マップされていない IRI ( RFC 3987 ) を送信しています。HTTP は IRI の直接使用をサポートしていません。URI にマッピングする必要があります ( RFC 3987でその方法が定義されています)。

そうは言っても、dwInfoLevelパラメーターをに設定すると、ヘッダーの生のバイトを返すHTTP_QUERY_CUSTOMことができるかどうかを確認してください。HttpQueryInfo()そうでない場合、WinInet API には HTTP ヘッダーにアクセスできる関数が他にないため、失敗しているサーバーに対して WinInet を使用することはできません。必要なものをサポートする別の HTTP ライブラリを見つける必要があります。そうしないと、TCP/IP レイヤーにドロップダウンして、HTTP プロトコルを独自のコードに手動で実装することができます。

于 2012-09-19T19:39:21.873 に答える