Curl : SSL session id

Curl : SSL session id - PHP - Programmation

Marsh Posté le 27-02-2009 à 13:43:28    

Bonjour,
 
j'ai un site dynamique construit à partir de données récupérées d'un autre site web interrogé via Curl en https. Dans les faits, une première requête https en POST est faite pour s'authentifier (login + mdp), puis on parse la réponse (uniquement les headers) pour récupérer le cookie de session. Ce cookie est ensuite passé dans les headers de la seconde requête (toujours via Curl et en https) pour récupérer les informations dont j'ai besoin.
 
Ce système marchait parfaitement jusqu'à maintenant mais depuis peu, le site distant interrogé, hébergé sur différents serveurs (ce sont des serveurs Hosted Exchange), ne répond correctement à ma 2ème requête que de manière aléatoire, dans le cas contraire, je reçois une erreur "440 Login Timeout".
 
J'ai contacté le gestionnaire du site distant et d'après eux, les seuls changements qu'ils ont effectués qui peuvent impacter mon service,

Citation :

ce sont des ajustements sur les politiques de load balancing, en particulier, la plate-forme utilise maintenant le SSL ID comme élément de tracking de session

.
voilà la suite de la réponse pour information :

Citation :

Si votre application ne réutilise pas le même SSL ID au cours de ses traitements (ce que fait un navigateur), il est possible que vous n'arriviez pas sur le même serveur final, d'où des comportements incohérents potentiels

.
 
Si j'ai bien compris la réponse, ma question est donc la suivante : est-il possible avec Curl d'enchaîner 2 requêtes en gardant le même SSL ID ? Sinon qqun voit-il une autre solution ?
 
Voici également un article trouvé dans les mailing list du site de Curl : http://curl.haxx.se/mail/curlphp-2003-08/0050.html.
 
La personne dans cet article semble avoir le même problème que moi et la réponse rendu par Daniel Stenberg semble vouloir dire qu'il n'existe rien dans Curl capable de faire ceci (cependant cet article date de 2003 mais je ne trouve rien de plus récent sur le sujet).
 
Je pense qu'une solution serait de pouvoir enchainer les requêtes en restant dans la même session Curl, mais mes essais ne sont pas concluants.

Reply

Marsh Posté le 27-02-2009 à 13:43:28   

Reply

Marsh Posté le 01-03-2009 à 19:49:11    

Si les deux requêtes sont faites l'une à la suite de l'autre dans le script il n'y a aucun problème, il suffit de demander à cURL  d'utiliser HTTP 1.1 et de maintenir la connexion ouverte (avec Connection: Keep-Alive et éventuellement Keep-Alive: t) et de vérifier que tu n'utilises pas curl_close entre les deux. Dans le lien que tu donnes le problème est différent, la personne cherche à faire les deux connexions lors d'exécutions séparées de PHP, ce qui est impossible effectivement impossible à moins d'utiliser les fonctions d'ouverture de socket persistantes (pfsockopen)

Reply

Marsh Posté le 02-03-2009 à 10:38:56    

Je viens d'essayer avec les paramètres que tu m'as fourni Bouchon2, mais ça ne marche toujours pas... Ci-après un résumé de mon code. Je récupère bien le cookie lors de la première connexion, je n'ai jamaisd e problème de ce côté là. Mais cependant, maintenant quand j'enchaine les 2 requêtes, je reçois une erreur 404 pour la deuxième...
Est-ce que j'ai mal fait qqch ?
 

Code :
  1. $cr = curl_init();
  2.  
  3. //options
  4. curl_setopt($cr, CURLOPT_URL, "https://monserveur.com" );
  5. curl_setopt($cr, CURLOPT_PROXY, "monproxy:1234" );
  6. curl_setopt($cr, CURLOPT_HEADER, TRUE);
  7. curl_setopt($cr, CURLOPT_RETURNTRANSFER, TRUE);
  8.        
  9. curl_setopt($cr, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  10. $headers = array(
  11. 'Keep-Alive: 300',
  12. 'Connection: keep-alive'
  13. );
  14.        
  15. curl_setopt($cr, CURLOPT_HTTPHEADER, $headers);
  16.        
  17. $postdata =  "LOGIN=monlogin&PASSWD=monmdp";
  18.        
  19. curl_setopt($cr, CURLOPT_POST, TRUE);
  20. curl_setopt($cr, CURLOPT_POSTFIELDS, $postdata);
  21.      
  22. //get the response
  23. $sock = curl_exec($cr);
  24.                
  25. /*** parse the response ***/
  26. ereg("(sessionid=[0-9a-zA-Z-]*);",$sock,$regs);
  27. $sessionid=$regs[1];
  28. ereg("(cadata=.*); HttpOnly",$sock,$regs);
  29. $cadata=$regs[1];
  30.        
  31. $cookie = $sessionid.'; '.$cadata;
  32. /***********************/
  33.      
  34. /********************/
  35. /****2EME REQUETE****/
  36. /********************/
  37. curl_setopt($cr, CURLOPT_URL, "https://monserveur.com/Exchange/" );
  38.        
  39. $headers = array(
  40. 'Cookie: '.$cookie,
  41. 'Content-Type: text/xml; charset="UTF-8"',
  42. 'Keep-Alive: 300',
  43. 'Connection: keep-alive'
  44. );
  45.        
  46. curl_setopt($cr, CURLOPT_HTTPHEADER, $headers);
  47.      
  48. //get the response
  49. $sock = curl_exec($cr);
  50.        
  51. //close the resource
  52. curl_close($cr);

Reply

Sujets relatifs:

Leave a Replay

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