Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2007 (https://www.delphipraxis.net/143237-indy-tidhttp-tidhttpserver-kodierungsproblem-mit-delphi2007.html)

paresy 12. Nov 2009 10:40


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:
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;
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.

Delphi-Quellcode:
     AResponseInfo.ContentText := 'hier viel binärcode';
     AResponseInfo.WriteContent;
Dort konnte ich einen Workaround finden, indem ich die Kodierung abschalte. IdGlobal.ToBytes (Zeile 4973)

Delphi-Quellcode:
...
    //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
...
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.

Gibt es für Indy einen richtigen Bug-Tracker? Ich würde dann die Reports direkt in Englisch verfassen können.

Grüße,
paresy

Assertor 12. Nov 2009 12:27

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
 
Hi

Zitat:

Zitat von paresy
Gibt es für Indy einen richtigen Bug-Tracker? Ich würde dann die Reports direkt in Englisch verfassen können.

Nein, gibt es nicht mehr. Es gab mal einen, aber der wurde nicht richtig genutzt (von Entwickler und Benutzerseite). Ich habe deinen Report aber gerade weitergeleitet. Der Workaround ist natürlich nicht zu empfehlen (für alle die das lesen: besonders nicht mit D2009+).

Ich gebe Dir kurzfristig hier bescheid.

Gruß Assertor

Assertor 13. Nov 2009 19:07

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

paresy 14. Nov 2009 16:45

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

Assertor 14. Nov 2009 17:02

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2
 
Hi paresy,

Zitat:

Zitat von paresy
Danke für das Feedback. Hab jetzt alles auf Streams umgestellt und alles funktioniert wie es soll.

Danke nochmal für die schnelle Hilfe.

Keine Ursache. Zum Glück ist diese Umstellung ja einfach gewesen :)

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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