1

内置例程 HttpQueryInfo 返回一个字符串,而不是实际字节。通常这不是问题。

但是,最近我开始遇到服务器发出重定向的问题,其中位置标头字段包含一个包含非百分比编码的 unicode/或?人物。有什么办法吗?

        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 字符串,Location则服务器有问题,需要修复,因为这明显违反了RFC 2616 第 14.30 节。我的猜测是服务器实际上发送的是未映射的 IRI ( RFC 3987 ) 而不是 URI ( RFC 3986 )。HTTP 不支持直接使用 IRI,它们必须映射到 URI(RFC 3987定义了如何做到这一点)。

话虽如此,请检查是否将dwInfoLevel参数设置为HTTP_QUERY_CUSTOM允许HttpQueryInfo()返回标头的原始字节。如果没有,那么您将无法将 WinInet 用于那些出现故障的服务器,因为 WinInet API 中没有其他函数可以访问 HTTP 标头。您必须找到另一个支持您需要的 HTTP 库,否则您可以下拉到 TCP/IP 层并在您自己的代码中手动实现 HTTP 协议。

于 2012-09-19T19:39:21.873 回答