web-dev-qa-db-fra.com

Comment obtenir des informations sur envoyé PHP demande curl

J'essaie de déboguer une demande curl vers un point de terminaison 'getToken' du service Web. 

Je ne suis pas sûr à 100% que l'URL et les informations d'authentification soient correctement écrites dans le descripteur Curl. 

J'essaie d'utiliser curl_getinfo($ch, CURLINFO_HEADER_OUT); pour capturer la demande envoyée, mais cela ne me donne pas beaucoup d'informations. Existe-t-il un moyen d’obtenir des diagnostics plus détaillés sur l’apparence de la demande curl?

Voici le code:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");       
curl_setopt($ch, CURLOPT_HEADER, 1); // just getting header to see if we got an auth token
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); // capture the header info
curl_setopt($ch, CURLOPT_VERBOSE, 1); // turn verbose on    
// execute the curl request 

$rh = fopen("request.txt", "w"); // open request file handle
$verbose = fopen('php://temp', 'rw+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);

curl_exec($ch); // execute request

$sent_request = curl_getinfo($ch, CURLINFO_HEADER_OUT);
fwrite($rh, $sent_request); // save the request info
fclose($rh);
!rewind($verbose);
$verboseLog = stream_get_contents($verbose);

echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";

Tout cela fonctionne dans la mesure du possible, mais renvoie 401 à chaque fois - l'administrateur de l'API m'assure que le nom d'utilisateur/mot de passe que j'ai est correct. 

Je me demandais si la valeur de l'URL était incorrecte ou si je ne transmettais pas le bon nom d'utilisateur/mot de passe, mais cette information n'est pas imprimée dans les données de la demande sauvegardées:

HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*

Vous pouvez voir que le nom d'utilisateur/pass n'est pas enregistré (je suppose pour la sécurité). Je pense que l'URL du point de terminaison est la valeur Host plus le début de la valeur HEAD, donc webservices.mycompany.com/export/auth?

L'instruction "Informations détaillées" n'imprime rien. Je ne sais pas pourquoi sur ça non plus!

Merci pour l'aide.

EDIT: ajout du mode verbose de Php - Debugging Curl merci à commenter immulatin

40
user101289

Si vous définissez CURLINFO_HEADER_OUT sur true, les en-têtes sortants sont disponibles dans le tableau renvoyé par curl_getinfo(), sous la clé request_header:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

curl_exec($ch);

$info = curl_getinfo($ch);
print_r($info['request_header']);

Cela va imprimer:

GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*

Notez que les informations d'authentification sont encodées en base64:

echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword

Notez également que le nom d'utilisateur et le mot de passe doivent être codés en pourcentage pour échapper à tous les caractères réservés aux URL (/, ?, &, : et ainsi de suite) qu'ils pourraient contenir:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
62
lafor

Vous pouvez également utiliser un outil proxy tel que Charles pour capturer les en-têtes de demande sortante, les données, etc. en transmettant les détails du proxy via CURLOPT_PROXY à votre méthode curl_setopt_array.

Par exemple:

$proxy = '127.0.0.1:8888';
$opt = array (
    CURLOPT_URL => "http://www.example.com",
    CURLOPT_PROXY => $proxy,
    CURLOPT_POST => true,
    CURLOPT_VERBOSE => true,
    );

$ch = curl_init();
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);
3
acetone

curl_getinfo() doit être ajouté avant la fermeture du gestionnaire de curl

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$info = curl_getinfo($ch);
curl_exec($ch);
print_r($info['request_header']);
1
soulge

La demande est imprimée dans un fichier request.txt avec des détails.

$ch = curl_init();
$f = fopen('request.txt', 'w');
curl_setopt_array($ch, array(
CURLOPT_URL            => $url, 
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_VERBOSE        => 1,
CURLOPT_STDERR         => $f,
));
$response = curl_exec($ch);
fclose($f);
curl_close($ch);

Vous pouvez également utiliser la fonction curl_getinfo (). 

0
Veeresh Sasalawad