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?