Search code examples
phpfile-get-contents

Using file_get_contents with basic auth and SSL


I'm attempting a GET request using SSL and basic auth using the file_get_contents function:

$username = "XXXXXXXXXX";
$password = "XXXXXXXXXX";

$url = "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api";

$context = stream_context_create(array("http" => array("header" => "Authorization: Basic " . base64_encode("$username:$password"))));

$data = file_get_contents($url, false, $context);

echo $data;

Here's the error message I get:

Warning: file_get_contents(https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api): failed to open stream: HTTP request failed! HTTP/1.0 500 Server Error...

I've already confirmed that openssl is enabled:

enter image description here

And we might as well get this out of the way up-front:

Why don't you just use cURL?

I could. But I also want to figure out why file_get_contents isn't working. I like the relative simplicity of file_get_contents. Call me crazy.


Solution

  • Curiosity is a good thing so it's cool to dig this problem without falling back to cURL before fixing this problem.

    <?php
    $username = "XXXXXXXXXX";
    $password = "XXXXXXXXXX";
    
    $url = "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api";
    
    $context = stream_context_create(array(
        "http" => array(
            "header" => "Authorization: Basic " . base64_encode("$username:$password"),
            "protocol_version" => 1.1, //IMPORTANT IS HERE
        )));
    
    $data = file_get_contents($url, false, $context);
    
    echo $data;
    

    The fact is the server does not support HTTP/1.0. So you haven't any problem with SSL/TLS nor with your user agent. It is just the server that support HTTP from 1.1.

    As said in the stream_context_create documentation the default protocol_version used in stream_context_create is 1.0. That's why you got an error 500.