PHP/file_get_content/HTTP Authentication

Soldato
Joined
18 Oct 2002
Posts
8,016
Hi all,

Am helping out a friend with a project, but have come across a slight snag, probably made worse by the fact my PHP knowledge is quite limited!

Basically, the bit I currently need help with is in a php script which pulls an XML file from the web, and saves it to the server that the script is running on.

This was all well and good, until the original data provider has changed their service slightly, and now requires authentication before the xml data can be viewed.

The script had been using get_file_content and passing it the URL to the .xml file. However, this is now failing when you bring in authentication!

When browsing via IE/FF to the .xml file, it's bringing up the standard IE/FF username/password box, so I believe this is just standard HTTP authentication, similar to using http://user:[email protected], which I've discovered doesn't work in get_file_content


So, good people of OCUK:HGP, can anyone help us out, or provide some pointers on how this could be achieved?


Thanks in advance!

Garry
 
Hi fella

I've used the following code before. I'm not sure I had the exact same problem as you, but it did involve file_get_contents failing and I thought it might be worth you trying, so here goes.

PHP:
<?php
class HTTPRequest
{
   var $_fp;        // HTTP socket
   var $_url;        // full URL
   var $_host;        // HTTP host
   var $_protocol;    // protocol (HTTP/HTTPS)
   var $_uri;        // request URI
   var $_port;        // port
   
   // scan url
   function _scan_url()
   {
       $req = $this->_url;
       
       $pos = strpos($req, '://');
       $this->_protocol = strtolower(substr($req, 0, $pos));
       
       $req = substr($req, $pos+3);
       $pos = strpos($req, '/');
       if($pos === false)
           $pos = strlen($req);
       $host = substr($req, 0, $pos);
       
       if(strpos($host, ':') !== false)
       {
           list($this->_host, $this->_port) = explode(':', $host);
       }
       else 
       {
           $this->_host = $host;
           $this->_port = ($this->_protocol == 'https') ? 443 : 80;
       }
       
       $this->_uri = substr($req, $pos);
       if($this->_uri == '')
           $this->_uri = '/';
   }
   
   // constructor
   function HTTPRequest($url)
   {
       $this->_url = $url;
       $this->_scan_url();
   }
   
   // download URL to string
   function DownloadToString()
   {
       $crlf = "\r\n";
       
       // generate request
       $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
           .    'Host: ' . $this->_host . $crlf
           .    $crlf;
       
       // fetch
       $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port);
       fwrite($this->_fp, $req);
       while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
           $response .= fread($this->_fp, 1024);
       fclose($this->_fp);
       
       // split header and body
       $pos = strpos($response, $crlf . $crlf);
       if($pos === false)
           return($response);
       $header = substr($response, 0, $pos);
       $body = substr($response, $pos + 2 * strlen($crlf));
       
       // parse headers
       $headers = array();
       $lines = explode($crlf, $header);
       foreach($lines as $line)
           if(($pos = strpos($line, ':')) !== false)
               $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1));
       
       // redirection?
       return($body);
	}
}

#usage:
$r = new HTTPRequest("http://username:[email protected]/xml_file.xml");
$comeback = $r->DownloadToString();

echo $comeback;
?>
 
Back
Top Bottom