[PHP] pobieranie plików za pomocą gzniazd

0

hej, rzecz jest wydaje mi sie dosc łatwa - musze napisac skrypt, ktory pobieralby plik z jakiejs lokalizacji. Nie chodzi mi o rozwiazanie jak najczesciej prezentowane w internecie (formularz i upload od uzytkownika), nie chce tez stosowac CURL'a ani fopen - nie kazdy serwer ma wkompilowanego CURLa i nie kazdy pozwala otwierac pliki na innych serwerach jak lokalnie.

Zostaly jedynie sockety. Mam wiec cos takiego:

<?php
 $domena="www.onet.pl";
 $plik="/favicon.ico";

 $fp = fsockopen("$domena", 80, $errno, $errstr, 30);
  if (!$fp) {
    echo "$errstr ($errno)<br />\n";
 } else {
    $out = "GET $plik HTTP/1.1\r\n";
    $out .= "Host: $domena\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);

   while (!feof($fp)) {
        echo fgets($fp, 128);
        }
    fclose($fp);
 }
?>

wydaje sie ze powinno to dzialac. teraz wystarczy wyciac kawalek od " Connection: close" do konca i zapisac pod nazwa np. favicon.ico
Problem tylko taki ze nie za bardzo mi chce to dzialac ;/ Wychodza zupelnie 2 rozne pliki, jezeli zrobie to w ten sposob jak mowie, a w taki jakbym pobral normalnie - chyba cos nie tak z zapytaniem moim na HTTP... ale co ;| ?

i przy okazji - czy nie da sie skonstruowac go (zapytania) w taki sposob, aby nie wyrzucal na poczatku informacji na temat serwera ? Niby mozna to wycinac potem latwo, ale po co jezeli dalo by sie inaczej :)

tutaj przyklad jak dziala ten skrypt (nie do konca bo nie wklejam wszystkich i tak nic nie znaczacych znakow z zawartosci favicon.ico):

HTTP/1.0 200 OK Expires: Sun, 30 Jul 2006 1052 GMT Date: Sun, 23 Jul 2006 1054 GMT Server: AOLserver/3.4.2 Content-Type: image/x-icon Content-Length: 1078 Last-Modified: Fri, 21 Apr 2000 0606 GMT Age: 2768 X-Cache: HIT from sq31.test.onet.pl X-Cache-Lookup: HIT from sq31.test.onet.pl:8080 Connection: close .... i tutaj (niby) zawartosc favicon.ico...

zdaje sobie sprawe ze to moze nie jest do konca PHP ale nie znalazlem innego lepszego dzialu, gdzie moglbym to umiescic.

pozdrawiam i z gory dziekuje!

0

zawartość jest nie po Connection: close tylko po pierwszej pustej linii
zobacz czy coś da dodanie do nagłówków:
"Accept: /\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n"
"Referer: http://$domain/\r\n"

i ew. zmiana HTTP/1.1 na HTTP/1.0

ale to co otrzymujesz w ogóle nie jest ikoną czy to jest inna ikona czy o co chodzi ?

co do przy okazji to to chyba wbrew temu protokołowi, możesz zrobić coś zupełnie odwrotnego - zapytanie HEAD - dostaniesz SAME nagłówki bez treści

0
  $domena = 'www.onet.pl';
  $plik = '/favicon.ico';
  if ($fp = fsockopen($domena, 80)) {
    $data = "GET $plik HTTP/1.1\r\n";
    $data .= "Host: $domena\r\n";
    $data .= "Connection: Close\r\n\r\n";
    fputs($fp, $data);
    $data = '';
    while (strlen($buf = fread($fp, 1024))) $data .= $buf;
    fclose($fp);
    $data = substr($data, strpos($data, "\r\n\r\n") + 4);
    if ($fp = fopen('plik.ico', 'w')) fputs($fp, $data);
  }
0

tak jak podał kolega piechnat działa :)

dziękuje !

1 użytkowników online, w tym zalogowanych: 0, gości: 1