[PHP/HTTP] simuler une requete POST

simuler une requete POST [PHP/HTTP] - PHP - Programmation

Marsh Posté le 21-08-2004 à 17:39:11    

voici le script :


function sendToHost($url,$data){  
  $url=parse_url($url);  
  $fp = fsockopen($url['host'], 80);  
  $mess=
    "POST ".$url['path']." HTTP/1.0\r\n".
    "Host: ".$url['host']."\r\n".  
    "Content-Type: application/x-www-form-urlencoded\r\n".
    "Content-Length: " . strlen($data) . "\r\n".          
    "\r\n".
    $data."\r\n";
  fputs($fp, $mess);    
  $buf="";
  while (!feof($fp)) {
      $buf .= fgets($fp,128);
  }  
  fclose($fp);
  return $buf;
}
 
$res=sendToHost('http://localhost/admin/index.php','edit=3');
header("Location: http://localhost/admin/index.php" );  
exit();

 
 
cette requete est sensé envoyé la variable edit égale à 3.
elle semble correcte puisque le code retour obtenu dans $res
est '200'.
mon probleme est que je ne peux pas récupérer la variable dans $HTTP_POST_VARS["edit"].
Je me demande si le corps de la requête a été soumis et bien reçu.
ne faudrait-il un code retour retour de '201' qui signifie qu'une ressource a été crée sur le serveur.
merci


Message édité par becvert le 21-08-2004 à 21:44:59
Reply

Marsh Posté le 21-08-2004 à 17:39:11   

Reply

Marsh Posté le 21-08-2004 à 19:42:40    

Normalement si j'ai bien compris, dans ton $res, tu dois avoir le code html de la page pour un poste de edit=3 dans cette page. C'est le cas ?
 
Il te sert à quoi ton header ?
C'est pas en faisant header que tu essayes de  voir si $HTTP_POST_VARS["edit"] est fixé par hasard?

Reply

Marsh Posté le 21-08-2004 à 20:57:03    

$res c'est simplement la reponse http du serveur. il ne s'agit pas de code html. dans ce cas précis voici à quoi c'est égal:
"HTTP/1.1 200 OK Date: Sat, 21 Aug 2004 18:47:46 GMT Server: Apache/1.3.27 (Win32) PHP/4.3.3 X-Powered-By: PHP/4.3.3 Connection: close Content-Type: text/html"
 
je veux simuler le submit d'un formulaire avec methode POST.
pour ça j'envoie la requete POST qui est sensée passer la variable edit au serveur, puis je dirige le navigateur grace à header() vers le script à executer et qui reçoit la variable.
 
est-ce plus clair ?

Reply

Marsh Posté le 21-08-2004 à 21:16:43    

en fait dans $res il y a peut-etre plus que la reponse http finalement!
j'ai presque réussi:
 

Citation :


function sendToHost($url,$data){
    global $admin_session, $admin_level;    
    $url=parse_url($url);    
    $fp = fsockopen($url['host'], 80);  
    $mess=
      "POST ".$url['path']." HTTP/1.0\r\n".
      "Host: ".$url['host']."\r\n".  
      "Content-Type: application/x-www-form-urlencoded\r\n".
      "Content-Length: " . strlen($data) . "\r\n".  
      "Cookie: admin_session=".$admin_session.";admin_level=".$admin_level."\r\n".        
      "\r\n".
      $data."\r\n";
    fputs($fp, $mess);    
    for($i=0;$i<6;$i++){ $response=fgets($fp,128); }
    $buf="";
    while (!feof($fp)) {
      $buf .= fgets($fp,128);
    }  
    fclose($fp);
    return $buf;
  }
 
   
   $res=sendToHost('http://localhost/admin/index.php','edit=3');
echo $res;
exit();

 
 
 
j'ai abandonné la redirection par header().
je fais echo sur $res.
la variable est bien récupéré par mon script.
par contre j'ai toujours en haut de la page la reponse http
"HTTP/1.1 200 OK Date: Sat, 21 Aug 2004......."
edit: en vert pour purger l'entete de la reponse. marche pour mon cas attention au débordement pour un autre cas peut-etre !
et je suis obligé de passer "manuellement" les variables de sessions
par l'en-entete cookie
 
 
j'avoue que quelquechose m'échappe dans la subtilité des échanges http.


Message édité par becvert le 21-08-2004 à 23:44:30
Reply

Marsh Posté le 22-08-2004 à 00:18:06    

becvert a écrit :

en fait dans $res il y a peut-etre plus que la reponse http finalement!
j'ai presque réussi:


 
Non c'est juste la répondse http, mais qui se décompose en une entête et un corps (partie html).
 

becvert a écrit :


j'ai abandonné la redirection par header().


 
C'est ce que j'avais cru comprendre, tu croyais envoyer un post et récupérer la page avec un header, mais ça ne pouvais pas marcher comme ça :D  
 

becvert a écrit :


edit: en vert pour purger l'entete de la reponse. marche pour mon cas attention au débordement pour un autre cas peut-etre !
 
j'avoue que quelquechose m'échappe dans la subtilité des échanges http.

 
 
En fait, la limite entête-corps est délimitée par une ligne vide. Voir http://www.commentcamarche.net/internet/http.php3 , http://www2.univ-reunion.fr/~jclai [...] nse10.html ou encore http://www.salemioche.com/http/http_art4.php . N'oublie pas que google est ton ami...
 
 

becvert a écrit :


et je suis obligé de passer "manuellement" les variables de sessions
par l'en-entete cookie

 
 
Ben c'est un peu normal. D'habitude c'est le navigateur qui le fait. Comme tu fais une "sorte de navigateur", c'est à toi de le gérer. Je te rappelle que ta session va être différente si tu utilises un navigateur et ton script. Le serveur va vous considérer comme deux clients différents.

Reply

Marsh Posté le 22-08-2004 à 14:34:12    

merci pour ton éclairage.
en effet la réponse est de même composition que la requete: entete et corps. tout simplement!
 


function PostToHost($url,$data){
  //simule une requete POST HTTP
  global $HTTP_COOKIE_VARS;  
  $url=parse_url($url);    
  $fp = fsockopen($url['host'], 80);  
  $request=
      "POST ".$url['path']." HTTP/1.0\r\n".
      "Host: ".$url['host']."\r\n".  
      "Content-Type: application/x-www-form-urlencoded\r\n".
      "Content-Length: " . strlen($data) . "\r\n";
  if(isset($HTTP_COOKIE_VARS)){
    $request.="Cookie: ";
    foreach ($HTTP_COOKIE_VARS as $var => $val){
      $request.=$var."=".$val.";";
    }  
    $request.="\r\n";
  }  
  $request.= "\r\n".$data."\r\n";  
  fputs($fp, $request);
  $header="";
  while ($header!="\r\n" ) $header=fgets($fp,128);
  $body="";
  while (!feof($fp)) {
    $body .= fgets($fp,128);
  }  
  fclose($fp);
  echo $body;
}


 
 
 
 

pascal_ a écrit :


Ben c'est un peu normal. D'habitude c'est le navigateur qui le fait. Comme tu fais une "sorte de navigateur", c'est à toi de le gérer. Je te rappelle que ta session va être différente si tu utilises un navigateur et ton script. Le serveur va vous considérer comme deux clients différents.

   
 
par contre là je n'ai pas saisi la subtilité !
et quels problèmes cela peut-il entrainer ?
 

Reply

Marsh Posté le 23-07-2008 à 08:30:21    

Bonjour,
 
  Comment faire pour que cette fonction marche également pour les sites externes ?
 
D'avance merci


---------------
Le problème avec les idées derrière la tête c'est qu'on ne peut pas les voir :??:
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed