Просмотр файла WebNet.class.php

Размер файла: 37.14Kb
<?php
#----------------------------------#
#********[WHT] PHPNetClass*********#
#         Made by : Sklep          #
#    E-mail : [email protected]    #
#    Site : http://Wap-Hack.Ru     #
#          ICQ : 712788            #
#----------------------------------#  

/****************************************
Самый простой пример работы класса:
<?php
 require_once "WebNet.class.php";       // подгружаем класс
 $net = new NetClient;                  // начало работы класса
 $net->agent = 'Opera 9.26';            // устанавливаем юзер агент
 $net->fetch('http://wap-hack.ru');     // обрабытываем данную страницу
 print $net->results;                   // выодим страницу на экран
 if($net->results)                      // проверяем наличие ошибок при коннекте, если они имеются то выводим их на экран
   print $net->results;  
?>


Пример отправки POST запроса:
<?php
 require_once "WebNet.class.php";             // подгружаем класс
 $net = new NetClient;                        // начало работы класса
 $net->agent = 'Opera 9.26';                  // устанавливаем юзер агент
 
 $data['log'] = 'test';                       // устанавливаем переменной log значение
 $data['par'] = 'test';                       // устанавливаем переменной par значение
 
 $net->submit('http://wap-hack.ru/assets/pages/to.php',$data);    // отправляем POST запрос на данную страницу
 print $net->results;                         // выодим страницу на экран
 if($net->results)                            // проверяем наличие ошибок при коннекте, если они имеются то выводим их на экран
   print $net->results;  
?>

ВНИМАНИЕ!
ВЫ НЕ ИМЕЕТЕ ПРАВО ВНОСИТ ИЗМЕНЕНИЯ В КОД СКРИПТА И ИЗМЕНЯТЬ КОПИРАЙТ ДЛЯ ДАЛЬНЕЙШЕГО РАСПРОСТРАНЕНИЯ!
ВЫ НЕ ИМЕЕТЕ ПРАВО ЕГО ПРОДАВАТЬ!
ПРИ РАСПРОСТРАНЕНИИ НЕОБХОДИМО СОБЛЮДАТЬ АВТОРСКИЕ ПРАВА!


Также недеюсь на вашу материальную поддержку:
WM # R 376801185853 и Z 292031174447
****************************************/


error_reporting(false); 		// отключаем вывод ненужных нам ошибок

class NetClient
{
	/* Настройки NetClient класса */

	var $host			=	"wap-hack.ru";		// адрес по умолчанию
	var $port			=	80;					// порт по умолчанию
	var $proxy_host		=	"";					// прокси
	var $proxy_port		=	"";					// порт прокси
	var $proxy_user		=	"";					// юзер прокси
	var $proxy_pass		=	"";					// пароль прокси
	
	var $agent			=	"Wap-Hack.Ru";		// устанавливаем User Agent
	var $ip			    =	"127.0.0.1";		// устанавливать по возможности данный ip
	var $accept_language=   "ru";               // язык передоваемый заголовком
	var	$referer		=	"";					// реферер
	var $cookies		=	array();			// сокеты
	var	$rawheaders		=	array();			// заголовок

	var $maxredirs		=	5;					// максимальное количество переадресаций (0-переадресация отключена)
	var $lastredirectaddr	=	"";
	var	$offsiteok		=	true;
	var $maxframes		=	0;
	var $expandlinks	=	true;
	var $passcookies	=	true;				// поддержка сокетов

	var	$user			=	"";					// логин при http аунтификации
	var	$pass			=	"";					// пароль при http аунтификации
	
	var $accept			=	"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
	
	var $results		=	"";					// выводить текст при отсутствии результата с запроса в NetClient		
	var $error			=	"";					// выводить текст при отсутствии ошибок в NetClient
	var	$response_code	=	"";					// response code returned from server
	var	$headers		=	array();			// заголовок при ответе от сервера
	var	$maxlength		=	500000;				// максимальный рамер ответа от сервера
	var $read_timeout	=	0;					// таймаут при чтении документа
	var $timed_out		=	true;				// if a read operation timed out
	var	$status			=	0;					// http request status

	var $temp_dir		=	"/tmp";				// временная папка
	var	$curl_path		=	"/usr/local/bin/curl"; //путь до библиотеки cURL
	
	var	$_maxlinelen	=	4096;				// максимальная длина заголовка
	
	var $_httpmethod	=	"GET";				// стандартный http запрос
	var $_httpversion	=	"HTTP/1.0";			// версия http протокола
	var $_submit_method	=	"POST";				// стандартный post запрос
	var $_submit_type	=	"application/x-www-form-urlencoded";	// стандартная post передача
	var $_mime_boundary	=   "";
	var $_redirectaddr	=	false;
	var $_redirectdepth	=	0;
	var $_frameurls		= 	array();
	var $_framedepth	=	0;
	
	var $_isproxy		=	false;				// принудительное включение прокси
	var $_fp_timeout	=	30;					// таймаут сокс  запроса


	
/*======================================================================*\
	Функция:	fetch
	Назначение:	вывод содержимого при запросе
	Ввод:		$URI	адрес запрашивоемой страницы
	Вывод:		$this->results	выводит полученное содержимое
\*======================================================================*/
	function fetch($URI)
	{
		$URI_PARTS = parse_url($URI);
		if (!empty($URI_PARTS["user"]))
			$this->user = $URI_PARTS["user"];
		if (!empty($URI_PARTS["pass"]))
			$this->pass = $URI_PARTS["pass"];
		if (empty($URI_PARTS["query"]))
			$URI_PARTS["query"] = '';
		if (empty($URI_PARTS["path"]))
			$URI_PARTS["path"] = '';
				
		switch(strtolower($URI_PARTS["scheme"]))
		{
			case "http":
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_connect($fp))
				{
					if($this->_isproxy)
					{
						$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);
					}
					else
					{
						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
					}
					
					$this->_disconnect($fp);

					if($this->_redirectaddr)
					{
						if($this->maxredirs > $this->_redirectdepth)
						{
							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
							{
								$this->_redirectdepth++;
								$this->lastredirectaddr=$this->_redirectaddr;
								$this->fetch($this->_redirectaddr);
							}
						}
					}

					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
					{
						$frameurls = $this->_frameurls;
						$this->_frameurls = array();
						
						while(list(,$frameurl) = each($frameurls))
						{
							if($this->_framedepth < $this->maxframes)
							{
								$this->fetch($frameurl);
								$this->_framedepth++;
							}
							else
								break;
						}
					}					
				}
				else
				{
					return false;
				}
				return true;					
				break;
			case "https":
				if(!$this->curl_path)
					return false;
				if(function_exists("is_executable"))
				    if (!is_executable($this->curl_path))
					 {
				        $this->error	=	'<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Нет поддежки cURL</font></div>';
                        return false;
					 }
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_isproxy)
				{
					$this->_httpsrequest($URI,$URI,$this->_httpmethod);
				}
				else
				{
					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
					$this->_httpsrequest($path, $URI, $this->_httpmethod);
				}

				if($this->_redirectaddr)
				{
					if($this->maxredirs > $this->_redirectdepth)
					{
						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
						{
							$this->_redirectdepth++;
							$this->lastredirectaddr=$this->_redirectaddr;
							$this->fetch($this->_redirectaddr);
						}
					}
				}
				
				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
				{
					$frameurls = $this->_frameurls;
					$this->_frameurls = array();

					while(list(,$frameurl) = each($frameurls))
					{
						if($this->_framedepth < $this->maxframes)
						{
							$this->fetch($frameurl);
							$this->_framedepth++;
						}
						else
							break;
					}
				}					
				return true;					
				break;
			default:
				// ошибка протокола
				$this->error	=	'<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Протокол '.$URI_PARTS["scheme"].' не поддерживается</font></div>';
                return false;
				break;
		}		
		return true;
	}

	
	
	
/*======================================================================*\
	Функция:	submit
	Назначение:	заменяет форму для передачи параметров
	Ввод:		$URI	адрес станицы которой передаются параметры через форму
				$formvars	текстовые параметры.
					формат: $formvars["var"] = "val";
				$formfiles  передоваемый файл
					формат: $formfiles["var"] = "/dir/filename.ext";
	Вывод:		$this->results	выводит содержимое страницы просле передачи post запроса
\*======================================================================*/
	function submit($URI, $formvars="", $formfiles="")
	{
		unset($postdata);
		
		$postdata = $this->_prepare_post_body($formvars, $formfiles);
			
		$URI_PARTS = parse_url($URI);
		if (!empty($URI_PARTS["user"]))
			$this->user = $URI_PARTS["user"];
		if (!empty($URI_PARTS["pass"]))
			$this->pass = $URI_PARTS["pass"];
		if (empty($URI_PARTS["query"]))
			$URI_PARTS["query"] = '';
		if (empty($URI_PARTS["path"]))
			$URI_PARTS["path"] = '';

		switch(strtolower($URI_PARTS["scheme"]))
		{
			case "http":
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_connect($fp))
				{
					if($this->_isproxy)
					{
						$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
					}
					else
					{
						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
						$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
					}
					
					$this->_disconnect($fp);

					if($this->_redirectaddr)
					{
						if($this->maxredirs > $this->_redirectdepth)
						{						
							if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
								$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);						
							
							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
							{
								$this->_redirectdepth++;
								$this->lastredirectaddr=$this->_redirectaddr;
								if( strpos( $this->_redirectaddr, "?" ) > 0 )
									$this->fetch($this->_redirectaddr);
								else
									$this->submit($this->_redirectaddr,$formvars, $formfiles);
							}
						}
					}

					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
					{
						$frameurls = $this->_frameurls;
						$this->_frameurls = array();
						
						while(list(,$frameurl) = each($frameurls))
						{														
							if($this->_framedepth < $this->maxframes)
							{
								$this->fetch($frameurl);
								$this->_framedepth++;
							}
							else
								break;
						}
					}					
					
				}
				else
				{
					return false;
				}
				return true;					
				break;
			case "https":
				if(!$this->curl_path)
				        return false;
				if(function_exists("is_executable"))
				    if (!is_executable($this->curl_path))
				        $this->error	=	'<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Нет поддежки cURL</font></div>';
                        return false;
				$this->host = $URI_PARTS["host"];
				if(!empty($URI_PARTS["port"]))
					$this->port = $URI_PARTS["port"];
				if($this->_isproxy)
				{
					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);
				}
				else
				{
					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
					$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);
				}

				if($this->_redirectaddr)
				{
					if($this->maxredirs > $this->_redirectdepth)
					{						
						if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr))
							$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]);						

						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
						{
							$this->_redirectdepth++;
							$this->lastredirectaddr=$this->_redirectaddr;
							if( strpos( $this->_redirectaddr, "?" ) > 0 )
								$this->fetch($this->_redirectaddr);
							else
								$this->submit($this->_redirectaddr,$formvars, $formfiles);
						}
					}
				}

				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
				{
					$frameurls = $this->_frameurls;
					$this->_frameurls = array();

					while(list(,$frameurl) = each($frameurls))
					{														
						if($this->_framedepth < $this->maxframes)
						{
							$this->fetch($frameurl);
							$this->_framedepth++;
						}
						else
							break;
					}
				}					
				return true;					
				break;
				
			default:
				// ошибка протокола
				$this->error	=	'<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Протокол '.$URI_PARTS["scheme"].' не поддерживается</font></div>';
                return false;
				break;
		}		
		return true;
	}

	
	
	
/*======================================================================*\
	Функция:	fetchlinks
	Назначение:	fetch the links from a web page
	Ввод:		$URI	where you are fetching from
	Вывод:		$this->results	an array of the URLs
\*======================================================================*/
	function fetchlinks($URI)
	{
		if ($this->fetch($URI))
		{			
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_striplinks($this->results[$x]);
			}
			else
				$this->results = $this->_striplinks($this->results);

			if($this->expandlinks)
				$this->results = $this->_expandlinks($this->results, $URI);
			return true;
		}
		else
			$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения линков с '.$URI.'</font></div>';
			return false;
	}

	
	
	
/*======================================================================*\
	Функция:	fetchform
	Назначение:	выводит из запрашивоемой страницы только формы ввода
	Ввод:		$URI	адрес страницы с формами ввода данных
	Вывод:		$this->results	показывает все формы с запрашивоемой страницы
\*======================================================================*/
	function fetchform($URI)
	{
		if ($this->fetch($URI))
		{			
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_stripform($this->results[$x]);
			}
			else
				$this->results = $this->_stripform($this->results);
			
			return true;
		}
		else
			$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения форм ввода с '.$URI.'</font></div>';
			return false;
	}

	
	
	
/*======================================================================*\
	Функция:	fetchimg
	Назначение:	выводит только изображения находящиеся на указаной страницы
	Ввод:		$URI	адрес страницы с изображением
	Вывод:		$this->results	ввыводит в при запросе все изображения
\*======================================================================*/
	function fetchimg($URI)
	{
		if ($this->fetch($URI))
		{			
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_stripimg($this->results[$x]);
			}
			else
				$this->results = $this->_stripimg($this->results);
			
			return true;
		}
		else
			$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения изображений с '.$URI.'</font></div>';
			return false;
	}	
	
	
	
	
/*======================================================================*\
	Функция:	fetchtext
	Назначение:	выводит запрашиваемую страницу в текстовом виде
	Ввод:		$URI	адрес запрашивоемой страницы
	Вывод:		$this->results	выводит запрашиваемую страницу в текстовом формате
\*======================================================================*/
	function fetchtext($URI)
	{
		if($this->fetch($URI))
		{			
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
					$this->results[$x] = $this->_striptext($this->results[$x]);
			}
			else
				$this->results = $this->_striptext($this->results);
			return true;
		}
		else
			$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения текста с '.$URI.'</font></div>';
			return false;
	}

	
	
	
/*======================================================================*\
	Функция:	submitlinks
	Назначение:	выводит исходный код страницы без ссылок
\*======================================================================*/
	function submitlinks($URI, $formvars="", $formfiles="")
	{
		if($this->submit($URI,$formvars, $formfiles))
		{			
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
				{
					$this->results[$x] = $this->_striplinks($this->results[$x]);
					if($this->expandlinks)
						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
				}
			}
			else
			{
				$this->results = $this->_striplinks($this->results);
				if($this->expandlinks)
					$this->results = $this->_expandlinks($this->results,$URI);
			}
			return true;
		}
		else
		$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения текста с '.$URI.'</font></div>';
		return false;
	}

	
	
	
/*======================================================================*\
	Функция:	submittext
	Назначение:	выводит  исходный код страницы без текста
\*======================================================================*/
	function submittext($URI, $formvars = "", $formfiles = "")
	{
		if($this->submit($URI,$formvars, $formfiles))
		{			
			if($this->lastredirectaddr)
				$URI = $this->lastredirectaddr;
			if(is_array($this->results))
			{
				for($x=0;$x<count($this->results);$x++)
				{
					$this->results[$x] = $this->_striptext($this->results[$x]);
					if($this->expandlinks)
						$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);
				}
			}
			else
			{
				$this->results = $this->_striptext($this->results);
				if($this->expandlinks)
					$this->results = $this->_expandlinks($this->results,$URI);
			}
			return true;
		}
		else
			$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка получения текста с '.$URI.'</font></div>';
            return false;
	}

	

/*======================================================================*\
	Функция:	set_submit_multipart
	Назначение:	устанавливает тип передачи при POST запросе в
				multipart/form-data
\*======================================================================*/
	function set_submit_multipart()
	{
		$this->_submit_type = "multipart/form-data";
	}

	
/*======================================================================*\
	Функция:	set_submit_normal
	Назначение:	устанавливает тип передачи при POST запросе в
				application/x-www-form-urlencoded
\*======================================================================*/
	function set_submit_normal()
	{
		$this->_submit_type = "application/x-www-form-urlencoded";
	}

	








	

/*======================================================================*\
	Системные функции
\*======================================================================*/
	
	
/*======================================================================*/
	function _striplinks($document)
	{	
		preg_match_all("'<\s*a\s.*?href\s*=\s*			# find <a href=
						([\"\'])?					# find single or double quote
						(?(1) (.*?)\\1 | ([^\s\>]+))		# if quote found, match up to next matching
													# quote, otherwise match up to next space
						'isx",$document,$links);
						

		while(list($key,$val) = each($links[2]))
		{
			if(!empty($val))
				$match[] = $val;
		}				
		
		while(list($key,$val) = each($links[3]))
		{
			if(!empty($val))
				$match[] = $val;
		}		
		
		return $match;
	}

	
	
	
/*======================================================================*/
	function _stripform($document)
	{	
		preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
		
		$match = implode("\r\n",$elements[0]);
				
		return $match;
	}

	
	
	
/*======================================================================*/
	function _stripimg($document)
	{	
		preg_match_all("'<\/?(img)[^<>]*>(?(2)(.*(?=<\/?[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
		
		$match = implode("\r\n",$elements[0]);
				
		return $match;
	}

	


	
/*======================================================================*/
	function _striptext($document)
	{
		
								
		$search = array("",
		                "пїЅ",
		                "п»ї",
		                "
",
		                "%22",
		                "'<script[^>]*?>.*?</script>'si",
						"'<[\/\!]*?[^<>]*?>'si",
						"'([\r\n])[\s]+'",
						"'&(quot|#34|#034|#x22);'i",
						"'&(amp|#38|#038|#x26);'i",
						"'&(lt|#60|#060|#x3c);'i",
						"'&(gt|#62|#062|#x3e);'i",
						"'&(nbsp|#160|#xa0);'i",
						"'&(iexcl|#161);'i",
						"'&(cent|#162);'i",
						"'&(pound|#163);'i",
						"'&(copy|#169);'i",
						"'&(reg|#174);'i",
						"'&(deg|#176);'i",
						"'&(#39|#039|#x27);'",
						"'&(euro|#8364);'i",
						"'&a(uml|UML);'",
						"'&o(uml|UML);'",
						"'&u(uml|UML);'",
						"'&A(uml|UML);'",
						"'&O(uml|UML);'",
						"'&U(uml|UML);'",
						"'&szlig;'i",
						);
		$replace = array(	"",
                    		"",
                    		"",
                    		"",
                    		"",
                    		"",
							"",
							"\\1",
							"\"",
							"&",
							"<",
							">",
							" ",
							chr(161),
							chr(162),
							chr(163),
							chr(169),
							chr(174),
							chr(176),
							chr(39),
							chr(128),
							"д",
							"ц",
							"ь",
							"Д",
							"Ц",
							"Ь",
							"Я",
						);
					
		$text = preg_replace($search,$replace,$document);
								
		return $text;
	}

	
	
	
/*======================================================================*/
	function _expandlinks($links,$URI)
	{
		
		preg_match("/^[^\?]+/",$URI,$match);

		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
		$match = preg_replace("|/$|","",$match);
		$match_part = parse_url($match);
		$match_root =
		$match_part["scheme"]."://".$match_part["host"];
				
		$search = array( 	"|^http://".preg_quote($this->host)."|i",
							"|^(\/)|i",
							"|^(?!http://)(?!mailto:)|i",
							"|/\./|",
							"|/[^\/]+/\.\./|"
						);
						
		$replace = array(	"",
							$match_root."/",
							$match."/",
							"/",
							"/"
						);			
				
		$expandedLinks = preg_replace($search,$replace,$links);

		return $expandedLinks;
	}

	
	
	
/*======================================================================*/
	function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
	{
		$cookie_headers = '';
		if($this->passcookies && $this->_redirectaddr)
			$this->setcookies();
			
		$URI_PARTS = parse_url($URI);
		if(empty($url))
			$url = "/";
		$headers = $http_method." ".$url." ".$this->_httpversion."\r\n";		
		if(!empty($this->agent))
			$headers .= "User-Agent: ".$this->agent."\r\n";
		if(!empty($this->host) && !isset($this->rawheaders['Host'])) {
			$headers .= "Host: ".$this->host;
			if(!empty($this->port))
				$headers .= ":".$this->port;
			$headers .= "\r\n";
		}
		if(!empty($this->ip))
			$headers .= "Client-Ip: ".$this->ip."\r\n";
		if(!empty($this->accept))
			$headers .= "Accept: ".$this->accept."\r\n";
        if(!empty($this->accept_language))
			$headers .= "Accept-language: ".$this->accept_language."\r\n";
		if(!empty($this->referer))
			$headers .= "Referer: ".$this->referer."\r\n";
		if(!empty($this->cookies))
		{			
			if(!is_array($this->cookies))
				$this->cookies = (array)$this->cookies;
	
			reset($this->cookies);
			if ( count($this->cookies) > 0 ) {
				$cookie_headers .= 'Cookie: ';
				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
				$cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; ";
				}
				$headers .= substr($cookie_headers,0,-2) . "\r\n";
			} 
		}
		if(!empty($this->rawheaders))
		{
			if(!is_array($this->rawheaders))
				$this->rawheaders = (array)$this->rawheaders;
			while(list($headerKey,$headerVal) = each($this->rawheaders))
				$headers .= $headerKey.": ".$headerVal."\r\n";
		}
		if(!empty($content_type)) {
			$headers .= "Content-type: $content_type";
			if ($content_type == "multipart/form-data")
				$headers .= "; boundary=".$this->_mime_boundary;
			$headers .= "\r\n";
		}
		if(!empty($body))	
			$headers .= "Content-length: ".strlen($body)."\r\n";
		if(!empty($this->user) || !empty($this->pass))	
			$headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n";
		
		//авторизация на прокси
		if(!empty($this->proxy_user))	
			$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";


		$headers .= "\r\n";
		
		if ($this->read_timeout > 0)
			socket_set_timeout($fp, $this->read_timeout);
		$this->timed_out = false;
		
		fwrite($fp,$headers.$body,strlen($headers.$body));
		
		$this->_redirectaddr = false;
		unset($this->headers);
						
		while($currentHeader = fgets($fp,$this->_maxlinelen))
		{
			if ($this->read_timeout > 0 && $this->_check_timeout($fp))
			{
				$this->status=-100;
				return false;
			}
				
			if($currentHeader == "\r\n")
				break;
						
			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
			{
				preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches);
				if(!preg_match("|\:\/\/|",$matches[2]))
				{
					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
					if(!preg_match("|^/|",$matches[2]))
							$this->_redirectaddr .= "/".$matches[2];
					else
							$this->_redirectaddr .= $matches[2];
				}
				else
					$this->_redirectaddr = $matches[2];
			}
		
			if(preg_match("|^HTTP/|",$currentHeader))
			{
                if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status))
				{
					$this->status= $status[1];
                }				
				$this->response_code = $currentHeader;
			}
				
			$this->headers[] = $currentHeader;
		}

		$results = '';
		do {
    		$_data = fread($fp, $this->maxlength);
    		if (strlen($_data) == 0) {
        		break;
    		}
    		$results .= $_data;
		} while(true);

		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
		{
			$this->status=-100;
			return false;
		}
		

		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))

		{
			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
		}

		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
		{
			$this->results[] = $results;
			for($x=0; $x<count($match[1]); $x++)
				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
		}
		elseif(is_array($this->results))
			$this->results[] = $results;
		else
			$this->results = $results;
		
		return true;
	}

	
	
	
/*======================================================================*/
	function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
	{
		if($this->passcookies && $this->_redirectaddr)
			$this->setcookies();

		$headers = array();		
					
		$URI_PARTS = parse_url($URI);
		if(empty($url))
			$url = "/";	
		if(!empty($this->agent))
			$headers[] = "User-Agent: ".$this->agent;
		if(!empty($this->host))
			if(!empty($this->port))
				$headers[] = "Host: ".$this->host.":".$this->port;
			else
				$headers[] = "Host: ".$this->host;
		if(!empty($this->ip))
			$headers[] = "Client-Ip: ".$this->ip;
		if(!empty($this->accept))
			$headers[] = "Accept: ".$this->accept;
        if(!empty($this->accept_language))
			$headers[] = "Accept-language: ".$this->accept_language;
		if(!empty($this->referer))
			$headers[] = "Referer: ".$this->referer;
		if(!empty($this->cookies))
		{			
			if(!is_array($this->cookies))
				$this->cookies = (array)$this->cookies;
	
			reset($this->cookies);
			if ( count($this->cookies) > 0 ) {
				$cookie_str = 'Cookie: ';
				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
				$cookie_str .= $cookieKey."=".urlencode($cookieVal)."; ";
				}
				$headers[] = substr($cookie_str,0,-2);
			}
		}
		if(!empty($this->rawheaders))
		{
			if(!is_array($this->rawheaders))
				$this->rawheaders = (array)$this->rawheaders;
			while(list($headerKey,$headerVal) = each($this->rawheaders))
				$headers[] = $headerKey.": ".$headerVal;
		}
		if(!empty($content_type)) {
			if ($content_type == "multipart/form-data")
				$headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary;
			else
				$headers[] = "Content-type: $content_type";
		}
		if(!empty($body))	
			$headers[] = "Content-length: ".strlen($body);
		if(!empty($this->user) || !empty($this->pass))	
			$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
			
		for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
			$safer_header = strtr( $headers[$curr_header], "\"", " " );
			$cmdline_params .= " -H \"".$safer_header."\"";
		}
		
		if(!empty($body))
			$cmdline_params .= " -d \"$body\"";
		
		if($this->read_timeout > 0)
			$cmdline_params .= " -m ".$this->read_timeout;

		
		$headerfile = tempnam($temp_dir, "sno");

		$safer_URI = strtr( $URI, "\"", " " );
		
		 exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\"",$results,$return);
		
		if($return)
		{
		    $this->error = '<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488">Проблемы в работе cURL, код ошибки: '.$return.'</font></div>';
			return false;
		}
			
			
		$results = implode("\r\n",$results);
		
		$result_headers = file("$headerfile");
						
		$this->_redirectaddr = false;
		unset($this->headers);
						
		for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)
		{
			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
			{
				preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches);
				if(!preg_match("|\:\/\/|",$matches[2]))
				{
					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
					if(!preg_match("|^/|",$matches[2]))
							$this->_redirectaddr .= "/".$matches[2];
					else
							$this->_redirectaddr .= $matches[2];
				}
				else
					$this->_redirectaddr = $matches[2];
			}
		
			if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
				$this->response_code = $result_headers[$currentHeader];

			$this->headers[] = $result_headers[$currentHeader];
		}

		
		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
		{
			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
		}

		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
		{
			$this->results[] = $results;
			for($x=0; $x<count($match[1]); $x++)
				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
		}
		
		elseif(is_array($this->results))
			$this->results[] = $results;
		else
			$this->results = $results;

			
		unlink("$headerfile");
		
		return true;
	}

	
	
	
/*======================================================================*/
	function setcookies()
	{
		for($x=0; $x<count($this->headers); $x++)
		{
		if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match))
			$this->cookies[$match[1]] = urldecode($match[2]);
		}
	}

	
	
	
/*======================================================================*/
	function _check_timeout($fp)
	{
		if ($this->read_timeout > 0) {
			$fp_status = socket_get_status($fp);
			if ($fp_status["timed_out"]) {
				$this->timed_out = true;
				return true;
			}
		}
		return false;
	}

	
	
	
/*======================================================================*/
	function _connect(&$fp)
	{
		if(!empty($this->proxy_host) && !empty($this->proxy_port))
			{
				$this->_isproxy = true;
				
				$host = $this->proxy_host;
				$port = $this->proxy_port;
			}
		else
		{
			$host = $this->host;
			$port = $this->port;
		}
	
		$this->status = 0;
		
		if($fp = fsockopen(
					$host,
					$port,
					$errno,
					$errstr,
					$this->_fp_timeout
					))
		{
			// сокет соединение установлено, возращаем true
			return true;
		}
		else
		{
			// ошибка создания сокета, возращаем false
			$this->status = $errno;
			switch($errno)
			{
				case -3:
					$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Ошибка открытия сокета</font></div>';
				case -4:
					$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> dns lookup failure (-4)</font></div>';
				case -5:
					$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Время ожидания вышло</font></div>';
				default:
					$this->error='<div style="border: 1px solid red; padding: 0.5em; margin: 0.5em;"><strong><font color="red">Ошибка NetClient:</font></strong><font color="#446488"> Невозможно подключится</font></div>';
			}
			return false;
		}
	}
	
	
	
	
/*======================================================================*/
	function _disconnect($fp)
	{
		return(fclose($fp));
	}	
	

/*======================================================================*/

	function _prepare_post_body($formvars, $formfiles)
	{
		settype($formvars, "array");
		settype($formfiles, "array");
		$postdata = '';

		if (count($formvars) == 0 && count($formfiles) == 0)
			return;
		
		switch ($this->_submit_type) {
			case "application/x-www-form-urlencoded":
				reset($formvars);
				while(list($key,$val) = each($formvars)) {
					if (is_array($val) || is_object($val)) {
						while (list($cur_key, $cur_val) = each($val)) {
							$postdata .= urlencode($key)."[]=".urlencode($cur_val)."&";
						}
					} else
						$postdata .= urlencode($key)."=".urlencode($val)."&";
				}
				break;

			case "multipart/form-data":
				$this->_mime_boundary = "NetClient".md5(uniqid(microtime()));
				
				reset($formvars);
				while(list($key,$val) = each($formvars)) {
					if (is_array($val) || is_object($val)) {
						while (list($cur_key, $cur_val) = each($val)) {
							$postdata .= "--".$this->_mime_boundary."\r\n";
							$postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n";
							$postdata .= "$cur_val\r\n";
						}
					} else {
						$postdata .= "--".$this->_mime_boundary."\r\n";
						$postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
						$postdata .= "$val\r\n";
					}
				}
				
				reset($formfiles);
				while (list($field_name, $file_names) = each($formfiles)) {
					settype($file_names, "array");
					while (list(, $file_name) = each($file_names)) {
						if (!is_readable($file_name)) continue;

						$fp = fopen($file_name, "r");
						$file_content = fread($fp, filesize($file_name));
						fclose($fp);
						$base_name = basename($file_name);

						$postdata .= "--".$this->_mime_boundary."\r\n";
						$postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n";
						$postdata .= "$file_content\r\n";
					}
				}
				$postdata .= "--".$this->_mime_boundary."--\r\n";
				break;
		}

		return $postdata;
	}
}

?>