AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2007

Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2007

Ein Thema von paresy · begonnen am 12. Nov 2009 · letzter Beitrag vom 14. Nov 2009
Antwort Antwort
paresy

Registriert seit: 24. Aug 2004
Ort: Lübeck
105 Beiträge
 
Delphi 2007 Professional
 
#1

Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2007

  Alt 12. Nov 2009, 11:40
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2

  Alt 12. Nov 2009, 13:27
Hi

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
Frederik
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2

  Alt 13. Nov 2009, 20:07
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
Frederik
  Mit Zitat antworten Zitat
paresy

Registriert seit: 24. Aug 2004
Ort: Lübeck
105 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2

  Alt 14. Nov 2009, 17:45
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: Indy TIdHTTP/TIdHTTPServer Kodierungsproblem mit Delphi2

  Alt 14. Nov 2009, 18:02
Hi paresy,

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
Frederik
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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