Discussion:
post via HTTP_RAW_POST_DATA
(trop ancien pour répondre)
Etienne
2011-10-10 09:28:05 UTC
Permalink
Bonjour.

Pour envoyer des requètes POST en PHP j'utilise ce code.

function WsPostRequest($url, $referer, $_data)
{
// convert variables array to string:
$data = array();
while(list($n,$v) = each($_data)){
$data[] = "$n=$v";
}
$data = implode('&', $data);
// format --> test1=a&test2=b etc.

// parse the given URL
$url = parse_url($url);
if ($url['scheme'] != 'http')
return false;

// extract host and path:
$host = $url['host'];
$path = $url['path'];

// open a socket connection on port 80
$fp = fsockopen($host, 80);

// send the request headers:
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1;
fr; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);

$result = '';
while(!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 2048);
}

// close the socket connection:
fclose($fp);

// split the result header from the content
$result = explode("\r\n\r\n", $result, 2);

$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';

// return as array:
return array($header, $content, $data);
}

que j'ai du récupérer il y a longtemps sur Internet !
Sauf qu'aujourd'hui le destinataire de mon message s'attend a trouver
les données dans

$HTTP_RAW_POST_DATA

comment je vais pour des données qui vont arriver dans
HTTP_RAW_POST_DATA ???

Merci.
Etienne.
Olivier Miakinen
2011-10-10 09:44:05 UTC
Permalink
Bonjour,
Post by Etienne
Pour envoyer des requètes POST en PHP j'utilise ce code.
[...]
que j'ai du récupérer il y a longtemps sur Internet !
Sauf qu'aujourd'hui le destinataire de mon message s'attend a trouver
les données dans
$HTTP_RAW_POST_DATA
comment je vais pour des données qui vont arriver dans
HTTP_RAW_POST_DATA ???
Voici ce que je crois comprendre de
<http://fr2.php.net/manual/fr/ini.core.php#ini.always-populate-raw-post-data>.

Si je ne me trompe pas dans la compréhension du truc, le plus simple
est de changer le code du destinataire et pas le tien. Soit il peut
changer la directive dans son php.ini pour que toutes les données POST
aillent dans $HTTP_RAW_POST_DATA, soit (méthode préférée) il lit le
flux php://input. Ou sinon, tu mets un type MIME incorrect au lieu du
type MIME correct pour qu'il ne soit pas reconnu (il va sans dire que
je ne conseille pas cette option).

Cordialement,
--
Olivier Miakinen
Etienne
2011-10-10 09:52:51 UTC
Permalink
Post by Olivier Miakinen
Si je ne me trompe pas dans la compréhension du truc, le plus simple
est de changer le code du destinataire et pas le tien. Soit il peut
changer la directive dans son php.ini pour que toutes les données POST
aillent dans $HTTP_RAW_POST_DATA, soit (méthode préférée) il lit le
flux php://input. Ou sinon, tu mets un type MIME incorrect au lieu du
type MIME correct pour qu'il ne soit pas reconnu (il va sans dire que
je ne conseille pas cette option).
Heu ouai.
Donc en fait pas question est comment on post quelques chose de telle
façon que le PHP de l'autre coté le récupère en lisant le flux php://input.

Par exemple, je reçoit bien les messages (moi) et la donnée se trouve
dans $HTTP_RAW_POST
il n'y a rien dans $_POST, ni null par ailleurs...

le problème est que je dois générer un réponse identique.
c'est a dire que je doit renvoyer ma réponse de telle façon que le
destinataire reçoivent ça dans HTTP_RAW_POST_DATA...

Etienne
Olivier Miakinen
2011-10-10 10:10:13 UTC
Permalink
Post by Etienne
Post by Olivier Miakinen
Si je ne me trompe pas dans la compréhension du truc, le plus simple
est de changer le code du destinataire et pas le tien. Soit il peut
changer la directive dans son php.ini pour que toutes les données POST
aillent dans $HTTP_RAW_POST_DATA, soit (méthode préférée) il lit le
flux php://input. Ou sinon, tu mets un type MIME incorrect au lieu du
type MIME correct pour qu'il ne soit pas reconnu (il va sans dire que
je ne conseille pas cette option).
Heu ouai.
Donc en fait pas question est comment on post quelques chose de telle
façon que le PHP de l'autre coté le récupère en lisant le flux php://input.
Eh bien, d'après la doc déjà citée (ou en suivant les liens, par exemple
<http://us.php.net/manual/fr/wrappers.php.php>), si le destinataire lit
le flux php://input il aura toutes les données POSTées sans rien avoir
de spécial à faire. Il a essayé et ça ne fonctionne pas ? Sinon, pour
les trouver dans $HTTP_RAW_POST_DATA, soit il change son php.ini, soit
tu lui envoies un type MIME foireux.
Post by Etienne
Par exemple, je reçoit bien les messages (moi) et la donnée se trouve
dans $HTTP_RAW_POST
Ok. Et lui ?
Post by Etienne
il n'y a rien dans $_POST, ni null par ailleurs...
Ah. Il t'envoie un type MIME foireux ? ;-)
Post by Etienne
le problème est que je dois générer un réponse identique.
c'est a dire que je doit renvoyer ma réponse de telle façon que le
destinataire reçoivent ça dans HTTP_RAW_POST_DATA...
Bon, moi je t'en dis ce que j'ai trouvé dans la doc, hein ! Jusqu'à
ce matin j'ignorais jusqu'à l'existence de cette variable et de ce
flux.

Cordialement,
--
Olivier Miakinen
Mickaël Wolff
2011-10-10 20:41:48 UTC
Permalink
Post by Olivier Miakinen
Bon, moi je t'en dis ce que j'ai trouvé dans la doc, hein ! Jusqu'à
ce matin j'ignorais jusqu'à l'existence de cette variable et de ce
flux.
Moi aussi j'ai découvert ça cette semaine :D

Le plus simple pour faire des tests, c'est encore d'employer cURL en
ligne de commande.

curl http://testhost/dumper-post-in-http-body.php -X POST -d 'toto
est dans la place'

Et dans dumper-post-in-http-body.php:
== 8< ==
<?php
var_dump(file_get_contents('php://input'));
== 8< ==

Comme ça, on peut avancer et prouver au couillon qui attend les
données que c'est lui le manchot ;)
Etienne
2011-10-11 14:55:17 UTC
Permalink
Le 10/10/2011 22:41, Mickaël Wolff a écrit :

Ben en fait ca semble finalement assez simple.
il suffit remplacer dans le code source que j'ai filé au départ

fputs($fp, $data);

par

fputs($fp, $raw);

donc en gros ça revient a envoyer une variable post sans nom de variable.

Je suis pas sur a 100% que c'est bon, mais ca semble fonctionner.
je vais approfondir la question.

Etienne

Continuer la lecture sur narkive:
Loading...