Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398

    problema con le risposte si un socket http

    Ciao

    spero possiate aiutarmi perché mi sono impantanato.
    Sto facendo una funzione che semplicemente fa una richiesta a una url aprendo una socket
    Funziona il problema e' che la risposta e' spezzata in più parti con dei caratteri in mezzo.

    E' sicuramente un problema di protocollo ma non conosco cosi bene la teoria.
    Se qualcuno potesse indicarmi la via ...
    Codice PHP:
    function httpPost($host$path$data_to_send) {
      
    $transport='tcp'
      
    $port=80;

      
    $remote=$transport.'://'.$host.':'.$port;

      
    $fp stream_socket_client$remote$err$errstr60);

      if (!
    $fp) {
        
    trigger_error('httpPost error: '.$errstr);
        return 
    NULL;
      }

      
    $endLine "\n";
      
    $req='';
      
    $req.="GET ".$path." HTTP/1.1".$endLine;
      
    $req.='Host: '.$host.$endLine;
      
    $req.='User-Agent: Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3'.$endLine;
      
    $req.="Keep-Alive: 300".$endLine;
      
    $req.="Connection: keep-alive".$endLine.$endLine;

      
    //$req.='Content-length: '. strlen($data_to_send).$endLine.$endLine;
    // $req.="Connection: close".$endLine.$endLine;

      
    fputs($fp$req);
      
    fputs($fp$data_to_send);
     
    // fputs($fp, "Connection: close".$endLine.$endLine);
        
    $res '';

      while(!
    feof($fp)) {
        
    $res .= fgets($fp128);
      }
      
    fclose($fp);

      return 
    $res;
    }
    var_dump(httpPost("it2.php.net","/manual/en/function.stream-get-line.php","")); 
    Questo e' un esempio la risposta mi torna cosi

    Codice PHP:
    header
    .
    .
    .
    Transfer-Encodingchunked
    Content
    -Typetext/html;charset=utf-8

    239e 
    // codice strano
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    .
    .
     </
    div>
    2ee2 // altro codice strano 

     
    <div id="content" class="manual/en">
    .
    .
    .
     </
    div>

    24e4 // ulteriore codice strano

     
    <a name="79944"></
    .
    .
    </
    body>
    </
    html>
    // fine della risposta


    io volevo capire come faccio a identificare quei caratteri in messo alla risposta e a eliminarli
    e quali sono le regole che mi determinano l'end body.
    Ho cercato molto in giro e continuero' a cercare ma se qualcuno mi da una mano e' meglio :P


    Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Mi rispondo da solo dopo un lungo studio del protocollo http sperando di essere utile a qualcuno che si ritrovo lo stesso problema.

    I caratteri strani non sono altro che il numero dei caratteri successivi nel caso si tratti di una risposta
    che ha nell'header
    Codice PHP:
    Transfer-Encodingchunked 
    Per decodificarla bisogna leggere la prima linea trasformare il codice esadecimale in intero leggere
    il numero di caratteri successivi metterli nella risposta poi aspettarti un altra linea che identifica i caratteri successivi e cosi via fino a quando il numero di caratteri successivi diventa 0.

    Ho analizzato lo Zend Framework per vedere come faceva ecco il metodo
    Codice PHP:
       /**
        * @category   Zend
        * @package    Zend_Http
        * @subpackage Response
        * @version    $Id: Response.php 8064 2008-02-16 10:58:39Z thomas $
        * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. ([url]http://www.zend.com[/url])
        * @license    [url]http://framework.zend.com/license/new-bsd[/url]     New BSD License
        **/


        /**
         * Decode a "chunked" transfer-encoded body and return the decoded text
         *
         * @param string $body
         * @return string
         */
        
    public static function decodeChunkedBody($body)
        {
            
    $decBody '';
            
            while (
    trim($body)) {
                if (! 
    preg_match("/^([\da-fA-F]+)[^\r\n]*\r\n/sm"$body$m)) {
                    require_once 
    'Zend/Http/Exception.php';
                    throw new 
    Zend_Http_Exception("Error parsing body - doesn't seem to be a chunked message");
                }

                
    $length hexdec(trim($m[1]));
                
    $cut strlen($m[0]);

                
    $decBody .= substr($body$cut$length);
                
    $body substr($body$cut $length 2);
            }

            return 
    $decBody;
        } 
    comunque senza stare troppo a sbattersi si può utilizzare questa classe che può essere istanziata
    passandogli la stringa in blocco della risposta http .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.