2012-09-19 2 views
1

기본 제공 루틴 HttpQueryInfo는 실제 바이트가 아닌 문자열을 반환합니다. 일반적으로 문제가되지 않습니다.WinInet HttpQueryInfo가 원시 바이트를 반환 할 수 있습니까? (유니 코드 문자가있는 HTTP 헤더)

그러나 요즘 위치 헤더 필드에 백분율로 인코딩되지 않은 유니 코드/또는 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); 
+0

질문을 편집하십시오 : 사용하는 특정 Delphi 버전의 태그를 추가하십시오. HttpQueryInfoA 또는 HttpQueryInfoW를 호출하면 명확하지 않습니다. –

+0

vContent_Native 란 무엇입니까? Whatr은 msxCopyPCharToStr입니까? 선언을하지 마십시오! –

+0

코드의 주석은 그것을 보여줍니다. Delphi 2007은이를 HttpQueryInfoA에 매핑하고 Delphi XE2 (모든 유니 코드 버전)는이를 HttpQueryInfoW에 매핑합니다. (그리고 vContent_Native는 해당 문자열 유형입니다.) – Tom

답변

3

URI는 인코딩되지 않은 유니 코드 문자를 지원하지 않습니다. 서버가 Location 헤더에 백분율로 인코딩되지 않은 유니 코드 문자열을 보내는 경우 서버가 버그가있어 수정해야합니다 (이 메시지는 RFC 2616 section 14.30의 명백한 위반입니다). 내 생각 엔 서버가 URI (RFC 3986) 대신 맵핑되지 않은 IRI (RFC 3987)를 실제로 전송하고있는 것 같습니다. HTTP는 IRI의 직접 사용을 지원하지 않으므로 URI로 매핑되어야합니다 (RFC 3987은이를 수행하는 방법을 정의합니다).

그렇다고 으로 매개 변수를 설정하면 HttpQueryInfo()에서 헤더의 원시 바이트를 반환하는지 여부를 확인할 수 있습니다. 그렇지 않으면 WinInet API에 HTTP 헤더에 액세스 할 수있는 다른 기능이 없으므로 실패한 서버에 대해 WinInet을 사용할 수 없습니다. 필요한 것을 지원하는 다른 HTTP 라이브러리를 찾아야합니다. 그렇지 않으면 TCP/IP 계층으로 드롭 다운하고 HTTP 프로토콜을 직접 코드에 구현할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 upvoted 지금, 나는 마크가 예상 답변을 나중에 오늘 밤 또는 내일 :) – Tom

+0

나는 HTTP_QUERY_CUSTOM과 함께 성공하지 못했지만, 지금은 인디에 관한 귀하의 의견을 테스트하고 있습니다. – Tom

+0

솔루션은 의견에서 다른 곳에서 제안한 것입니다. Indy의 TIdHTTP IOHandler.DefStringEncoding to UTF-8을 설정하십시오. 두 명의 고객이 문제를 해결했습니다. – Tom

관련 문제