This is an automated email from the ASF dual-hosted git repository.

jensg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 4903d18  THRIFT-5123 add possibility to query HTTP status code with 
WinHTTP Client: delphi Patch: Jens Geyer
4903d18 is described below

commit 4903d18fca988871bcedce3b420fef2cd9682ca1
Author: Jens Geyer <[email protected]>
AuthorDate: Thu Feb 27 20:27:03 2020 +0100

    THRIFT-5123 add possibility to query HTTP status code with WinHTTP
    Client: delphi
    Patch: Jens Geyer
---
 lib/delphi/src/Thrift.WinHTTP.pas | 54 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/lib/delphi/src/Thrift.WinHTTP.pas 
b/lib/delphi/src/Thrift.WinHTTP.pas
index 5c07193..abbb004 100644
--- a/lib/delphi/src/Thrift.WinHTTP.pas
+++ b/lib/delphi/src/Thrift.WinHTTP.pas
@@ -576,7 +576,7 @@ type
   IWinHTTPConnection = interface;
 
   IWinHTTPRequest = interface
-    ['{7AE6F63F-49B6-436B-8AAB-159E58EB900A}']
+    ['{FADA4B45-D447-4F07-8361-1AD6656E5E8C}']
     function  Handle : HINTERNET;
     function  Connection : IWinHTTPConnection;
     function  AddRequestHeader( const aHeader : string; const addflag : DWORD 
= WINHTTP_ADDREQ_FLAG_ADD) : Boolean;
@@ -590,6 +590,7 @@ type
     function  ReadData( const pBuf : Pointer; const dwRead : DWORD) : DWORD;  
overload;
     function  QueryDataAvailable : DWORD;
     function  QueryTotalResponseSize( out dwSize : DWORD) : Boolean;
+    function  QueryHttpStatus( out dwStatusCode : DWORD; out sStatusText : 
string) : Boolean;
   end;
 
   IWinHTTPConnection = interface
@@ -710,6 +711,7 @@ type
     function  ReadData( const pBuf : Pointer; const dwRead : DWORD) : DWORD;  
overload;
     function  QueryDataAvailable : DWORD;
     function  QueryTotalResponseSize( out dwSize : DWORD) : Boolean;
+    function  QueryHttpStatus( out dwStatusCode : DWORD; out sStatusText : 
string) : Boolean;
 
   public
     constructor Create( const aConnection : IWinHTTPConnection;
@@ -1230,6 +1232,53 @@ begin
 end;
 
 
+function TWinHTTPRequestImpl.QueryHttpStatus( out dwStatusCode : DWORD; out 
sStatusText : string) : Boolean;
+var dwBytes, dwError, dwIndex : DWORD;
+begin
+  // HTTP status code
+  dwIndex := DWORD( WINHTTP_NO_HEADER_INDEX);
+  dwBytes := SizeOf(dwStatusCode);
+  result  := WinHttpQueryHeaders( FHandle,
+                                  WINHTTP_QUERY_STATUS_CODE or 
WINHTTP_QUERY_FLAG_NUMBER,
+                                  WINHTTP_HEADER_NAME_BY_INDEX,
+                                  @dwStatusCode, dwBytes,
+                                  dwIndex);
+  if not result then begin
+    dwStatusCode := 0;  // no data
+    dwError      := GetLastError;
+    if dwError <> ERROR_WINHTTP_HEADER_NOT_FOUND then ASSERT(FALSE);  // 
anything else would be an real error
+  end;
+
+  // HTTP status text
+  dwIndex := DWORD( WINHTTP_NO_HEADER_INDEX);
+  dwBytes := 0;
+  result  := WinHttpQueryHeaders( FHandle,
+                                  WINHTTP_QUERY_STATUS_TEXT,
+                                  WINHTTP_HEADER_NAME_BY_INDEX,
+                                  WINHTTP_NO_OUTPUT_BUFFER,  // we need to 
determine the size first
+                                  dwBytes,                   // will receive 
the required buffer size
+                                  dwIndex);
+  if dwBytes > 0 then begin  // allocate buffer and call again to get the value
+    SetLength( sStatusText, dwBytes div SizeOf(Char));
+    dwBytes := Length(sStatusText) * SizeOf(Char);
+    result  := WinHttpQueryHeaders( FHandle,
+                                    WINHTTP_QUERY_STATUS_TEXT,
+                                    WINHTTP_HEADER_NAME_BY_INDEX,
+                                    @sStatusText[1], dwBytes,
+                                    dwIndex);
+  end;
+  if result
+  then SetLength( sStatusText, StrLen(PChar(sStatusText)))  // get rid of any 
terminating #0 chars
+  else begin
+    sStatusText := '';  // no data
+    dwError     := GetLastError;
+    if dwError <> ERROR_WINHTTP_HEADER_NOT_FOUND then ASSERT(FALSE);  // 
anything else would be an real error
+  end;
+
+  // do we have at least something?
+  result := (dwStatusCode <> 0) or (sStatusText <> '');
+end;
+
 
 { TWinHTTPUrlImpl }
 
@@ -1385,9 +1434,6 @@ begin
 end;
 
 
-initialization
-  OutputDebugString( PChar( SysErrorMessage( 12002)));
-
 end.
 
 

Reply via email to