Einzelnen Beitrag anzeigen

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, 10: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