Donc, un gars d'une autre entreprise a pensé que ce serait génial si au lieu d'utiliser soap ou xml-rpc ou rest ou tout autre protocole de communication raisonnable, il intégrait simplement toute sa réponse sous forme de cookies dans l'en-tête.
Je dois retirer ces cookies comme, espérons-le, un tableau de cette réponse curl. Si je dois perdre une partie de ma vie à écrire un analyseur pour cela, je serai très malheureux.
Est-ce que quelqu'un sait comment cela peut être fait simplement, de préférence sans rien écrire dans un fichier?
Je serai très reconnaissant si quelqu'un peut m'aider avec cela.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, ce qui remplira les cookies dans un tableau associatif dans la$cookies
variable ....preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Bien que cette question soit assez ancienne et que la réponse acceptée soit valide, je la trouve un peu inconfortable car le contenu de la réponse HTTP (HTML, XML, JSON, binaire ou autre) se mélange avec les en-têtes.
J'ai trouvé une alternative différente. CURL fournit une option (
CURLOPT_HEADERFUNCTION
) pour définir un rappel qui sera appelé pour chaque ligne d'en-tête de réponse. La fonction recevra l'objet curl et une chaîne avec la ligne d'en-tête.Vous pouvez utiliser un code comme celui-ci (adapté de la réponse TML):
Cette solution a l'inconvénient d'utiliser une variable globale, mais je suppose que ce n'est pas un problème pour les scripts courts. Et vous pouvez toujours utiliser des méthodes et des attributs statiques si curl est encapsulé dans une classe.
la source
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
alorscurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Ou avez-vous juste encurlResponseHeaderCallback
dehors de la classe?Cela le fait sans regexps, mais nécessite l' extension HTTP PECL .
la source
pecl install
fonctionnait réellement. Grrr.Si vous utilisez CURLOPT_COOKIE_FILE et CURLOPT_COOKIE_JAR, curl lira / écrira les cookies depuis / dans un fichier. Vous pouvez, une fois curl terminé, le lire et / ou le modifier comme vous le souhaitez.
la source
libcurl fournit également CURLOPT_COOKIELIST qui extrait tous les cookies connus. Tout ce dont vous avez besoin est de vous assurer que la liaison PHP / CURL peut l'utiliser.
la source
quelqu'un ici peut le trouver utile. hhb_curl_exec2 fonctionne à peu près comme curl_exec, mais arg3 est un tableau qui sera rempli avec les en-têtes http renvoyés (index numérique), et arg4 est un tableau qui sera rempli avec les cookies renvoyés ($ cookies ["expires"] => " Ven, 06-May-2016 05:58:51 GMT "), et arg5 sera rempli avec ... des informations sur la requête brute faite par curl.
l'inconvénient est que CURLOPT_RETURNTRANSFER doit être activé, sinon l'erreur est supprimée et qu'il écrasera CURLOPT_STDERR et CURLOPT_VERBOSE, si vous les utilisiez déjà pour autre chose .. (je pourrais corriger cela plus tard)
exemple d'utilisation:
et la fonction elle-même.
la source
La réponse acceptée semble rechercher dans tout le message de réponse. Cela pourrait vous donner de fausses correspondances pour les en-têtes de cookies si le mot "Set-Cookie" est au début d'une ligne. Bien que cela devrait être bien dans la plupart des cas. Le moyen le plus sûr pourrait être de lire le message du début jusqu'à la première ligne vide qui indique la fin des en-têtes de message. Ceci est juste une solution alternative qui devrait rechercher la première ligne vide et ensuite utiliser preg_grep sur ces lignes uniquement pour trouver "Set-Cookie".
la source
Je crois comprendre que les cookies de
curl
doivent être écrits dans un fichier (curl -c cookie_file
). Si vous utilisezcurl
PHPexec
ou dessystem
fonctions (ou tout autre élément de cette famille), vous devriez pouvoir enregistrer les cookies dans un fichier, puis ouvrir le fichier et les lire.la source