Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dekompresja (gzip) strumienia http
pi_r
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 15.06.2005

Ostrzeżenie: (0%)
-----


W skrypcie w pewnym momencie muszę pobrać wiekszą ilość danych z serwera http. Aby usprawnić prace skryptu chcę pobierać z serwera skompresowane dane, wysyłam więc w nagłówku :
Kod
Accept-Encoding: gzip

W odpowiedzi otrzymuje:
Kod
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 25150
Content-Type: text/html


Następnie pobieram podaną ilość danych do stringa.
Problem zaczyna się, gdy chce dekodowac otrzymane dane, nie radzi z tym sobie funkcja gzuncompress() generując nastepujący błąd:
Kod
Warning: gzuncompress(): data error in [...]update.php on line 113


Efektów także nie widać gdy czytam za pomoca gzread() bezpośrednio z gniazda (zamiast kodu html pojawiają się losowe znaki).

Ktoś zna może jakieś inne rozwiazanie? A może ja gdzieś robię błąd? ;-)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pi_r
post
Post #2





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 15.06.2005

Ostrzeżenie: (0%)
-----


W małym uproszczeniu:

  1. <?php
  2.  
  3. $p = fsockopen($host, 80); 
  4.  
  5. fputs($p, $ask);  // wysylam zapytanie
  6.  
  7. do {  
  8. $line=fgets($p, 1024);  // odczytuje odpowiedz
  9.  
  10.  ...  // nieistotne, przetwarzanie nagłówków itp.
  11.  
  12. } while ( $line != &#092;"rn\" );
  13.  
  14. $file=fread($p,$length); // probowalem takze z gzread($p,$length);
  15.  
  16. $file=gzuncompress($file);  // jesli nie uzylem wczesniej gzread(); BTW: jest to linia 113
  17.  
  18.  
  19. ?>


Dodam, ze bez kompresji jest wszystko ok.

EDIT:
Problem rozwiązany po przejrzeniu RFC ;-)
1: Dane należy pobierac za pomocą stream_get_contents() zamiast fread(), ponieważ ta druga jest "binarnie bezpieczna"
2: Należy "obciąć" nagłówek, w wielkości 10 bajtów *
3: Należy użyć funkcji gzinflate() do zdekodowania danych

*może być dluższy, ale to już odsyłam do rfc:
http://www.gzip.org/zlib/rfc-gzip.html#file-format

Przykładowy poprawny kod:

  1. <?php
  2.  
  3. $plik = stream_get_contents($f, $length); // Pobieramy dane ze strumienia
  4. $plik = substr($plik, 10); // obcinamy naglowek
  5. $plik = gzinflate($plik); // dekodujemy
  6.  
  7. ?>


Ten post edytował pi_r 15.06.2005, 20:50:37
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 29.12.2025 - 00:10