| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259 | <?php/** * Deprecated. Use WP_HTTP (http.php) instead. */_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' );if ( ! class_exists( 'Snoopy', false ) ) :/*************************************************Snoopy - the PHP net clientAuthor: Monte Ohrt <monte@ispi.net>Copyright (c): 1999-2008 New Digital Group, all rights reservedVersion: 1.2.4 * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USAYou may contact the author of Snoopy by e-mail at:monte@ohrt.comThe latest version of Snoopy can be obtained from:http://snoopy.sourceforge.net/*************************************************/class Snoopy{	/**** Public variables ****/	/* user definable vars */	var $host			=	"www.php.net";		// host name we are connecting to	var $port			=	80;					// port we are connecting to	var $proxy_host		=	"";					// proxy host to use	var $proxy_port		=	"";					// proxy port to use	var $proxy_user		=	"";					// proxy user to use	var $proxy_pass		=	"";					// proxy password to use	var $agent			=	"Snoopy v1.2.4";	// agent we masquerade as	var	$referer		=	"";					// referer info to pass	var $cookies		=	array();			// array of cookies to pass												// $cookies["username"]="joe";	var	$rawheaders		=	array();			// array of raw headers to send												// $rawheaders["Content-type"]="text/html";	var $maxredirs		=	5;					// http redirection depth maximum. 0 = disallow	var $lastredirectaddr	=	"";				// contains address of last redirected address	var	$offsiteok		=	true;				// allows redirection off-site	var $maxframes		=	0;					// frame content depth maximum. 0 = disallow	var $expandlinks	=	true;				// expand links to fully qualified URLs.												// this only applies to fetchlinks()												// submitlinks(), and submittext()	var $passcookies	=	true;				// pass set cookies back through redirects												// NOTE: this currently does not respect												// dates, domains or paths.	var	$user			=	"";					// user for http authentication	var	$pass			=	"";					// password for http authentication	// http accept types	var $accept			=	"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";	var $results		=	"";					// where the content is put	var $error			=	"";					// error messages sent here	var	$response_code	=	"";					// response code returned from server	var	$headers		=	array();			// headers returned from server sent here	var	$maxlength		=	500000;				// max return data length (body)	var $read_timeout	=	0;					// timeout on read operations, in seconds												// supported only since PHP 4 Beta 4												// set to 0 to disallow timeouts	var $timed_out		=	false;				// if a read operation timed out	var	$status			=	0;					// http request status	var $temp_dir		=	"/tmp";				// temporary directory that the webserver												// has permission to write to.												// under Windows, this should be C:\temp	var	$curl_path		=	"/usr/local/bin/curl";												// Snoopy will use cURL for fetching												// SSL content if a full system path to												// the cURL binary is supplied here.												// set to false if you do not have												// cURL installed. See http://curl.haxx.se												// for details on installing cURL.												// Snoopy does *not* use the cURL												// library functions built into php,												// as these functions are not stable												// as of this Snoopy release.	/**** Private variables ****/	var	$_maxlinelen	=	4096;				// max line length (headers)	var $_httpmethod	=	"GET";				// default http request method	var $_httpversion	=	"HTTP/1.0";			// default http request version	var $_submit_method	=	"POST";				// default submit method	var $_submit_type	=	"application/x-www-form-urlencoded";	// default submit type	var $_mime_boundary	=   "";					// MIME boundary for multipart/form-data submit type	var $_redirectaddr	=	false;				// will be set if page fetched is a redirect	var $_redirectdepth	=	0;					// increments on an http redirect	var $_frameurls		= 	array();			// frame src urls	var $_framedepth	=	0;					// increments on frame depth	var $_isproxy		=	false;				// set if using a proxy server	var $_fp_timeout	=	30;					// timeout for socket connection/*======================================================================*\	Function:	fetch	Purpose:	fetch the contents of a web page				(and possibly other protocols in the				future like ftp, nntp, gopher, etc.)	Input:		$URI	the location of the page to fetch	Output:		$this->results	the output text from the fetch\*======================================================================*/	function fetch($URI)	{		//preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS);		$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)					{						// using proxy, send entire URI						$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);					}					else					{						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");						// no proxy, send only the path						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);					}					$this->_disconnect($fp);					if($this->_redirectaddr)					{						/* url was redirected, check if we've hit the max depth */						if($this->maxredirs > $this->_redirectdepth)						{							// only follow redirect if it's on this site, or offsiteok is true							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)							{								/* follow the redirect */								$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))				        return false;				$this->host = $URI_PARTS["host"];				if(!empty($URI_PARTS["port"]))					$this->port = $URI_PARTS["port"];				if($this->_isproxy)				{					// using proxy, send entire URI					$this->_httpsrequest($URI,$URI,$this->_httpmethod);				}				else				{					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");					// no proxy, send only the path					$this->_httpsrequest($path, $URI, $this->_httpmethod);				}				if($this->_redirectaddr)				{					/* url was redirected, check if we've hit the max depth */					if($this->maxredirs > $this->_redirectdepth)					{						// only follow redirect if it's on this site, or offsiteok is true						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)						{							/* follow the redirect */							$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:				// not a valid protocol				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';				return false;				break;		}		return true;	}/*======================================================================*\	Function:	submit	Purpose:	submit an http form	Input:		$URI	the location to post the data				$formvars	the formvars to use.					format: $formvars["var"] = "val";				$formfiles  an array of files to submit					format: $formfiles["var"] = "/dir/filename.ext";	Output:		$this->results	the text output from the 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)					{						// using proxy, send entire URI						$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);					}					else					{						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");						// no proxy, send only the path						$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);					}					$this->_disconnect($fp);					if($this->_redirectaddr)					{						/* url was redirected, check if we've hit the max depth */						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"]);							// only follow redirect if it's on this site, or offsiteok is true							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)							{								/* follow the redirect */								$this->_redirectdepth++;								$this->lastredirectaddr=$this->_redirectaddr;								if( strpos( $this->_redirectaddr, "?" ) > 0 )									$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get								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))				        return false;				$this->host = $URI_PARTS["host"];				if(!empty($URI_PARTS["port"]))					$this->port = $URI_PARTS["port"];				if($this->_isproxy)				{					// using proxy, send entire URI					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);				}				else				{					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");					// no proxy, send only the path					$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);				}				if($this->_redirectaddr)				{					/* url was redirected, check if we've hit the max depth */					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"]);						// only follow redirect if it's on this site, or offsiteok is true						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)						{							/* follow the redirect */							$this->_redirectdepth++;							$this->lastredirectaddr=$this->_redirectaddr;							if( strpos( $this->_redirectaddr, "?" ) > 0 )								$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get							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:				// not a valid protocol				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';				return false;				break;		}		return true;	}/*======================================================================*\	Function:	fetchlinks	Purpose:	fetch the links from a web page	Input:		$URI	where you are fetching from	Output:		$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			return false;	}/*======================================================================*\	Function:	fetchform	Purpose:	fetch the form elements from a web page	Input:		$URI	where you are fetching from	Output:		$this->results	the resulting html form\*======================================================================*/	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			return false;	}/*======================================================================*\	Function:	fetchtext	Purpose:	fetch the text from a web page, stripping the links	Input:		$URI	where you are fetching from	Output:		$this->results	the text from the web page\*======================================================================*/	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			return false;	}/*======================================================================*\	Function:	submitlinks	Purpose:	grab links from a form submission	Input:		$URI	where you are submitting from	Output:		$this->results	an array of the links from the post\*======================================================================*/	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			return false;	}/*======================================================================*\	Function:	submittext	Purpose:	grab text from a form submission	Input:		$URI	where you are submitting from	Output:		$this->results	the text from the web page\*======================================================================*/	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			return false;	}/*======================================================================*\	Function:	set_submit_multipart	Purpose:	Set the form submission content type to				multipart/form-data\*======================================================================*/	function set_submit_multipart()	{		$this->_submit_type = "multipart/form-data";	}/*======================================================================*\	Function:	set_submit_normal	Purpose:	Set the form submission content type to				application/x-www-form-urlencoded\*======================================================================*/	function set_submit_normal()	{		$this->_submit_type = "application/x-www-form-urlencoded";	}/*======================================================================*\	Private functions\*======================================================================*//*======================================================================*\	Function:	_striplinks	Purpose:	strip the hyperlinks from an html document	Input:		$document	document to strip.	Output:		$match		an array of the links\*======================================================================*/	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);		// catenate the non-empty matches from the conditional subpattern		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 the links		return $match;	}/*======================================================================*\	Function:	_stripform	Purpose:	strip the form elements from an html document	Input:		$document	document to strip.	Output:		$match		an array of the links\*======================================================================*/	function _stripform($document)	{		preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);		// catenate the matches		$match = implode("\r\n",$elements[0]);		// return the links		return $match;	}/*======================================================================*\	Function:	_striptext	Purpose:	strip the text from an html document	Input:		$document	document to strip.	Output:		$text		the resulting text\*======================================================================*/	function _striptext($document)	{		// I didn't use preg eval (//e) since that is only available in PHP 4.0.		// so, list your entities one by one here. I included some of the		// more common ones.		$search = array("'<script[^>]*?>.*?</script>'si",	// strip out javascript						"'<[\/\!]*?[^<>]*?>'si",			// strip out html tags						"'([\r\n])[\s]+'",					// strip out white space						"'&(quot|#34|#034|#x22);'i",		// replace html entities						"'&(amp|#38|#038|#x26);'i",			// added hexadecimal values						"'&(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",				// europe						"'&a(uml|UML);'",					// german						"'&o(uml|UML);'",						"'&u(uml|UML);'",						"'&A(uml|UML);'",						"'&O(uml|UML);'",						"'&U(uml|UML);'",						"'ß'i",						);		$replace = array(	"",							"",							"\\1",							"\"",							"&",							"<",							">",							" ",							chr(161),							chr(162),							chr(163),							chr(169),							chr(174),							chr(176),							chr(39),							chr(128),							chr(0xE4), // ANSI ä							chr(0xF6), // ANSI ö							chr(0xFC), // ANSI ü							chr(0xC4), // ANSI Ä							chr(0xD6), // ANSI Ö							chr(0xDC), // ANSI Ü							chr(0xDF), // ANSI ß						);		$text = preg_replace($search,$replace,$document);		return $text;	}/*======================================================================*\	Function:	_expandlinks	Purpose:	expand each link into a fully qualified URL	Input:		$links			the links to qualify				$URI			the full URI to get the base from	Output:		$expandedLinks	the expanded links\*======================================================================*/	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	Purpose:	go get the http data from the server	Input:		$url		the url to fetch				$fp			the current open file pointer				$URI		the full URI				$body		body contents to send if any (POST)	Output:\*======================================================================*/	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) && $this->port != 80)				$headers .= ":".$this->port;			$headers .= "\r\n";		}		if(!empty($this->accept))			$headers .= "Accept: ".$this->accept."\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";		//add proxy auth headers		if(!empty($this->proxy_user))			$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n";		$headers .= "\r\n";		// set the read timeout if needed		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 a header begins with Location: or URI:, set the redirect			if(preg_match("/^(Location:|URI:)/i",$currentHeader))			{				// get URL portion of the redirect				preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches);				// look for :// in the Location header to see if hostname is included				if(!preg_match("|\:\/\/|",$matches[2]))				{					// no host in the path, so prepend					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;					// eliminate double slash					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;		}		// check if there is a redirect meta tag		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);		}		// have we hit our frame depth and is there frame src to fetch?		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);		}		// have we already fetched framed content?		elseif(is_array($this->results))			$this->results[] = $results;		// no framed content		else			$this->results = $results;		return true;	}/*======================================================================*\	Function:	_httpsrequest	Purpose:	go get the https data from the server using curl	Input:		$url		the url to fetch				$URI		the full URI				$body		body contents to send if any (POST)	Output:\*======================================================================*/	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 = "/";		// GET ... header not needed for curl		//$headers[] = $http_method." ".$url." ".$this->_httpversion;		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->accept))			$headers[] = "Accept: ".$this->accept;		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);		$headerfile = tempnam( $this->temp_dir, "sno" );		$cmdline_params = '-k -D ' . escapeshellarg( $headerfile );		foreach ( $headers as $header ) {			$cmdline_params .= ' -H ' . escapeshellarg( $header );		}		if ( ! empty( $body ) ) {			$cmdline_params .= ' -d ' . escapeshellarg( $body );		}		if ( $this->read_timeout > 0 ) {			$cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout );		}		exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return );		if($return)		{			$this->error = "Error: cURL could not retrieve the document, error $return.";			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 a header begins with Location: or URI:, set the redirect			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))			{				// get URL portion of the redirect				preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches);				// look for :// in the Location header to see if hostname is included				if(!preg_match("|\:\/\/|",$matches[2]))				{					// no host in the path, so prepend					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;					// eliminate double slash					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];		}		// check if there is a redirect meta tag		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);		}		// have we hit our frame depth and is there frame src to fetch?		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);		}		// have we already fetched framed content?		elseif(is_array($this->results))			$this->results[] = $results;		// no framed content		else			$this->results = $results;		unlink("$headerfile");		return true;	}/*======================================================================*\	Function:	setcookies()	Purpose:	set cookies for a redirection\*======================================================================*/	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	Purpose:	checks whether timeout has occurred	Input:		$fp	file pointer\*======================================================================*/	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	Purpose:	make a socket connection	Input:		$fp	file pointer\*======================================================================*/	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					))		{			// socket connection succeeded			return true;		}		else		{			// socket connection failed			$this->status = $errno;			switch($errno)			{				case -3:					$this->error="socket creation failed (-3)";				case -4:					$this->error="dns lookup failure (-4)";				case -5:					$this->error="connection refused or timed out (-5)";				default:					$this->error="connection failed (".$errno.")";			}			return false;		}	}/*======================================================================*\	Function:	_disconnect	Purpose:	disconnect a socket connection	Input:		$fp	file pointer\*======================================================================*/	function _disconnect($fp)	{		return(fclose($fp));	}/*======================================================================*\	Function:	_prepare_post_body	Purpose:	Prepare post body according to encoding type	Input:		$formvars  - form variables				$formfiles - form upload files	Output:		post body\*======================================================================*/	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 = "Snoopy".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;	}}endif;?>
 |