Preuzimanje requesta sam raslanio na cetri slucaja
1. Kada imamo u header Content-Lenght: xxx
$data=my_fgets(Content-Lenght)
2. Kada imamo Connestion:colose
while (!feof($this->fp)) {
$data .= fgets($this->fp, 1024);
}
3. Kada je Transfer-Encoding: chunked
za sve chunk-ove{
$data.=my_fgets(chunk_lenght)
}
4. Kada server posalje status kode 100, data jednostavno nastavimo sa citanjem sledeceg headera(krenemo od tacke 1)
najvazniji deo je funkcija koju sam napisao, za nju su mi potrebni saveti, resenja jer nisam 100% siguran dali je dobra za sve situacije.Doduse probao sam oko 15-tak sajtova i sve strane su ispravno skinute.
function my_fgets($data_length){
$rest_length=$data_length;
while ($rest_length>0){ //!feof($this->fp) feof() neradi posao
$line_length=min(1024,$rest_length);
$my_data .= fread($this->fp, $line_length);
$rest_length=$data_length-strlen($my_data);
$status=socket_get_status($this->fp);
if($status[time_out]==true){break;}
}
return $my_data;
}
umesto ove funksije u klasama koje sam nalazio se koristi fread(), ali desavalo se da ne procita zadatu duzinu nego samo deo, dok gornja funksija dobro radi.
evo i dela koda
if ($this->incoming_headers['connection'] == 'close') {
$this->debug('Slucaj 1');
while (!feof($this->fp)) {
$data .= fgets($this->fp, 1024);
}
}
else if (isset($this->incoming_headers['content-length']) and
strpos($this->incoming_headers['transfer-encoding'], 'chunked') === false) {
$this->debug('Slucaj 2, <br>Content-Length:'.$this->incoming_headers['content-length']);
//$data = fread($this->fp,$this->incoming_headers['content-length']);
$data = $this->my_fgets($this->incoming_headers['content-length']);
}
else if(trim($this->incoming_headers['transfer-encoding']) == 'chunked'){
$this->debug('Slucaj 3');
// chunked encoding
$length = fgets($this->fp, 1024);
$length = hexdec($length);
//echo $length."<br>";
while (true) {
if ($length == 0) { break; }
$data .= $this->my_fgets($length);
$total_lenght+=$length;
fgets($this->fp, 1024);
$length = fgets($this->fp, 1024);
$length = hexdec($length);
}
//echo "<hr>".$total_lenght."<hr>";
}
www.flash-news-ticker.com