How to detect specific (timeout) errors for THTTPReqResp SOAP requests?

 ̄綄美尐妖づ 提交于 2021-01-28 11:39:27

问题


In Delphi Tokyo 10.2.x a ESOAPHTTPException was an Exception descendant with a StatusCode property set in the creator:

ESOAPHTTPException = class(Exception)
private
  FStatusCode: Integer;
public
{$IF CompilerVersion <= 15.0}
  constructor Create(const Msg: string; SCode: Integer = 0);
{$ELSE}
  constructor Create(const Msg: string; SCode: Integer = 0; Dummy: Integer = 0);
{$IFEND}
  constructor CreateFmt(const Msg: string; const Args: array of const; SCode: Integer = 0; Dummy: Integer = 0);

  property StatusCode: Integer read FStatusCode write FStatusCode;
end;

I could detect specific errors by looking at the StatusCode value:

// WinINet error codes https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.serviceerror%28v=exchg.80%29.aspx
if (E is ESOAPHTTPException) and (ESOAPHTTPException(E).StatusCode = ERROR_INTERNET_TIMEOUT) then
begin

We use THTTPReqResp. In Tokyo THTTPReqResp error handling code called HandleWinInetError(GetLastError, , which tested for some specific errors and for the others called THTTPReqResp.RaiseCheck, which then called raise ESOAPHTTPException.CreateFmt(' - all passing the GetLastError value. That's how it ended up in the StatusCode property.

But now in Delphi Rio 10.3.1 ESOAPHTTPException = ENetException; and ENetException = class(Exception); and there no longer is a StatusCode. HandleWinInetError is gone.

Looking though THTTPReqResp or THTTPReqRespHelper = class helper for THTTPReqResp I see that e.g. the THTTPReqResp.Execute raises the ESOAPHTTPException:

on Ex: ESOAPHTTPException do
begin
  if not CanRetry or not IsErrorStatusCode(HTTPResponse.StatusCode) then
    raise;
    ...
end;

... but at that moment HTTPResponse.StatusCode gets lost (HTTPResponse is a local var in the method).

Other than hacking the Delphi code to intercept this value (e.g. by 're-creating' a ESOAPHTTPException descendant like in Delphi Tokyo), does anyone see another way to detect specific errors (in my case the ERROR_INTERNET_TIMEOUT)? Did I overlook something?

来源:https://stackoverflow.com/questions/56836189/how-to-detect-specific-timeout-errors-for-thttpreqresp-soap-requests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!