Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired (https://www.delphipraxis.net/201625-delphi-10-3-rio-thttpclient-und-proxy%3B-status-407-authenticationrequired.html)

Achim Kalwa 8. Aug 2019 09:56

Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Hallo *,

seit dem Umstieg von Delphi 10.2 (Tokyo) auf 10.3 (Rio) funktioniert der Zugriff auf WebServices via THTTPRIO nicht mehr, wenn zwischen meiner Anwendung (VCL, Win32/64) und dem Dienst ein Proxy mit Benutzeranmeldung steht. Auch der einfache Download einer Datei via THTTPClient.Get() funktioniert nicht mehr; es gibt einen StatusCode 407 = authenticationrequired.

Stark vereinfachtes Code-Fragment:
Code:
  LStream := TFileStream.Create(aFileName, fmCreate or fmShareExclusive);
  LClient := THTTPClient.Create;
  ResCode := LClient.Get(aURL, LStream);
  if ResCode.StatusCode = 200 then ; // 200 = OK
Compiliert mit Delphi 10.2.3 funktioniert der Download einer Datei aus dem Internet (z.B. 'https://www.7-zip.org/a/7z1900.exe'), ohne dass ich mich an unserem Proxy anmelden muss.

Derselbe Code compiliert mit Delphi 10.3.2 schlägt fehl mit Statuscode = 407: authenticationrequired

Wie bringe ich THTTPClient dazu, wieder den im System/am User eingestellten Proxy zu verwenden?

TIA
Achim

mkinzler 8. Aug 2019 10:05

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
http://docwiki.embarcadero.com/Libra....ProxySettings

Achim Kalwa 8. Aug 2019 10:21

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Danke für die schnelle Antwort; aber die bringt mich nicht wirklich weiter :-(

Muss ich jetzt wirklich die Proxy-Credentials des Anwenders selber ermitteln und an THTTPClient übergeben? Ich hatte gehofft, es gäbe da so etwas wie UseSystemProxy := True. Oder habe ich da was übersehen?

Warum funktioniert der Code mit Delphi 10.2, aber nicht mehr mit 10.3?! Eine solcher "code breaking change" müsste doch irgendwo dokumentiert sein...

Sherlock 8. Aug 2019 10:28

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Weil von Indy auf etwas anderes gewechselt wurde. THTTPClient ist jetzt die plattformübergreifende Klasse der Wahl.

Sherlock

Achim Kalwa 8. Aug 2019 10:37

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Zitat:

Zitat von Sherlock (Beitrag 1440179)
Weil von Indy auf etwas anderes gewechselt wurde. THTTPClient ist jetzt die plattformübergreifende Klasse der Wahl.

Schön und gut. Und wie kann ich dieser Klasse mitteilen, dass der in Windows bereits eingestellte Proxy verwendet werden soll?

Wenn es nur um den einfachen Download einer Datei ginge, könnte ich ja wieder auf Indy oder WinINet umschwenken. Aber es geht um WebServices mit HTTPRIO, welches intern ja ebenfalls THTTPClient verwendet.

Achim Kalwa 8. Aug 2019 13:16

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Zitat:

Zitat von Achim Kalwa (Beitrag 1440181)
Schön und gut. Und wie kann ich dieser Klasse mitteilen, dass der in Windows bereits eingestellte Proxy verwendet werden soll?

Ich beantworte meine Frage mal selber, vielleicht hilft es ja mal jemandem:
THTTPClientHelper.UseDefaultCredentials
ist die gesuchte Einstellung.
Code:
 
  LStream := TFileStream.Create(aFileName, fmCreate or fmShareExclusive);
  LClient := THTTPClient.Create;
  LClient.UseDefaultCredentials := True; // <-- added
  ResCode := LClient.Get(aURL, LStream);
  if ResCode.StatusCode = 200 then...
Und für den SOAP-WebService muss der vom WSDL-Importer erzeugte Code ergänzt werden:
Code:
uses
  ...
  Soap.SOAPHTTPTrans; // for THTTPReqRespHelper

function GetIService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IService;
var
  RIO: THTTPRIO;
begin
  ...
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IService);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;

    RIO.HTTPWebNode.UseDefaultCredentials := True; // <-- added

  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
Gruß vom Teutoburger Wald,

TurboMagic 8. Aug 2019 21:38

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Zitat:

Zitat von Achim Kalwa (Beitrag 1440234)
Und für den SOAP-WebService muss der vom WSDL-Importer erzeugte Code ergänzt werden:
Code:
uses
  ...
  Soap.SOAPHTTPTrans; // for THTTPReqRespHelper

function GetIService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IService;
var
  RIO: THTTPRIO;
begin
  ...
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IService);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;

    RIO.HTTPWebNode.UseDefaultCredentials := True; // <-- added

  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;

Gut zu wissen. Kann derjenige vom Teutoburger Wald bitte jetzt einen QP feature request oder bugreport
anlegen der fordert, dass der WSDL importer/Generator diese Zeile in Zukunft mit in den Code schreibt?

Danach bitte die Report Nummer hier melden, dann stimmen sicher einige dafür!

Grüße aus Süddeutschland
TurboMagic

Achim Kalwa 13. Aug 2019 09:43

AW: Delphi 10.3 Rio: THTTPClient und Proxy; Status 407 authenticationrequired
 
Zitat:

Zitat von TurboMagic (Beitrag 1440336)
Gut zu wissen. Kann derjenige vom Teutoburger Wald bitte jetzt einen QP feature request oder bugreport anlegen der fordert, dass der WSDL importer/Generator diese Zeile in Zukunft mit in den Code schreibt?

Danach bitte die Report Nummer hier melden, dann stimmen sicher einige dafür!

TurboMagic

Den WSDL-Importer zu ändern wäre nur ein Workaround. UseDefaultCredentials := True sollte per Default aktiv sein, so wie in vorherigen Delphi-Versionen. Ich habe einen Bug-Report erstellt:

https://quality.embarcadero.com/browse/RSP-25668


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz