Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2007, 12h57   #1
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Par défaut post et get par les sockets, comment ne pas récupérer les entêtes http

Bonjour,
j'utilise un petit script php qui me permet de simuler des requetes en post et get. je sais qu'il existe cURL mais il n'est pas installé

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<html><head></head><body>
<?php
 
 
function post_it ($datastream, $url, $method) {
 
  $url = preg_replace("@^http://@i", "", $url);
  $host = substr($url, 0, strpos($url, "/"));
  $uri = strstr($url, "/");
 
  $reqbody = "";
  foreach($datastream as $key=>$val) {
    if (!empty($reqbody)) $reqbody.= "&";
    $reqbody.= $key."=".urlencode($val);
  }
 
  if ($method == "GET") {
    $uri .= '?' . $reqbody;
  }
  echo "<br>".$uri."<br>";
  $contentlength = strlen($reqbody);
  $reqheader =  $method . " " . $uri . " HTTP/1.1\r\n".
                "Host: " . $host . "\n".
                "User-Agent: PostIt\r\n".
                "Content-Type: application/x-www-form-urlencoded\r\n".
                "Content-Length: " . $contentlength . "\r\n".
                "Connection: Close\r\n\r\n".
                $reqbody . "\r\n";
 
  echo "<br>".$reqheader."<br>";
  $socket = fsockopen($host, 80, $errno, $errstr);
 
  if (!$socket) {
    $result["errno"] = $errno;
    $result["errstr"] = $errstr;
    return $result;
  }
 
  fputs($socket, $reqheader);
 
  while (!feof($socket)) {
    $result[] = fgets($socket, 4096); 
  }
 
  fclose($socket); 
 
  return $result;
}
 
/* ---------------------------------------------------------- */
  $VARIABLE = "BLABLABLABLA \r\n";
 
  $data["UserName"] = "some";
  $data["PassWord"] = "data";
 
  $result = post_it($data, "http://localhost/test", "GET");
 
  if (isset($result["errno"])) {
    $errno = $result["errno"];
    $errstr = $result["errstr"];
    echo "<B>Error $errno</B> $errstr";
    exit;
  } else {
      for($i=0;$i< count($result); $i++) $VARIABLE .= $result[$i];
  }
  echo $VARIABLE;
 
 
?>
</body>
</html>
Seulement voilà j'ai deux questions (en fait) :
- la fonction marche très bien en post et get, mais me renvoie systématique l'entête HTTP :
Citation:
HTTP/1.1 200 OK Date: Wed, 24 Jan 2007 11:52:32 GMT Server: Apache/2.2.3 (Win32) PHP/5.2.0 Content-Length: 191 Connection: close Content-Type: text/html
y a-t-il un moyen de supprimer cela sans avoir à traiter la chaine de caractère par une quelconque fonction (que je ne connais pas encore du reste)
- lorsque j'utilise ce script en GET, je peux quand même récupérer le résultat des variables en post, est-ce normal ??? sachant que ceci n'est pas vrai en utilisant un formulaire html et en utilisant les <form>
J'espère que j'ai été assez clair
Merci d'avance
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 13h27   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Pour sauter les headers, tu dois lire tant que tu n'obtiends pas deux retours chariots à la suite.
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h15   #3
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Merci pour ta réponse,
effectivement tu as raison, c'est une solution, mais en regardant le script je me suis rendu compte que si au lieu d'utiliser une boucle sur tous les éléments du tableau $result
Code :
for($i=0;$i< count($result); $i++) $VARIABLE .= $result[$i];
je ne récupérais que le dernier élément de ce tableau :
Code :
$VARIABLE .= $result[count($result)-1];
ça marchait nickel.

qu'en penses-tu, y a-t-il une astuce qui m'échapperait et qui pourrait resortir un jour ou l'autre ?
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h29   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Si tu reçois des headers, ce n'est pas pour rien. Je pense qu'il est intéressant de regarder ce qu'ils contiennent. Notamment le statut : 200 OK
Imagine tu te choppes un 404 Not found ou 500 Internal server error.... Le reste de ton script sera foireux...

Et peut-être qu'un jour le résultat ne tiendra pas sur 1 ligne mais sur 10... Tu devra alors modifier ton count($result) - 1, pas dramatique en soi, mais si tu sautais proprement tes headers, tu n'aurais pas besoin de modifier le code....

Enfin je dis ça je dis rien
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h05   #5
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
bon, dis comme ça , du coup j'ai fait autrement :
Code :
1
2
    for($i=0;$i< count($result); $i++) $VARIABLE.= $result[$i];
    $result = strstr($VARIABLE, "\r\n\r\n");
et voilà ! (en espérant que ce soit suffisant)
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h08   #6
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
J'ai rien compris à ta solution, mais bon, si ça te convient...
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 15h45   #7
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
alors juste pour info j'ai remplacé le bout de code :
Code :
1
2
3
4
5
6
...
else {
      for($i=0;$i< count($result); $i++) $VARIABLE .= $result[$i];
  }
  echo $VARIABLE;
...
par :

Code :
1
2
3
4
5
6
7
...
  else {
    for($i=0;$i< count($result); $i++) $VARIABLE.= $result[$i];
    $result = strstr($VARIABLE, "\r\n\r\n");
  }
  echo $result;
...
le but de la fonction strstr() :

Citation:
string strstr ( string haystack , string needle )
strstr retourne une sous-chaîne de haystack , allant de la première occurrence de needle jusqu'à la fin de la chaîne.
Si needle est introuvable, strstr retourne FALSE .
Si needle n'est pas une chaîne, elle sera convertie en entier, et utilisée comme code ascii du caractère correspondant.
Il faut biensur que je test que le retour n'est pas FALSE, mais disons que je suis toujours en phase de développement

J'espère que j'ai été plus clair
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 16h05   #8
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
ok
__________________
Get your motor runnin'
Head out on the highway...
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h40.


 
 
 
 
Partenaires

Hébergement Web