Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get info on sent PHP curl request

I'm trying to debug a curl request to a webservice 'getToken' endpoint.

I'm not 100% confident that the URL and the auth info is getting written in to the curl handle correctly.

I'm trying to use curl_getinfo($ch, CURLINFO_HEADER_OUT); to capture the sent request, but it doesn't give me much info. Is there a way to get more in depth diagnostics about what the actual curl request looks like?

Here's the 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"; 

This all works as far as it goes, but returns a 401 every time-- the API admin assures me that the username / pass I have is correct.

I was wondering if I'm somehow getting the URL value wrong, or not sending the right username / pass, but this info isn't printed in the request data saved:

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

You can see that the username/pass is not recorded (I assume for security). The endpoint URL I think is the host value plus the start of the HEAD value, so webservices.mycompany.com/export/auth?

The "Verbose Information" statement prints nothing. Not sure why on this either!

Thanks for help.

EDIT: added verbose mode from Php - Debugging Curl thanks to commenter immulatin

like image 407
user101289 Avatar asked Jun 13 '13 16:06

user101289


People also ask

How can get cURL response data in PHP?

Just use the below piece of code to get the response from restful web service url, I use social mention url. Oldie bug a goodie... +1 for using curl_setopt_array(). So much cleaner than calling curl_setopt() over and over.

What does PHP cURL return?

Functions of cURL in PHP curl_error — It will return the string which represents the error for the particular current session.

How get cURL URL in PHP?

Use curl_getinfo($ch) , and the first element ( url ) would indicate the effective URL.


1 Answers

If you set CURLINFO_HEADER_OUT to true, outgoing headers are available in the array returned by curl_getinfo(), under request_header key:

$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']); 

This will print:

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

Note the auth details are base64-encoded:

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

Also note that username and password need to be percent-encoded to escape any URL reserved characters (/, ?, &, : and so on) they might contain:

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password)); 
like image 50
lafor Avatar answered Oct 02 '22 21:10

lafor