I recently encountered a scenario where one of my site’s login system stopped working. The piece of code that stopped working was the third-party login that leveraged GitHub for the authentication. It was one of those “it worked yesterday” moments for sure.

After some research, I discovered that GitHub had changed their API to make it mandatory to specify the user agent header for all of it’s API calls. This was all well and good and I hopped in to make the change only to realize that the code that was failing was using file_get_contents() and well, it worked fine for a quick GET of the URL in the past but I had never used it in conjunction of HTTP headers, that’s typically where I’d use cURL.

I didn’t necessary want to rewrite the code to use cURL so I went ahead and consulted the PHP documentation for file_get_contents() only to discover that you can pass in a custom stream context to set the header’s you’d like to be passed along. It adds a few more lines of code (it could easily be done in one long line if so inclined) and got the job done in resolving my issue.

$options  = array('http' => array('user_agent' => 'custom user agent string'));
$context  = stream_context_create($options);
$response = file_get_contents('http://domain/path/to/uri', false, $context);

So that got everything up and running again but it begged the question, what about error handling? As it turns out file_get_contents() simply returns false when it fails. That by itself can prove problematic if you forget to use check for equality (===) but by design the function lacks error reporting. Although using the context fixed the issue I will still be going back and rewriting the code to use cURL so that I can have better error handling in the future thanks to curl_errno() and curl_error().





Did you enjoy this post?

Cool if I slip into your inbox with more?
Full posts, 1-2 times per week: