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