-->

可以WinInet的HttpQueryInfo返回原始字节? (HTTP标头与Unicode字符

2019-10-17 05:39发布

内置的例行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);

Answer 1:

URI的不支持未编码的Unicode字符。 如果服务器发送在一个非百分比编码的Unicode字符串Location报头则服务器是车和需要修复,因为这是一个明显违反RFC 2616部分14.30 。 我的猜测是,服务器实际上是发送一个未映射IRI( RFC 3987 ,而不是一个URI() RFC 3986 )。 HTTP不支持直接使用虹膜,他们必须被映射到的URI( RFC 3987定义了如何做到这一点)。

随着中说,检查是否设置dwInfoLevel参数HTTP_QUERY_CUSTOM允许HttpQueryInfo()返回页眉或不的原始字节。 如果没有,那么你将无法使用的WinInet对于那些失败的服务器,还有的WinInet的API可以访问HTTP头中没有其他功能。 你必须找到另一个HTTP库,支持你所需要的,否则你可以向下手动在自己的代码拖放到TCP / IP层和执行HTTP协议。



文章来源: Can WinInet HttpQueryInfo return raw bytes? (HTTP Headers with unicode characters)