<?php
        
/////////////////////////////////////////////////////////
        //
        //  AHNAR CSA3004 APT University of Malta
        //  Ian Bugeja 2005
        //
        //////////////////////////////////////////////////////////


        
class HTTP_Connect
        
{
                public 
$resheader;
                public 
$error;
                private 
$handle;

                public function 
__construct()
                {
                        
$this->error[0] = '';
                }

                function 
http_request($host$port$request)   //request and get response
                
{
                        
$this->handle fsockopen($host$port$errno$errstr30);
                        if (
$this->handle === false)
                        {
                                
$this->error[0] = 'nohost';
                                
$this->error[1] = $errstr;
                                
$this->error[2] = $errno;
                        }
                        else
                        {
                                
fwrite($this->handle$request);
                                
//read header
                                
$replyheader ''$s '*';
                                while ((
$s != '') && (!feof($this->handle)))
                                {
                                        
$s fgets($this->handle128);
                                        
$replyheader .= $s;
                                        
$s trim($s);
                                }

                                
//parse header to array
                                
$splitheader explode("\r\n"$replyheader);
                                foreach(
$splitheader as $sub)
                                {
                                        
$colpos strpos($sub':');
                                        if ((
$colpos === false) && ($sub != ''))
                                        {
                                                
$key 'head';
                                                
$value $sub;
                                                
$this->resheader[$key] = $value;
                                        }
                                        else
                                        {
                                                
$key substr($sub0$colpos);
                                                
$key strtolower($key);
                                                
$value substr($sub$colpos+2strlen($sub)-$colpos-2);
                                                if (
$key != ''$this->resheader[$key] = $value;
                                        }
                                }
                                
//print_r($this->resheader);
                                
if (is_array($this->resheader) == false)
                                {
                                        
$this->error[0] = 'nohost';
                                        
$this->error[1] = "Connection timed out...";
                                        
$this->error[2] = 0;
                                        return 
""//return nothing FAILED
                                
}

                                if ((
stripos($this->resheader['head'], '301') !== false) || (stripos($this->resheader['head'], '302') !== false))//found
                                
{
                                        
$this->error[0] = 'moved';
                                }
                                elseif (
stripos($this->resheader['head'], '50') !== false)
                                {
                                        
$this->error[0] = 'server';
                                }
                                elseif ((
stripos($this->resheader['content-type'], 'text/') === false) || ($this->resheader['content-type'] == ""))
                                {
                                        if (
array_key_exists('content-type'$this->resheader))
                                        {
                                                
$this->error[0] = 'nocontent';
                                                
fclose($this->handle);
                                                return;
                                        }
                                }

                                
//read contents
                                
$contents '';
                                if (
$this->resheader['transfer-encoding'] == "chunked")
                                {
                                        
$length fgets($this->handle4096);
                                        
$length hexdec($length); //echo $length.' ';
                                        
while ($length 0)
                                        {
                                                
$sub ''$left $length;
                                                while (
strlen($sub) != $length)
                                                {
                                                        
$sub .= fread($this->handle$left);
                                                        
$left $length strlen($sub);
                                                }

                                                
fgets($this->handle8192);
                                                
$length fgets($this->handle8192);
                                                
$length hexdec($length);
                                                
$contents .= $sub;
                                        }
                                }
                                else
                                {       
$contents .= fgets($this->handle128);
                                        while (!
feof($this->handle))
                                        {
                                                
$contents .= fgets($this->handle128);
                                        }
                                }
                                
fclose($this->handle);

                                return 
$contents;
                        }
                }

                public static function 
sort_query($qarray//removes ahnar variables from the name=value pairs
                
{
                        
$query '';
                        
reset($qarray);
                        while (
$value current($qarray))
                        {
                                
$key key($qarray);
                                if (
stripos($key'ahnarurl') !== false)
                                {
                                        
$quesmrk stripos($value'?'0);
                                        if (
$quesmrk !== false)
                                        {
                                                if (
$query != ''$query  .= '&';
                                                
$eqpos stripos($value'='$quesmrk);
                                                
//$query .= substr($value, $quesmrk+1, strlen($value)-($quesmrk+1));
                                                
$query .= substr($value$quesmrk+1$eqpos-($quesmrk+1));
                                                
$query .= '=';
                                                
$query .= urlencode(substr($value$eqpos+1strlen($value)-($eqpos+1)));
                                        }
                                }
                                elseif (
stripos($key'ahnar') === false)
                                {
                                        if (
$query != ''$query  .= '&';
                                        
$query .= $key.'='.urlencode($value);
                                }
                                
next($qarray);
                        }

                        return 
$query;
                }

                public static function 
sort_cookie($cookie)  //sorts out the cookie to send to server
                
{
                        
$ecookie explode("; "$cookie);
                        
$cook "";
                        foreach(
$ecookie as $ec)
                        {
                                if (
stripos($ec"expires") === false)
                                if (
stripos($ec"domain") === false)
                                if (
stripos($ec"path") === false)
                                        
$cook $ec.';';
                        }

                        return 
$cook;
                }

        }
?>