summaryrefslogtreecommitdiff
path: root/lib/delphi
diff options
context:
space:
mode:
authorJens Geyer <jensg@apache.org>2020-04-27 20:36:34 +0200
committerJens Geyer <jensg@apache.org>2020-04-27 22:56:21 +0200
commit87462913428f9463c537223f2d23bbbf56cddb43 (patch)
tree6851251b0e51f073901c305933086a140ce2f9bf /lib/delphi
parent00c039adeb551b297276fcb88131f1cfe82be1cd (diff)
downloadthrift-87462913428f9463c537223f2d23bbbf56cddb43.tar.gz
THRIFT-5188 Occasional ERROR_INSUFFICIENT_BUFFER at WinHttpQueryHeaders()
Client: Delphi Patch: Jens Geyer
Diffstat (limited to 'lib/delphi')
-rw-r--r--lib/delphi/src/Thrift.WinHTTP.pas28
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/delphi/src/Thrift.WinHTTP.pas b/lib/delphi/src/Thrift.WinHTTP.pas
index abbb0044b..e6642d9f8 100644
--- a/lib/delphi/src/Thrift.WinHTTP.pas
+++ b/lib/delphi/src/Thrift.WinHTTP.pas
@@ -1216,6 +1216,7 @@ end;
function TWinHTTPRequestImpl.QueryTotalResponseSize( out dwSize : DWORD) : Boolean;
var dwBytes, dwError, dwIndex : DWORD;
+ bytes : array[0..32-1] of Byte;
begin
dwBytes := SizeOf( result);
dwIndex := DWORD( WINHTTP_NO_HEADER_INDEX);
@@ -1224,11 +1225,30 @@ begin
WINHTTP_HEADER_NAME_BY_INDEX,
@dwSize, dwBytes,
dwIndex);
- if not result then begin
- dwSize := MAXINT; // we don't know, just return something useful
- dwError := GetLastError;
- if dwError <> ERROR_WINHTTP_HEADER_NOT_FOUND then ASSERT(FALSE); // anything else would be an real error
+ if result then Exit;
+ dwError := GetLastError;
+
+ // Hack: WinHttpQueryHeaders() sometimes returns error 122 even if the buffer is large enough
+ // According to the docs, WINHTTP_QUERY_FLAG_NUMBER always returns a 32 bit number (which it does!)
+ // but for some strange reason since win 10 build 18636.815 passing a 4 bytes buffer is not enough anymore
+ if dwError = ERROR_INSUFFICIENT_BUFFER then begin
+ dwBytes := sizeof(bytes);
+ FillChar( bytes[0], dwBytes, 0);
+ result := WinHttpQueryHeaders( FHandle,
+ WINHTTP_QUERY_CONTENT_LENGTH or WINHTTP_QUERY_FLAG_NUMBER,
+ WINHTTP_HEADER_NAME_BY_INDEX,
+ @bytes[0], dwBytes,
+ dwIndex);
+ if result then begin
+ ASSERT( dwBytes = SizeOf(dwSize)); // result is still a DWORD
+ Move( bytes[0], dwSize, SizeOf(dwSize)); // copy over result data
+ Exit;
+ end;
end;
+
+ // header may just not be there
+ dwSize := MAXINT; // we don't know, just return something useful
+ ASSERT( dwError = ERROR_WINHTTP_HEADER_NOT_FOUND); // anything else would be an real error
end;