Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTP ignoriert Exception (https://www.delphipraxis.net/92823-idhttp-ignoriert-exception.html)

Master-of-Magic 26. Mai 2007 19:32


IdHTTP ignoriert Exception
 
Hallo Leute,

Ich bin gerade auf zwei Ungereimtheiten beim IdHTTP gestoßen, die ich mir selbst nicht erklären kann. Erstmal etwas Code zum ansehen:
Delphi-Quellcode:
constructor THTTPThread.Create(CreateSuspended: Boolean; PostData: TStringList; Agentv: String);
begin
  inherited Create(CreateSuspended);
  HTTP := TIdHTTP.Create(nil);  // HTTP-Kompo wird dynamisch erstellt
  FResult := TStringList.Create;
  params := TStringList.Create;
  params.assign(PostData);
  with HTTP do
  begin
    Request.UserAgent := 'SPMT-Registration v' + Agentv;
    Request.BasicAuthentication := True;
    Request.Username := 'user';
    Request.Password := 'password';
  end;
end;
Wie man sieht, läuft die Anfrage in einem Thread und greift auf einen .htaccess geschützten Bereich zu.

Delphi-Quellcode:
procedure THTTPThread.Execute;
begin
  try
    FResponseCode := 200;
    HTTP.Response.Clear;
    FResult.Text := HTTP.Post(url, params);
    HTTP.Disconnect;
    FResponseCode := HTTP.ResponseCode;

  except
    on E: EIdHTTPProtocolException do
    begin
      FResponseCode := E.ErrorCode;
      case E.ErrorCode of
        //bla
      end;
    end;
    on E: EIdSocketError do
    begin
      FResponseCode := E.LastError;
      case E.LastError of
        //bla
      end;
    end;
    on E: EIdexception do
    begin
      FResult.Text := Format('Beim Aufbau der Verbindung ist ein %s Fehler aufgetreten. Der genaue Fehlertext ist:'#13#10#13#10'%s',
                              [E.ClassName,E.Message]);
    end;
  end;
  Synchronize(DoNotifyFinish);
end;
Bevor jemand fragt: params und url werden übergeben und sind deshalb nicht zu sehen.

Im Normalfall läuft hier alles bestens. Allerdings test ich gerade den "Nicht-Normalfall" ;) Und da bekomme ich Probleme:

1.) Wenn ich dem HTTP nur ein Passwort zuweise und Username und BasicAuth nicht setze, hängt sich der Thread mit 100% CPU auf ... ist das normal?

2.) Wenn BasicAuth, User und Pass nicht gesetzt sind, dann bekomme ich wie erwünscht eine EIdHTTPProtocolException mit 401 + Handling -> passt.

Wenn ich aber alles setze und zB ein falsches Passwort vergebe, wird keine Exception geworfen. Der ResponseCode ist zwar 401, aber ohne EIdHTTPProtocolException. Und das ist ärgerlich, weil ich dann die Server-HTML-Fehlerseite im Programm angezeigt bekomme.
Muss ich die HTTP-Responses jetzt explizit nach der Abfrage überprüfen (und das on EIdHTTPProtocolException verwerfen) oder gibt's da 'ne andere Möglichkeit?

SirThornberry 26. Mai 2007 19:38

Re: IdHTTP ignoriert Exception
 
ich finde es völlig korrekt das keine Exception in dem Fall geworfen wird weil ja nichts schief geht sondern eine seite zurück geliefert wird mit den Hinweis das ein Passwort verlangt wird (Hinweis = Fehlercode)

Master-of-Magic 26. Mai 2007 19:44

Re: IdHTTP ignoriert Exception
 
Ja, aber da liegt ja das Problem. Der 401 Fehler "es wird ein Password verlangt" wird ja korrekt behandelt (-> Exception). Der 401 Fehler "Password ist falsch" wird jedoch ignoriert. Das ist es, was mich wundert ... für mich bleibt der zweite 401 immer noch "an unexpected numeric HTTP response code" und sollte daher laut Indy-Hilfe die Exception auslösen.

SirThornberry 26. Mai 2007 21:05

Re: IdHTTP ignoriert Exception
 
ich könnte mir vorstellen das in den Programmierern der Indys folgendes vorging:
Wenn man eine Seite aufruft ohne zu wissen das ein Passwort benötigt wird sollte man drauf aufmerksam gemacht werden (per Exception)
Wenn man weiß das ein Passwort benötigt wird und eines mitschickt, so weiß man auch das man den Erfolg kontrollieren sollte.


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

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