Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdHTTP.AcceptEncoding ohne "Identity"??? (https://www.delphipraxis.net/129835-idhttp-acceptencoding-ohne-identity.html)

romber 26. Feb 2009 14:15


IdHTTP.AcceptEncoding ohne "Identity"???
 
Hallo!

Ich setzte manuell den AcceptEncoding-Header für IdHTTP:

Delphi-Quellcode:
IdHTTP1.Request.AcceptEncoding := 'gzip, deflate';
Mit einem Paketsniffer habe ich dann die Aufrufe beobachtet und rausgefunden, dass Indy trotz gesetzten AcceptEncoding-Header noch "Identity" dazu fügt. Daraufhin habe im Unit "IdHTTP" die folgenden Zeilen deaktiviert:

Delphi-Quellcode:
if IndyPos('identity', Request.AcceptEncoding) = 0 then begin {do not localize}
  if Request.AcceptEncoding <> '' then begin
      Request.AcceptEncoding := Request.AcceptEncoding + ', identity'; {do not localize}
    end else begin
      Request.AcceptEncoding := 'identity'; {do not localize}
    end;
  end;
Und trodzdem wird "Identity" hinzufügt. Wie kann ich das vermeiden?

Assertor 26. Feb 2009 15:24

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Hi romber,

auskommentieren brauchst Du das nicht!

Identity Encoding wird nach RFC2616 immer akzeptiert, außer es ist explizit deaktiviert. Daher wird es zur Sicherheit, wenn nicht bereits vom Programmierer angegeben, angefügt - so erfüllt es in jedem Fall die RFC.

Um Identitity-Encoding abzuschalten mußt Du also das AE für Identity deaktivieren z.B. mit:
Delphi-Quellcode:
IdHTTP1.Request.AcceptEncoding := 'gzip, deflate;q=1.0, identity;q=0';
oder
Delphi-Quellcode:
IdHTTP1.Request.AcceptEncoding := 'gzip, deflate;q=1.0, *;q=0';
Wobei die erste Variante zwar Identity explizit deaktiviert, aber trotzdem noch neben gzip und deflate dem Server die Wahl weiterer Encodings läßt. Die zweite Variante erlaubt explizit nur gzip und komprimiertes Encoding, verweigert aber jedes andere Encoding.

Wenn der Server sich an die Standards (RFC2616, s.o.) hält, müßte dann ein 406 ("Not Acceptable") als Fehler kommen wenn der Server in einem anderen Encoding senden will/muß.

Gruß Assertor

Edit: Gerade gesehen, wenn die Funktion wie oben gepostet noch in Indy steht würde das mit der RFC bei meiner 2. Variante kollidieren. Ich prüf das mal ab. Bis dahin also die erste Variante nehmen.

Edit2: Ich hab das gerade dem Team weitergeleitet. Ich denke jetzt 1) Du hast was falsch verstanden bzgl. Identity (was immer an es, außer es it aus). Meine Beispiele sollten also richtig sein 2) trotzdem ich Dir danken muß, denn dadurch hab ich den Bug für meine o.g. 1. AE Variante entdeckt. :thumb:

:dp:

romber 26. Feb 2009 16:12

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
@Assertor

Vielen Dank für die Hilfe!

Ich meine aber, dass das Wort "Identity" überhaupt verschwinden soll.

Assertor 26. Feb 2009 19:18

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Hi romber,

Zitat:

Zitat von romber
@Assertor

Vielen Dank für die Hilfe!

Ich meine aber, dass das Wort "Identity" überhaupt verschwinden soll.

Bitte, gern!

Wie gesagt: Da ist definitiv ein Bug drin für den Fall, daß q=0. Das wird jetzt geprüft und dann entsprechend gefixt. Aber, wenn "Identity" da vollständig verschwindet, bedeutet das technisch immer noch, daß der Server trotzdem mit Encoding "Identity" antworten darf.

Im ganzen Indy-Source kommt übrigens außer an der von Dir genannten Stelle kein weiteres mal das Wort "Identity" vor. Von daher muß Du bestimmt nur Deine "gefixte" Datei ins Projektverzeichnis legen und das Projekt neu erstellen.

Gruß Assertor

romber 26. Feb 2009 19:53

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Das habe ich auch gemacht. Habe die IdHTTP.pas in den Programmordner kopiert und o.g. Stelle deaktiviert. Es klappt nun.
Danke!

Assertor 26. Feb 2009 19:58

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Hi romber,

Zitat:

Zitat von romber
Das habe ich auch gemacht. Habe die IdHTTP.pas in den Programmordner kopiert und o.g. Stelle deaktiviert. Es klappt nun.
Danke!

Keine Ursache, gerne! Ich diskutier gerad, ob wir das Identity ganz raus nehmen, ist ja per Default sowieso an... Dann muß Du in Zukunft nicht mehr für diesen Sonderfall patchen.

Gruß Assertor

romber 26. Feb 2009 20:22

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Zitat:

Zitat von Assertor
Ich diskutier gerad, ob wir das Identity ganz raus nehmen, ist ja per Default sowieso an... Dann muß Du in Zukunft nicht mehr für diesen Sonderfall patchen.

Genau. Wenn AcceptEncoding nicht manuell gesetzt wurde, dann kann man "Identity" als Default lassen. Anderfalls den gesetzten AcceptEncoding benutzen.

Assertor 26. Feb 2009 20:38

Re: IdHTTP.AcceptEncoding ohne "Identity"???
 
Zitat:

Zitat von romber
Zitat:

Zitat von Assertor
Ich diskutier gerad, ob wir das Identity ganz raus nehmen, ist ja per Default sowieso an... Dann muß Du in Zukunft nicht mehr für diesen Sonderfall patchen.

Genau. Wenn AcceptEncoding nicht manuell gesetzt wurde, dann kann man "Identity" als Default lassen. Anderfalls den gesetzten AcceptEncoding benutzen.

Gute Idee. So werd ich das mal Durchboxen. Danke für die Anregung!

Gruß Assertor


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