//http://www.digiways.com/articles/php/httpredirects/
class CDWHttpFile
{
/* $strLocation - URL of the last web page retreived (could be different
from what was requiested in case of HTTP redirect.) */
var $strLocation;
var $aHeaderLines; // headers of last web page
var $strFile; // last web page retreived
/* $bResult - contains true if last web page was
retrieved successfully, false otherwise. */
var $bResult;
/* ReadHttpFile - the function that does all the work.
$strUrl - URL of the page we want to get.
$iHttpRedirectMaxRecursiveCalls - maximum number of
times following HTTP redirection. */
function ReadHttpFile($strUrl, $iHttpRedirectMaxRecursiveCalls = 20)
{
// parsing the url getting web server name/IP, path and port.
$url = parse_url($strUrl);
// setting path to "/" if not present in $strUrl
if (isset($url["path"]) == false) $url["path"] = "/";
// setting port to default HTTP server port 80
if (isset($url["port"]) == false) $url["port"] = 80;
// connecting to the server
$fp = fsockopen ($url["host"], $url["port"], $errno, $errstr, 30);
// reseting class data
$this->bResult = false;
unset($this->strFile);
unset($this->aHeaderLines);
$this->strLocation = $strUrl;
/* Return if the socket was not open $this->bResult is set to false. */
if (!$fp)
return;
else
{
// composing HTTP request
$strQuery = "GET ".$url["path"];
if (isset($url["query"]) == true) $strQuery .= "?".$url["query"];
$strQuery .= " HTTP/1.0\r\n\r\n";
// sending the request to the server
fputs($fp, $strQuery);
/* $bHeader is set to true while we receive the HTTP header
and after the empty line (end of HTTP header) it's set to false. */
$bHeader = true;
// continuing untill there's no more text to read from the socket
while (!feof($fp))
{
/* reading a line of text from the socket
not more than 8192 symbols. */
$strLine = fgets($fp, 8192);
// removing trailing \n and \r characters.
$strLine = ereg_replace("[\r\n]", "", $strLine);
if ($bHeader == false)
$this->strFile .= $strLine."\n";
else
$this->aHeaderLines[] = trim($strLine);
if (strlen($strLine) == 0) $bHeader = false;
}
fclose ($fp);
}
/* Processing all HTTP header lines and checking for
HTTP redirect directive 'Location:'. */
for ($i = 0; $i < count($this->aHeaderLines); $i++)
if (strcasecmp(substr($this->aHeaderLines[$i], 0, 9), "Location:") == 0)
{
$url = trim(substr($this->aHeaderLines[$i], 9));
// $url now is the URL of the web page we are relocated to
// If $url is the same page we are requesting, just continue
if ($url != $strUrl)
{
/* If the maximum number of redirects is reached,
just return. $this->bResult is set to false. */
if ($iHttpRedirectMaxRecursiveCalls == 0) return;
/* Calling the function recursively with the new URL
and the maximum number of redirections reduced by one. */
return $this->ReadHttpFile(
$url,
$iHttpRedirectMaxRecursiveCalls-1);
}
}
/* We should get here if there was no HTTP redirect directive found.
Setting $this->bResult to true. Web page was retreived successfully. */
$this->bResult = true;
/* If magic_quotes_runtime is enabled in php.ini, then all the quotes
in the received text will be prefixed with slashes. */
if (ini_get("magic_quotes_runtime"))
{
$this->strFile = stripslashes($this->strFile);
for ($i = 0; $i < count($this->aHeaderLines); $i++)
$this->aHeaderLines[$i] = stripslashes($this->aHeaderLines[$i]);
}
}
/* Just to make it easier to use this class, adding contructor
which accepts URL as a parameter and calls ReadHttpFile functions. */
function CDWHttpFile($strUrl = "")
{
if (strlen($strUrl) > 0)
$this->ReadHttpFile($strUrl);
}
};
$httpFile = new CDWHttpFile("http://localhost");
if ($httpFile->bResult == true)
{
echo "URL: $httpFile->strLocation <br>";
foreach($httpFile->aHeaderLines as $strHeaderLine)
echo "Header line: ".htmlspecialchars($strHeaderLine)."<br>";
//echo "Contents: <hr>".htmlspecialchars($httpFile->strFile)."<hr>";
preg_split("/<body>/ || /<\/body><\/html>/",$httpFile->strFile,3);
//echo htmlspecialchars($a[0]);
}
?>
bg83
No comments:
Post a Comment