IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Parser un resultat chunked avec fsockopen


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 107
    Points : 60
    Points
    60
    Par défaut Parser un resultat chunked avec fsockopen
    Bonjour,

    Je fais une requête fsockopen du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	  fputs($fp, "POST /monsite/web/ope/execute HTTP/1.0\r\n");
    	  fputs($fp, "Host: $host\r\n");
    	  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");	  
    	  fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
    	  fputs($fp, "Cookie: JSESSIONID=$jsessionid;\r\n");
    	  fputs($fp, "Connection: close\r\n\r\n");
    	  fputs($fp, $poststring . "\r\n\r\n");
    while(!feof($fp)) {
    $data .= fgets($fp,4096);
    }

    Le résultat obtenu est du XML. Sauf que la réponse a dans l'entête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Transfer-Encoding	chunked
    et du coup j'ai dans le XML des caractères bizarres qui pourrissent les données et m'empêche de le parser correctement.
    J'effectue une requête en http 1.0, du coup je ne comprend pas trop le "chunked"... bref, je tourne en rond. j'ai essayé de multiple fonctions qui sont censé unchunked le résultat mais rien n'y fait.

    J'en appelle à votre aide si vous avez des pistes.
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 107
    Points : 60
    Points
    60
    Par défaut
    J'ai des pistes mais pas encore la solution :

    Sur le blog de Benoit Perroud, il dit :
    Transfer-Encoding: chunked

    En pratique, la réponse d'une encodage chunked donne quelque chose du style :

    taille du chunk en hexa \r\n
    données \r\n
    taille du prochain chunk \r\n
    données \r\n
    ...
    0\r\n
    \r\n

    Pour lire la réponse, il faut donc lire la taille du chunk, lire les données du chunk, lire la taille du prochain chunk, etc jusqu'à ce qu'on ait un chunk de taille null, signifiant la fin de la réponse.

    Du coup, je me demande, comment faire Pour lire la réponse, il faut donc lire la taille du chunk
    Ou mieux, ignorer la ligne qui indique la taille du chunk

    Est ce que quelqu'un a une idée ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 107
    Points : 60
    Points
    60
    Par défaut
    Je me répond à moi même, si ça peut aider quelqu'un :

    La fonction suivante décode correctement le Encoding Chunked (contrairement à la fonction donné sur php.net) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function transfer_encoding_chunked_decode($encoded)
     {
      $decoded = '';
      while (!empty($encoded))
       {
        $explode = explode("\r\n",$encoded,2);
        $counter = hexdec($explode[0]);
        $decoded .= substr($explode[1],0,$counter);
        $encoded = substr($explode[1],$counter,strlen($explode[1])-$counter);
       }
      return $decoded;
     }
    Ensuite, il faut appeler la fonction de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$parts = explode("\r\n\r\n",$data,2);
    	$data = transfer_encoding_chunked_decode($parts[1]);
    oui $data est le résultat du fsockopen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  2. Serait il possible de parser des ficheirs xml avec c++ ,
    Par jlassira dans le forum Bibliothèques
    Réponses: 11
    Dernier message: 04/01/2006, 12h58
  3. [Conseil][Amélioration]Parser un Document (JDOM) avec SAX
    Par leminipouce dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 19/12/2005, 14h30
  4. Poster une requete POST avec fsockopen
    Par ePoX dans le forum Langage
    Réponses: 8
    Dernier message: 27/11/2005, 14h20
  5. [SAX] Parser XML et validation avec dtd
    Par arno00020 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/11/2005, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo