AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TIdHTTP mit SSL und GZip
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TIdHTTP mit SSL und GZip

Ein Thema von Codehunter · begonnen am 28. Sep 2018 · letzter Beitrag vom 19. Dez 2018
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 09:10
Moin!

Ich bekomme einfach die Kombination HTTPS+GZip Encoding nicht zum Laufen. Zum Testen habe ich eine ganz simple Anwendung zusammengeklickt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if IdHTTP1.Compressor.IsReady then begin
    IdHTTP1.Get('https://www.google.de/');
  end else begin
    ShowMessage('ZLib nicht bereit');
  end;
end;
DFM:
Delphi-Quellcode:
  object IdHTTP1: TIdHTTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    AllowCookies = True
    ProxyParams.BasicAuthentication = False
    ProxyParams.ProxyPort = 0
    Request.ContentLength = -1
    Request.ContentRangeEnd = -1
    Request.ContentRangeStart = -1
    Request.ContentRangeInstanceLength = -1
    Request.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    Request.BasicAuthentication = False
    Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
    Request.Ranges.Units = 'bytes'
    Request.Ranges = <>
    HTTPOptions = [hoForceEncodeParams]
    Compressor = IdCompressorZLib1
    Left = 668
    Top = 225
  end
  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    MaxLineAction = maException
    Port = 0
    DefaultPort = 0
    SSLOptions.Method = sslvTLSv1_2
    SSLOptions.SSLVersions = [sslvTLSv1_2]
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 676
    Top = 289
  end
  object IdCompressorZLib1: TIdCompressorZLib
    Left = 772
    Top = 265
  end
Schaue ich mir den Request dann im Wireshark an (siehe Bild unten), funktioniert zwar TLS 1.2 ganz wunderbar, allerdings wird schon im Client Hello keinerlei Compression Method angefragt. Entsprechend ist es dem Server auch völlig Wumpe und antwortet unkomprimiert.

Die ZLib ist offensichtlich geladen, sonst würde der Request gar nicht abgesetzt. Ich habe auch schon versucht, in den RequestParams.AcceptEncoding := 'gzip, deflate' zu setzen. In manchen Tutorials heißt es, man soll das explizit setzen, in anderen Tutorials wiederum heißt es gerade NICHT setzen. Es geht aber weder MIT noch OHNE AcceptEncoding.

Grüße
Cody
Miniaturansicht angehängter Grafiken
image1.jpg  
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 09:25
Ich glaube da fehlt noch sowas wie IdHttp.Request.AcceptEncoding := 'gzip, deflate';
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 09:34
Ich glaube da fehlt noch sowas wie IdHttp.Request.AcceptEncoding := 'gzip, deflate';
Ähm... Gelesen hast du aber schon bis zum Schluss?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 09:37
arg, ne, augen waren nur auf source, tut mir leid!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 09:54
IdHTTP1.Request.AcceptEncoding := 'gzip, deflate;q=1.0, *;q=0';
So sollte es forciert werden und wenn Server das nicht kann gibts 406 (not acceptable).


Ps: die zlib dll sollte sich im .exe verzeichnis befinden.
Gruß vom KodeZwerg

Geändert von KodeZwerg (28. Sep 2018 um 09:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 10:10
IdHTTP1.Request.AcceptEncoding := 'gzip, deflate;q=1.0, *;q=0'; So sollte es forciert werden und wenn Server das nicht kann gibts 406 (not acceptable).
Ps: die zlib dll sollte sich im .exe verzeichnis befinden.
Beides getan, beides ohne Erfolg. Wireshark erzählt weiterhin "Compression method: null". Mit dem Serverbetreiber (der worum es eigentlich geht, nicht der Gockel wie im Test) it abgestimmt, dass GZip tatächlich aktiviert ist.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Indy TIdHTTP mit SSL und GZip

  Alt 28. Sep 2018, 11:07
So wie ich mich jetzt gerade belesen habe ist das möglicherweise gar kein Bug sondern so gewollt. Die Kombination von SSL und Stream Compression öffnet wohl Sicherheitslücken.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
JDommi

Registriert seit: 20. Sep 2007
9 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Indy TIdHTTP mit SSL und GZip

  Alt 19. Dez 2018, 10:34
Vor einiger Zeit hatte ich das gleiche Problem.
Ich habe es mit Indy (Delphi 10.3) folgendermaßen gelöst:

1. IdHTTP
2. IdCompressorZLib
3. IdCompressionIntercept (nicht getestet, ob diese Indy-Komponente wirklich erforderlich ist)

Wichtig ist: GetPage muss zweimal aufgerufen werden.

Delphi-Quellcode:
  object IdHTTP1: TIdHTTP
    Intercept = IdCompressionIntercept1
    AllowCookies = True
    HandleRedirects = True
    ProxyParams.BasicAuthentication = False
    ProxyParams.ProxyPort = 0
    Request.ContentLength = -1
    Request.ContentRangeEnd = -1
    Request.ContentRangeStart = -1
    Request.ContentRangeInstanceLength = -1
    Request.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    Request.BasicAuthentication = False
    Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
    Request.Ranges.Units = 'bytes'
    Request.Ranges = <>
    HTTPOptions = [hoForceEncodeParams]
    Compressor = IdCompressorZLib1
    Left = 16
    Top = 8
  end
  object IdCompressorZLib1: TIdCompressorZLib
    Left = 72
    Top = 8
  end
  object IdCompressionIntercept1: TIdCompressionIntercept
    CompressionLevel = 0
    Left = 128
    Top = 8
  end
Delphi-Quellcode:
function GetPage(aURL, sFile: string): string;
const
  HTTP_RESPONSE_OK = 200;
var
  Response: TStringStream;
  fehler: string;
begin
  Result := '';
  Response := TStringStream.Create('');
    try
      Form1.IdHTTP1.Get(aURL, Response);
      if Form1.IdHTTP1.ResponseCode = HTTP_RESPONSE_OK then begin
        Result := Response.DataString;
      end else begin
        fehler := 'ERROR: '+inttostr(Form1.IdHTTP1.ResponseCode)+' '+Form1.IdHTTP1.ResponseText;
        Response.WriteString(fehler);
      end;
    except
      fehler := 'ERROR: '+inttostr(Form1.IdHTTP1.ResponseCode)+' '+Form1.IdHTTP1.ResponseText;
      Response.WriteString(fehler);
    end;
    Response.SaveToFile(sFile);

    Response.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetPage(URL,'FileToSave.txt');
  GetPage(URL,'FileToSave.txt');
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:22 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