![]() |
Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2007
Indy -> (SVN 3871)
Delphi -> 2007 (=Ansi Strings...) Nach meinem letzten SVN Update (ich war vorher irgendwo bei einer Revision aus Juli) funktioniert zwar IMAP toll, aber die HTTP Komponente transferiert Binärdaten nur noch korrupt. Es scheint irgendein Encoding Problem zu sein, dass vermutlich nur unter D2007 oder älter auftritt.
Delphi-Quellcode:
Ein ähnliches Problem gibt es auch in die andere Richtung im TIdHTTPServer. Wenn dort das selbe Bild als ResponseContent angegeben wird, empfängt der Browser nur murks.
procedure TForm3.Button1Click(Sender: TObject);
var HTTP: TIdHTTP; Strm: TFileStream; Str: String; begin //Create custom Object HTTP := TIdHTTP.Create(nil); //Add Timeouts to prevent getting stuck HTTP.ReadTimeout := 10000; HTTP.ConnectTimeout := 10000; HTTP.HandleRedirects := True; try try Strm := TFileStream.Create(ExtractFilePath(Application.ExeName)+'\test.jpg', fmOpenReadWrite); except Strm := TFileStream.Create(ExtractFilePath(Application.ExeName)+'\test.jpg', fmCreate); end; //Kaputt Str := HTTP.Get('http://www.dwd.de/bvbw/generator/Sites/DWDWWW/Content/Oeffentlichkeit/WV/WV11/Warnungen/Wetter__Aktuell/Regionenwetter/WetterDeutschland__allgemein__Bild,property=default.jpg'); Strm.Write(Str[1], Length(Str)); //Geht HTTP.Get('http://www.dwd.de/bvbw/generator/Sites/DWDWWW/Content/Oeffentlichkeit/WV/WV11/Warnungen/Wetter__Aktuell/Regionenwetter/WetterDeutschland__allgemein__Bild,property=default.jpg', Strm); Strm.Free; finally //Cleanup custom Objects HTTP.Free; end; end;
Delphi-Quellcode:
Dort konnte ich einen Workaround finden, indem ich die Kodierung abschalte. IdGlobal.ToBytes (Zeile 4973)
AResponseInfo.ContentText := 'hier viel binärcode';
AResponseInfo.WriteContent;
Delphi-Quellcode:
ASrcEncoding und ADestEncoding sind vom Typ TIdMBCSEncoding und haben als Einstellung IsSingleByte = True und MaxCharSize = 1, wodurch eigentlich keine Konvertierung notwendig ist. Es wird aber eine gemacht, die dann den Inhalt zerstört.
...
//workaround for encoding bug if ASrcEncoding.ClassName <> ADestEncoding.ClassName then //added Result := TIdTextEncoding.Convert( ASrcEncoding, ADestEncoding, RawToBytes(AValue[AIndex], LLength)) else //added Result := RawToBytes(AValue[AIndex], LLength); //added ... Gibt es für Indy einen richtigen Bug-Tracker? Ich würde dann die Reports direkt in Englisch verfassen können. Grüße, paresy |
Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
Hi
Zitat:
Ich gebe Dir kurzfristig hier bescheid. Gruß Assertor |
Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
Hi,
Feedback: Das ist kein Bug, sondern "As Designed". Du nutzt Strings für Binärdaten, ich weiß nicht wie oft wir das Thema schon hatten (auch Hagen und Gammatester haben darauf im Crypto Bereich hingewiesen). Das fliegt Dir nun - zu recht - um die Ohren. Warum aber erst jetzt: Weil Indy breit aufgestellt wurde, die Charsets der Server automatisch zu berücksichtigen. Auch die Unicode Umstellung mit D2009+ trägt dazu bei. Bitte nutze die entsprechenden Funktionen, zB. IdHTTP1.Get('URL', Stream), um unkonvertierte Binärdaten zu übertragen. Machst Du es weiter so, bekommst es "irgendwie" zum laufen, knallt es spätestens mit einem Compiler von D2009 und neuer. Gruß Assertor |
Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
Danke für das Feedback. Hab jetzt alles auf Streams umgestellt und alles funktioniert wie es soll.
Danke nochmal für die schnelle Hilfe. paresy |
Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
Hi paresy,
Zitat:
Gruß Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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-2025 by Thomas Breitkreuz