#1 2017-03-06 23:11:31

luboss
Endora uživatel
Registrován: 2014-09-16
Příspěvky: 15

Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Je možné u jednoho konkrétního PHP scriptu a jeho odpovědi na požadavek klienta nějak vypnout kompresi
Content-Encoding → gzip a Transfer-Encoding → chunked, případně nastavit HTTP na 1.0?
Jde mi o to, jak získat jako odpověď naprosto obyčejný krátký prostý text bez escape sekvencí a netisknutelných znaků v těle odpovědi.
Zaslání požadavku s Accept-Encoding → identity bohužel nemá očekávaný účinek.

Offline

#2 2017-03-07 14:37:29

PetrAndel
Podpora
Registrován: 2015-07-27
Příspěvky: 522

Re: Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Dobrý den,

pokud nezašlete Accept-Encoding: gzip, měl by se Vám vrátit klasický plaintext (zkoušel jsem nyní přes curl). Pokud však kompresi dělá samotný PHP skript zasíláním vlastních hlaviček a komprimováním bufferů, je nutné upravit skript.

Downgrade odpovědí na HTTP 1.0 bohužel není podporovaný.

Offline

#3 2017-03-07 14:59:47

luboss
Endora uživatel
Registrován: 2014-09-16
Příspěvky: 15

Re: Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Testuji spojení pomocí telnetu z příkazové řádky a pokud zašlu obyčejný GET požadavek HTTP/1.1 na PHP script, který obsahuje pouze řádek
<?php echo"Headers test"; ?>
i bez udání Accept-Encoding se vrátí v odpovědi tyto hlavičky:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 07 Mar 2017 12:45:08 GMT
Content-Type: text/html
Xransfer-Encoding: chunked
Connection: close
Content-Language: cs
Content-Encoding: gzip

Abych mohl odpověď zpracovat v jednoduchém jednočipovém mikroprocesoru, chtěl bych odstranit Content-Encoding: gzip a Xransfer-Encoding: chunked.
Zkoušel jsem zavolat v hlavičce i Accept-Encoding: identity, ale bez úspěchu.

Offline

#4 2017-03-07 15:40:01

PetrAndel
Podpora
Registrován: 2015-07-27
Příspěvky: 522

Re: Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Zkoušel jsem telnet a netcat:

GET /headertest.php HTTP/1.0
Host: rynarecka.tode.cz

Odpověď:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 07 Mar 2017 13:34:21 GMT
Content-Type: text/html
Connection: close
Content-Language: cs

<div style=" background-color:#; font-size: 10px;"><center><div class="souhrn"><div class="eq"><i>„Mít rád lidi a milovat lidi to je celé tajemství a snad jediný recept na štěstí.“ </i>Jan Werich</div></div></center></div>Headers test

Pokud odešlu požadavek s HTTP/1.1 tak se pouze zapne chunked encoding:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 07 Mar 2017 13:37:51 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Content-Language: cs

Nejsem si tedy jistý, proč by se měl server chovat tak, jak popisujete, jistě nezasíláte nějaké dodatečné hlavičky?

Offline

#5 2017-03-07 17:15:00

luboss
Endora uživatel
Registrován: 2014-09-16
Příspěvky: 15

Re: Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Telnet:

GET /www/headertest.php HTTP/1.1
Host: rynarecka.tode.cz

Odpověď:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 07 Mar 2017 12:45:08 GMT
Content-Type: text/html
Xransfer-Encoding: chunked
Connection: close
Content-Language: cs
Content-Encoding: gzip

 LN=jéAÝŮa°ČŹIźŰÍ"ĄN=┘Ł─ĐuWwĂĆ$Ľ¸XŽ°ÄÉjôőxĺČŐ ╝?xĂs
<í[żń┤Ź~ÓRHyď├sŐ:~ž▄▀ş_ăŹ5ÄóRŠ8uE&ŹĄÝ<ăÜ]y┤ęÜÝa¸§P:ů\÷{äçďó׹&X8
                                                                         ň┤mKW[ĐÎ╚s,?É╔ĐZ!"Řݧ¸C┤tĚçŢ'ś!█FxĄ╠nnć§ÇŻ­ňŔ╔ťz╩JóŻŤ#■ ę═ Ř

Připojení k hostiteli bylo ztraceno.

Nicméně mám podezření, že závada je na naší straně.
Na firemním firewallu Kerio Control proběhne patrně naprosto automatická a nežádoucí úprava hlavičky a přidána komprimace a proto je vrácena komprimovaná odpověď :-(
Jdu hledat nějaký server v internetu, kde je zapnuto TRACE u HTTP protokolu, abych si ověřil své podezření...
roll

Offline

#6 2017-03-07 18:43:46

luboss
Endora uživatel
Registrován: 2014-09-16
Příspěvky: 15

Re: Vypnutí komprese a použití prostého textu v HTTP odpovědi serveru

Problém nalezen a vyřešen! Třeba to někomu pomůže.
smile

1) Odstranění gzip komprimace:
Tím, že se nepošle v požadavku hlavička Accept-Encoding nebude použita gzip komprimace.
Ale, pokud jste v síti za firewallem, ověřte si že tento automaticky nemění vaše HTTP hlavičky ve prospěch komprimace (gzip).
Např. Kerio Control toto dělá defaultně ve svém inspekčním modulu!!!
V takovém případě je nutno na tomto firewallu promapovat port 80 z konkrétního zařízení do internetu.

2) Nastavení odpovědi na prostý text
se provede jednoduše přidáním hlavičky Content-Type: text/plain

3) Odstranění chunked segmentace:
Odpověď serveru musí obsahovat hlavičku Content-Length, tedy délku těla následující odpovědi serveru.
Je tedy nutno nejdříve vytvořit odpověď, aby bylo možno spočítat počet jejích znaků,
jelikož hlavičky odpovědi je nutno bez bufferování odeslat jako první.
Příklad PHP scriptu:

<?php 
   $text = "#OK#";
   header('Content-Type: text/plain');
   header('Content-Length: ' . strlen($text));  
   echo $text;
?>

Vrácená odpověď serveru včetně hlaviček:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 07 Mar 2017 16:41:28 GMT
Content-Type: text/plain
Content-Length: 4
Connection: close
Content-Language: cs

#OK#

Offline

Zápatí

Založeno na FluxBB | CZ a SK