[pLog-svn] r3699 - in plog/trunk/class: net/http test/tests/mail/phpmailer

oscar at devel.lifetype.net oscar at devel.lifetype.net
Thu Jul 6 12:10:27 GMT 2006


Author: oscar
Date: 2006-07-06 12:10:26 +0000 (Thu, 06 Jul 2006)
New Revision: 3699

Modified:
   plog/trunk/class/net/http/httpclient.class.php
   plog/trunk/class/test/tests/mail/phpmailer/message.txt
Log:
updated to the latest version of Snoopy and added some basic tests for it


Modified: plog/trunk/class/net/http/httpclient.class.php
===================================================================
--- plog/trunk/class/net/http/httpclient.class.php	2006-07-06 11:54:41 UTC (rev 3698)
+++ plog/trunk/class/net/http/httpclient.class.php	2006-07-06 12:10:26 UTC (rev 3699)
@@ -2,16 +2,12 @@
 
 /**
  *
- *\ingroup Net_HTTP
- *
- * The HttpClient is based on the Snoopy class for making HTTP requests. It is very basic in the
- * sense that it does not have support for proxies or anything like that, but it works just fine.
- * 
+ * \ingroup Net_HTTP
  * Snoopy - the PHP net client
  * Author: Monte Ohrt <monte at ispi.net>
  * Copyright (c): 1999-2000 ispi, all rights reserved
- * Version: 1.0
- * 
+ * Version: 1.01
+ *
  * 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
@@ -25,127 +21,206 @@
  * 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  USA
+ *
+ * You may contact the author of Snoopy by e-mail at:
+ * monte at ispi.net
+ *
+ * Or, write to:
+ * Monte Ohrt
+ * CTO, ispi
+ * 237 S. 70th suite 220
+ * Lincoln, NE 68510 
+ * 
+ * The latest version of Snoopy can be obtained from:
+ * http://snoopy.sourceforge.net/
  */
+
 class HttpClient
 {
-	/**** Public variables ****/
-	
-	/* user definable vars */
+		/**** Public variables ****/
 
-	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 $agent			=	"Snoopy v1.0";		// 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";
+		/* user definable vars */
 
-	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()
-												// or submitlinks()
-	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	$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 HttpClient()
-	{
-		// does nothing :)
-	}
+		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
 
-/*======================================================================*\
-	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
-\*======================================================================*/
+		var $agent			=	"Snoopy v1.2.3";	// 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";
 
-	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"];
-				
-		switch($URI_PARTS["scheme"])
+		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)
 		{
-			case "http":
-				$this->host = $URI_PARTS["host"];
-				if(!empty($URI_PARTS["port"]))
-					$this->port = $URI_PARTS["port"];
-				if($this->_connect($fp))
-				{
+
+			//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->_httprequest($URI,$fp,$URI,$this->_httpmethod);
+						$this->_httpsrequest($URI,$URI,$this->_httpmethod);
 					}
 					else
 					{
-						$path = $URI_PARTS["path"].(( array_key_exists( "query", $URI_PARTS ) && $URI_PARTS["query"] ) ? "?".$URI_PARTS["query"] : "");
+						$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
 						// no proxy, send only the path
-						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
+						$this->_httpsrequest($path, $URI, $this->_httpmethod);
 					}
-					
-					$this->_disconnect($fp);
 
 					if($this->_redirectaddr)
 					{
@@ -167,7 +242,7 @@
 					{
 						$frameurls = $this->_frameurls;
 						$this->_frameurls = array();
-						
+
 						while(list(,$frameurl) = each($frameurls))
 						{
 							if($this->_framedepth < $this->maxframes)
@@ -179,124 +254,132 @@
 								break;
 						}
 					}					
-				}
-				else
-				{
+					return true;					
+					break;
+				default:
+					// not a valid protocol
+					$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
 					return false;
-				}
-				return true;					
-				break;
-			case "https":
-				if(!$this->curl_path || (!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);
-				}
+					break;
+			}		
+			return true;
+		}
 
-				if($this->_redirectaddr)
-				{
-					/* url was redirected, check if we've hit the max depth */
-					if($this->maxredirs > $this->_redirectdepth)
+	/*======================================================================*\
+		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))
 					{
-						// 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)
+						if($this->_isproxy)
 						{
-							/* follow the redirect */
-							$this->_redirectdepth++;
-							$this->lastredirectaddr=$this->_redirectaddr;
-							$this->fetch($this->_redirectaddr);
+							// 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);
+						}
 
-				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
-				{
-					$frameurls = $this->_frameurls;
-					$this->_frameurls = array();
+						$this->_disconnect($fp);
 
-					while(list(,$frameurl) = each($frameurls))
-					{
-						if($this->_framedepth < $this->maxframes)
+						if($this->_redirectaddr)
 						{
-							$this->fetch($frameurl);
-							$this->_framedepth++;
+							/* 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);
+								}
+							}
 						}
-						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";
-	Output:		$this->results	the text output from the post
-\*======================================================================*/
+						if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
+						{
+							$frameurls = $this->_frameurls;
+							$this->_frameurls = array();
 
-	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( !isset( $URI_PARTS["scheme"] ))
-			$URI_PARTS["scheme"] = "";
-			
-		if( !isset( $URI_PARTS["query"] ))
-			$URI_PARTS["query"] = "";
-			
-				
-		switch($URI_PARTS["scheme"])
-		{
-			case "http":
-				$this->host = $URI_PARTS["host"];
-				if(!empty($URI_PARTS["port"]))
-					$this->port = $URI_PARTS["port"];
-				if($this->_connect($fp))
-				{
+							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->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
+						$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->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);
+						$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);
 					}
-					
-					$this->_disconnect($fp);
 
 					if($this->_redirectaddr)
 					{
@@ -305,14 +388,17 @@
 						{						
 							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;
-								$this->submit($this->_redirectaddr,$formvars, $formfiles);
+								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);
 							}
 						}
 					}
@@ -321,7 +407,7 @@
 					{
 						$frameurls = $this->_frameurls;
 						$this->_frameurls = array();
-						
+
 						while(list(,$frameurl) = each($frameurls))
 						{														
 							if($this->_framedepth < $this->maxframes)
@@ -333,851 +419,839 @@
 								break;
 						}
 					}					
-					
-				}
-				else
-				{
+					return true;					
+					break;
+
+				default:
+					// not a valid protocol
+					$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
 					return false;
-				}
-				return true;					
-				break;
-			case "https":
-				if(!$this->curl_path || (!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)
+					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))
 				{
-					// using proxy, send entire URI
-					$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);
+					for($x=0;$x<count($this->results);$x++)
+						$this->results[$x] = $this->_striplinks($this->results[$x]);
 				}
 				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);
-				}
+					$this->results = $this->_striplinks($this->results);
 
-				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"]);						
+				if($this->expandlinks)
+					$this->results = $this->_expandlinks($this->results, $URI);
+				return true;
+			}
+			else
+				return false;
+		}
 
-						// 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->submit($this->_redirectaddr,$formvars, $formfiles);
-						}
-					}
-				}
+	/*======================================================================*\
+		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
+	\*======================================================================*/
 
-				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
-				{
-					$frameurls = $this->_frameurls;
-					$this->_frameurls = array();
+		function fetchform($URI)
+		{
 
-					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;
-	}
+			if ($this->fetch($URI))
+			{			
 
-/*======================================================================*\
-	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
-\*======================================================================*/
+				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);
 
-	function fetchlinks($URI)
-	{
-		if ($this->fetch($URI))
-		{			
-
-			if(is_array($this->results))
-			{
-				for($x=0;$x<count($this->results);$x++)
-					$this->results[$x] = $this->_striplinks($this->results[$x]);
+				return true;
 			}
 			else
-				$this->results = $this->_striplinks($this->results);
-
-			if($this->expandlinks)
-				$this->results = $this->_expandlinks($this->results, $URI);
-			return true;
+				return false;
 		}
-		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))
-		{			
+	/*======================================================================*\
+		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
+	\*======================================================================*/
 
-			if(is_array($this->results))
-			{
-				for($x=0;$x<count($this->results);$x++)
-					$this->results[$x] = $this->_stripform($this->results[$x]);
+		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->results = $this->_stripform($this->results);
-			
-			return true;
+				return false;
 		}
-		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
-	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(is_array($this->results))
-			{
-				for($x=0;$x<count($this->results);$x++)
+		function submitlinks($URI, $formvars="", $formfiles="")
+		{
+			if($this->submit($URI,$formvars, $formfiles))
+			{			
+				if($this->lastredirectaddr)
+					$URI = $this->lastredirectaddr;
+				if(is_array($this->results))
 				{
-					$this->results[$x] = $this->_striplinks($this->results[$x]);
+					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[$x] = $this->_expandlinks($this->results[$x],$URI);
+						$this->results = $this->_expandlinks($this->results,$URI);
 				}
+				return true;
 			}
 			else
-			{
-				$this->results = $this->_striplinks($this->results);
-				if($this->expandlinks)
-					$this->results = $this->_expandlinks($this->results,$URI);
-			}
-			return true;
+				return false;
 		}
-		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
+		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(is_array($this->results))
-			{
-				for($x=0;$x<count($this->results);$x++)
+		function submittext($URI, $formvars = "", $formfiles = "")
+		{
+			if($this->submit($URI,$formvars, $formfiles))
+			{			
+				if($this->lastredirectaddr)
+					$URI = $this->lastredirectaddr;
+				if(is_array($this->results))
 				{
-					$this->results[$x] = $this->_striptext($this->results[$x]);
+					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[$x] = $this->_expandlinks($this->results[$x],$URI);
+						$this->results = $this->_expandlinks($this->results,$URI);
 				}
+				return true;
 			}
 			else
-			{
-				$this->results = $this->_striptext($this->results);
-				if($this->expandlinks)
-					$this->results = $this->_expandlinks($this->results,$URI);
-			}
-			return true;
+				return false;
 		}
-		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";
-	}
+	/*======================================================================*\
+		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";
+		}
 
-	
-	
 
-/*======================================================================*\
-	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:	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";
+		}
 
-	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
-\*======================================================================*/
+	/*======================================================================*\
+		Private functions
+	\*======================================================================*/
 
-	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:	_striplinks
+		Purpose:	strip the hyperlinks from an html document
+		Input:		$document	document to strip.
+		Output:		$match		an array of the links
+	\*======================================================================*/
 
-	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
-						"'&(quote|#34);'i",					// replace html entities
-						"'&(amp|#38);'i",
-						"'&(lt|#60);'i",
-						"'&(gt|#62);'i",
-						"'&(nbsp|#160);'i",
-						"'&(iexcl|#161);'i",
-						"'&(cent|#162);'i",
-						"'&(pound|#163);'i",
-						"'&(copy|#169);'i"
-						);				
-		$replace = array(	"",
-							"",
-							"\\1",
-							"\"",
-							"&",
-							"<",
-							">",
-							" ",
-							chr(161),
-							chr(162),
-							chr(163),
-							chr(169));
-					
-		$text = preg_replace($search,$replace,$document);
-								
-		return $text;
-	}
+		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);
 
-/*======================================================================*\
-	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);
+			// catenate the non-empty matches from the conditional subpattern
 
-		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
-				
-		$search = array( 	"|^http://".preg_quote($this->host)."|i",
-							"|^(?!http://)(\/)?(?!mailto:)|i",
-							"|/\./|",
-							"|/[^\/]+/\.\./|"
-						);
-						
-		$replace = array(	"",
-							$match."/",
-							"/",
-							"/"
-						);			
-				
-		$expandedLinks = preg_replace($search,$replace,$links);
+			while(list($key,$val) = each($links[2]))
+			{
+				if(!empty($val))
+					$match[] = $val;
+			}				
 
-		return $expandedLinks;
-	}
+			while(list($key,$val) = each($links[3]))
+			{
+				if(!empty($val))
+					$match[] = $val;
+			}		
 
-/*======================================================================*\
-	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="")
-	{
-		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."\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";
-			} 
+			// return the links
+			return $match;
 		}
-		if(!empty($this->rawheaders))
+
+	/*======================================================================*\
+		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)
 		{
-			if(!is_array($this->rawheaders))
-				$this->rawheaders = (array)$this->rawheaders;
-			while(list($headerKey,$headerVal) = each($this->rawheaders))
-				$headers .= $headerKey.": ".$headerVal."\r\n";
+
+			// 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);'",
+							"'&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;
 		}
-		if(!empty($content_type)) {
-			$headers .= "Content-type: $content_type";
-			if ($content_type == "multipart/form-data")
-				$headers .= "; boundary=".$this->_mime_boundary;
-			$headers .= "\r\n";
+
+	/*======================================================================*\
+		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;
 		}
-		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";
 
-		$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))
+	/*======================================================================*\
+		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="")
 		{
-			if ($this->read_timeout > 0 && $this->_check_timeout($fp))
+			$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->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))
 			{
-				$this->status=-100;
-				return false;
+				if(!is_array($this->rawheaders))
+					$this->rawheaders = (array)$this->rawheaders;
+				while(list($headerKey,$headerVal) = each($this->rawheaders))
+					$headers .= $headerKey.": ".$headerVal."\r\n";
 			}
-				
-			if($currentHeader == "\r\n")
-				break;
-						
-			// if a header begins with Location: or URI:, set the redirect
-			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
+			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))
 			{
-				// get URL portion of the redirect
-				preg_match("/^(Location:|URI:)\s+(.*)/",chop($currentHeader),$matches);
-				// look for :// in the Location header to see if hostname is included
-				if(!preg_match("|\:\/\/|",$matches[2]))
+				if ($this->read_timeout > 0 && $this->_check_timeout($fp))
 				{
-					// 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];
+					$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];
+						$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;
 			}
-		
-			if(preg_match("|^HTTP/|",$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))
 			{
-                if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status))
-				{
-					$this->status= $status[1];
-                }				
-				$this->response_code = $currentHeader;
+				$this->status=-100;
+				return false;
 			}
-				
-			$this->headers[] = $currentHeader;
-		}
 
-		//$results = fread($fp, $this->maxlength);
-		$results = "";
-		while(!feof($fp)) {
-			$results .= fgets($fp, 128);
-		}
- 
- 
- 
- 
+			// check if there is a a redirect meta tag
 
+			if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
 
-		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
-		{
-			$this->status=-100;
-			return false;
+			{
+				$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;
 		}
-		
-		// check if there is a 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))
+	/*======================================================================*\
+		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="")
 		{
-			$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;
-	}
+			if($this->passcookies && $this->_redirectaddr)
+				$this->setcookies();
 
-/*======================================================================*\
-	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();		
 
-		$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))
-			$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)."; ";
+			$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);
 				}
-				$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++)
-			$cmdline_params .= " -H \"".$headers[$curr_header]."\"";
-		
-		if(!empty($body))
-			$cmdline_params .= " -d \"$body\"";
-		
-		if($this->read_timeout > 0)
-			$cmdline_params .= " -m ".$this->read_timeout;
-		
-		$headerfile = uniqid(time());
+			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);
 
-		exec($this->curl_path." -D \"/tmp/$headerfile\"".$cmdline_params." ".$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("/tmp/$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]))
+			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, "\"", " " ); // strip quotes from the URI to avoid shell access
+			exec($this->curl_path." -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\"",$results,$return);
+
+			if($return)
 			{
-				// get URL portion of the redirect
-				preg_match("/^(Location: |URI:)(.*)/",chop($result_headers[$currentHeader]),$matches);
-				// look for :// in the Location header to see if hostname is included
-				if(!preg_match("|\:\/\/|",$matches[2]))
+				$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]))
 				{
-					// 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];
+					// 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];
+						$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("|^HTTP/|",$result_headers[$currentHeader]))
-				$this->response_code = $result_headers[$currentHeader];
 
-			$this->headers[] = $result_headers[$currentHeader];
+			// check if there is a 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;
 		}
 
-		// check if there is a a redirect meta tag
-		
-		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+	/*======================================================================*\
+		Function:	setcookies()
+		Purpose:	set cookies for a redirection
+	\*======================================================================*/
+
+		function setcookies()
 		{
-			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
+			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]);
+			}
 		}
 
-		// 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))
+
+	/*======================================================================*\
+		Function:	_check_timeout
+		Purpose:	checks whether timeout has occurred
+		Input:		$fp	file pointer
+	\*======================================================================*/
+
+		function _check_timeout($fp)
 		{
-			$this->results[] = $results;
-			for($x=0; $x<count($match[1]); $x++)
-				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
+			if ($this->read_timeout > 0) {
+				$fp_status = socket_get_status($fp);
+				if ($fp_status["timed_out"]) {
+					$this->timed_out = true;
+					return true;
+				}
+			}
+			return false;
 		}
-		// have we already fetched framed content?
-		elseif(is_array($this->results))
-			$this->results[] = $results;
-		// no framed content
-		else
-			$this->results = $results;
 
-		unlink("/tmp/$headerfile");
-		
-		return true;
-	}
+	/*======================================================================*\
+		Function:	_connect
+		Purpose:	make a socket connection
+		Input:		$fp	file pointer
+	\*======================================================================*/
 
-/*======================================================================*\
-	Function:	setcookies()
-	Purpose:	set cookies for a redirection
-\*======================================================================*/
-	
-	function setcookies()
-	{
-		for($x=0; $x<count($this->headers); $x++)
+		function _connect(&$fp)
 		{
-		if(preg_match("/^set-cookie:[\s]+([^=]+)=([^;]+)/i", $this->headers[$x],$match))
-			$this->cookies[$match[1]] = $match[2];
-		}
-	}
+			if(!empty($this->proxy_host) && !empty($this->proxy_port))
+				{
+					$this->_isproxy = true;
 
-	
-/*======================================================================*\
-	Function:	_check_timeout
-	Purpose:	checks whether timeout has occurred
-	Input:		$fp	file pointer
-\*======================================================================*/
+					$host = $this->proxy_host;
+					$port = $this->proxy_port;
+				}
+			else
+			{
+				$host = $this->host;
+				$port = $this->port;
+			}
 
-	function _check_timeout($fp)
-	{
-		if ($this->read_timeout > 0) {
-			$fp_status = socket_get_status($fp);
-			if ($fp_status["timed_out"]) {
-				$this->timed_out = true;
+			$this->status = 0;
+
+			if($fp = fsockopen(
+						$host,
+						$port,
+						$errno,
+						$errstr,
+						$this->_fp_timeout
+						))
+			{
+				// socket connection succeeded
+
 				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))
+			else
 			{
-				$this->_isproxy = true;
-				$host = $this->proxy_host;
-				$port = $this->proxy_port;
+				// 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;
 			}
-		else
-		{
-			$host = $this->host;
-			$port = $this->port;
 		}
-	
-		$this->status = 0;
-		
-		if($fp = fsockopen(
-					$host,
-					$port,
-					$errno,
-					$errstr,
-					$this->_fp_timeout
-					))
-		{
-			// socket connection succeeded
+	/*======================================================================*\
+		Function:	_disconnect
+		Purpose:	disconnect a socket connection
+		Input:		$fp	file pointer
+	\*======================================================================*/
 
-			return true;
-		}
-		else
+		function _disconnect($fp)
 		{
-			// 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;
+			return(fclose($fp));
 		}
-	}
-/*======================================================================*\
-	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");
 
-		if (count($formvars) == 0 && count($formfiles) == 0)
-			return;
-		
-		$postdata = "";
-		
-		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;
+	/*======================================================================*\
+		Function:	_prepare_post_body
+		Purpose:	Prepare post body according to encoding type
+		Input:		$formvars  - form variables
+					$formfiles - form upload files
+		Output:		post body
+	\*======================================================================*/
 
-			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)) {
+		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 .= "$cur_val\r\n";
+							$postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
+							$postdata .= "$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);
+					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;
 
-						$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";
+							$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;
+					$postdata .= "--".$this->_mime_boundary."--\r\n";
+					break;
+			}
+
+			return $postdata;
 		}
-
-		return $postdata;
 	}
-}
 
-?>
+?>
\ No newline at end of file

Modified: plog/trunk/class/test/tests/mail/phpmailer/message.txt
===================================================================
--- plog/trunk/class/test/tests/mail/phpmailer/message.txt	2006-07-06 11:54:41 UTC (rev 3698)
+++ plog/trunk/class/test/tests/mail/phpmailer/message.txt	2006-07-06 12:10:26 UTC (rev 3699)
@@ -1,22 +1,22 @@
-Date: Wed, 5 Jul 2006 17:58:40 +0200
+Date: Thu, 6 Jul 2006 14:43:28 +0200
 Return-Path: unit_test at phpmailer.sf.net
 To: Test User <please_set at please.set>
 From: Unit Tester <unit_test at phpmailer.sf.net>
 Reply-to: Reply Guy <no_reply at phpmailer.sf.net>
 Subject: Unit Test: AltBody + Attachment
-Message-ID: <45f870c912a0edda3764ab01d9db6d0f at caladan.local>
+Message-ID: <0ed405d7936eea8849dc41785cd66db2 at caladan.local>
 X-Priority: 3
 X-Mailer: PHPMailer [version 1.73]
 MIME-Version: 1.0
 Content-Type: multipart/mixed;
-	boundary="b1_45f870c912a0edda3764ab01d9db6d0f"
+	boundary="b1_0ed405d7936eea8849dc41785cd66db2"
 
 
---b1_45f870c912a0edda3764ab01d9db6d0f
+--b1_0ed405d7936eea8849dc41785cd66db2
 Content-Type: multipart/alternative;
-	boundary="b2_45f870c912a0edda3764ab01d9db6d0f"
+	boundary="b2_0ed405d7936eea8849dc41785cd66db2"
 
---b2_45f870c912a0edda3764ab01d9db6d0f
+--b2_0ed405d7936eea8849dc41785cd66db2
 Content-Type: text/plain; charset = "iso-8859-1"
 Content-Transfer-Encoding: 8bit
 
@@ -24,7 +24,7 @@
 This is the text part of the email.
 
 
---b2_45f870c912a0edda3764ab01d9db6d0f
+--b2_0ed405d7936eea8849dc41785cd66db2
 Content-Type: text/html; charset = "iso-8859-1"
 Content-Transfer-Encoding: 8bit
 
@@ -33,8 +33,8 @@
 
 
 
---b2_45f870c912a0edda3764ab01d9db6d0f--
---b1_45f870c912a0edda3764ab01d9db6d0f
+--b2_0ed405d7936eea8849dc41785cd66db2--
+--b1_0ed405d7936eea8849dc41785cd66db2
 Content-Type: application/octet-stream; name="test_attach.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="test_attach.txt"
@@ -355,4 +355,4 @@
 aWwtPlNlbmQoKSwgIlNlbmQgZmFpbGVkIik7DQogICAgfQ0KfSAg
 
 
---b1_45f870c912a0edda3764ab01d9db6d0f--
+--b1_0ed405d7936eea8849dc41785cd66db2--



More information about the pLog-svn mailing list