Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

post via HTTP_RAW_POST_DATA

5 réponses
Avatar
Etienne
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.

5 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 10/10/2011 11:28, Etienne a écrit :

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
Avatar
Etienne
Le 10/10/2011 11:44, Olivier Miakinen a écrit :
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
Avatar
Olivier Miakinen
Le 10/10/2011 11:52, Etienne a écrit :

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.

Par exemple, je reçoit bien les messages (moi) et la donnée se trouve
dans $HTTP_RAW_POST



Ok. Et lui ?

il n'y a rien dans $_POST, ni null par ailleurs...



Ah. Il t'envoie un type MIME foireux ? ;-)

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
Avatar
Mickaël Wolff
On 10/10/11 12:10, Olivier Miakinen wrote:
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 ;)
Avatar
Etienne
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