=^.^=

Portable PHP HTTP(S) GET Request with HTTP Basic Authentication

karma

I'm not sure where I found this class years ago (probably the php.net comments) but it's a handy way to make simple HTTP GET requests in PHP without having to rely on the availability of allow_url_fopen or curl extensions. It supports automatic detection of SSL/TLS and non-default port numbers based on the URL you provide.

I've made a minor modification to include support for HTTP Basic Authentication.

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 var $_user; // HTTP Basic Auth User var $_pass; // HTTP Basic Auth Password // 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, $user='', $pass='') { $this->_url = $url; $this->_scan_url(); $this->_user = $user; $this->_pass = $pass; } // download URL to string function DownloadToString() { $crlf = "\r\n"; // generate request $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf . 'Host: ' . $this->_host . $crlf; if(!empty($this->_user)) $req .= "Authorization: Basic " . base64_encode($this->_user . ':' . $this->_pass) . $crlf; $req .= $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? if(isset($headers['location'])) { $http = new HTTPRequest($headers['location']); return($http->DownloadToString($http)); } else { return($body); } } }

Usage:

$r = new HTTPRequest($url, [username], [password]);
$response = $r->DownloadToString();

The username and password variables are optional.

Comments

karma

@Francis
It will throw a warning if you have a very low level of error logging enabled. This is not recommended for production environments, but they're right - technically you SHOULD initialize that variable although it is not necessary.

This script could be easily modified to do a PUT, simply modify the request header and dump the content of the file you are PUTting into the request body.

• Francis

Many thanks for your code.
On line 67 :
$response .= fread($this->_fp, 1024);
It generates an error because the $response is not initialized.

Do you know an easy way to do PUT request like this way ?