SILENT KILLERPanel

Current Path: > home > ivftiowh > > public_html > wp-includes


Operation   : Linux premium88.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
Software     : Apache
Server IP    : 185.61.154.216 | Your IP: 216.73.216.44
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: /home/ivftiowh//public_html/wp-includes

NameTypeSizeLast ModifiedActions
ID3 Directory - -
IXR Directory - -
PHPMailer Directory - -
Requests Directory - -
SimplePie Directory - -
Text Directory - -
assets Directory - -
block-patterns Directory - -
block-supports Directory - -
blocks Directory - -
certificates Directory - -
css Directory - -
customize Directory - -
fonts Directory - -
html-api Directory - -
images Directory - -
js Directory - -
php-compat Directory - -
pomo Directory - -
rest-api Directory - -
sitemaps Directory - -
sodium_compat Directory - -
style-engine Directory - -
theme-compat Directory - -
widgets Directory - -
.htaccess File 160 bytes June 28 2024 08:27:59.
admin-bar.php File 35131 bytes September 13 2023 04:25:41.
atomlib.php File 11950 bytes September 13 2023 04:25:41.
author-template.php File 18951 bytes September 13 2023 04:25:41.
block-editor.php File 27598 bytes September 13 2023 04:25:41.
block-i18n.json File 316 bytes September 13 2023 04:25:41.
block-patterns.php File 15901 bytes September 13 2023 04:25:41.
block-template-utils.php File 49130 bytes September 13 2023 04:25:41.
block-template.php File 10592 bytes September 13 2023 04:25:42.
blocks.php File 59159 bytes June 24 2024 20:05:07.
bookmark-template.php File 12909 bytes September 13 2023 04:25:41.
bookmark.php File 15378 bytes September 13 2023 04:25:41.
cache-compat.php File 5969 bytes September 13 2023 04:25:42.
cache.php File 13474 bytes September 13 2023 04:25:42.
canonical.php File 33339 bytes September 13 2023 04:25:41.
capabilities.php File 40026 bytes September 13 2023 04:25:41.
category-template.php File 57009 bytes September 13 2023 04:25:41.
category.php File 12702 bytes September 13 2023 04:25:41.
class-IXR.php File 2543 bytes August 05 2020 08:21:22.
class-feed.php File 529 bytes August 05 2020 08:21:23.
class-http.php File 367 bytes September 13 2023 04:25:42.
class-json.php File 43684 bytes September 13 2023 04:25:42.
class-oembed.php File 401 bytes September 13 2023 04:25:41.
class-phpass.php File 6708 bytes September 13 2023 04:25:41.
class-phpmailer.php File 664 bytes September 13 2023 04:25:41.
class-pop3.php File 20969 bytes September 13 2023 04:25:41.
class-requests.php File 2237 bytes September 13 2023 04:25:41.
class-simplepie.php File 98124 bytes September 13 2023 04:25:41.
class-smtp.php File 457 bytes September 13 2023 04:25:41.
class-snoopy.php File 37715 bytes September 13 2023 04:25:42.
class-walker-category-dropdown.php File 2473 bytes September 13 2023 04:25:41.
class-walker-category.php File 8478 bytes September 13 2023 04:25:41.
class-walker-comment.php File 14214 bytes September 13 2023 04:25:41.
class-walker-nav-menu.php File 11313 bytes September 13 2023 04:25:42.
class-walker-page-dropdown.php File 2710 bytes September 13 2023 04:25:41.
class-walker-page.php File 7623 bytes September 13 2023 04:25:41.
class-wp-admin-bar-plain.php File 1000 bytes September 13 2023 04:25:41.
class-wp-admin-bar.php File 17364 bytes September 13 2023 04:25:41.
class-wp-ajax-response.php File 5266 bytes September 13 2023 04:25:41.
class-wp-application-passwords.php File 12854 bytes September 13 2023 04:25:41.
class-wp-block-editor-context.php File 1350 bytes September 13 2023 04:25:42.
class-wp-block-list.php File 4749 bytes September 13 2023 04:25:42.
class-wp-block-live.php File 1000 bytes September 13 2023 04:25:41.
class-wp-block-parser-block.php File 2555 bytes September 13 2023 04:25:42.
class-wp-block-parser-frame.php File 1916 bytes September 13 2023 04:25:41.
class-wp-block-parser.php File 11761 bytes September 13 2023 04:25:41.
class-wp-block-pattern-categories-registry.php File 5371 bytes September 13 2023 04:25:42.
class-wp-block-patterns-registry.php File 8775 bytes October 13 2023 06:16:03.
class-wp-block-styles-registry.php File 5883 bytes September 13 2023 04:25:41.
class-wp-block-supports.php File 5521 bytes September 13 2023 04:25:42.
class-wp-block-template.php File 1951 bytes September 13 2023 04:25:41.
class-wp-block-type-registry.php File 5013 bytes October 13 2023 06:16:03.
class-wp-block-type.php File 14301 bytes September 13 2023 04:25:41.
class-wp-block.php File 8402 bytes September 13 2023 04:25:42.
class-wp-classic-to-block-menu-converter.php File 4088 bytes September 13 2023 04:25:42.
class-wp-comment-query.php File 47829 bytes September 13 2023 04:25:41.
class-wp-comment.php File 9357 bytes September 13 2023 04:25:41.
class-wp-customize-control.php File 25843 bytes September 13 2023 04:25:41.
class-wp-customize-manager.php File 202163 bytes September 13 2023 04:25:41.
class-wp-customize-nav-menus.php File 57304 bytes September 13 2023 04:25:41.
class-wp-customize-panel.php File 10671 bytes September 13 2023 04:25:41.
class-wp-customize-section.php File 11245 bytes September 13 2023 04:25:42.
class-wp-customize-setting.php File 29890 bytes September 13 2023 04:25:41.
class-wp-customize-widgets.php File 71633 bytes September 13 2023 04:25:41.
class-wp-date-query.php File 35719 bytes September 13 2023 04:25:42.
class-wp-dependencies.php File 14063 bytes September 13 2023 04:25:42.
class-wp-dependency.php File 2627 bytes September 13 2023 04:25:42.
class-wp-duotone.php File 39362 bytes September 13 2023 04:25:41.
class-wp-editor.php File 72084 bytes September 13 2023 04:25:42.
class-wp-embed.php File 15994 bytes September 13 2023 04:25:42.
class-wp-error.php File 7502 bytes September 13 2023 04:25:41.
class-wp-fatal-error-handler.php File 7872 bytes September 13 2023 04:25:41.
class-wp-feed-cache-transient.php File 2586 bytes September 13 2023 04:25:41.
class-wp-feed-cache.php File 996 bytes September 13 2023 04:25:41.
class-wp-hook.php File 15628 bytes September 13 2023 04:25:41.
class-wp-http-cookie.php File 7389 bytes September 13 2023 04:25:41.
class-wp-http-curl.php File 12492 bytes September 13 2023 04:25:41.
class-wp-http-encoding.php File 6689 bytes September 13 2023 04:25:41.
class-wp-http-ixr-client.php File 3501 bytes September 13 2023 04:25:41.
class-wp-http-proxy.php File 5980 bytes September 13 2023 04:25:42.
class-wp-http-requests-hooks.php File 2022 bytes September 13 2023 04:25:41.
class-wp-http-requests-response.php File 4400 bytes September 13 2023 04:25:41.
class-wp-http-response.php File 2977 bytes September 13 2023 04:25:41.
class-wp-http-streams.php File 16810 bytes September 13 2023 04:25:42.
class-wp-http.php File 40350 bytes September 13 2023 04:25:41.
class-wp-image-editor-gd.php File 16623 bytes September 13 2023 04:25:41.
class-wp-image-editor-imagick.php File 29990 bytes September 13 2023 04:25:41.
class-wp-image-editor.php File 17133 bytes September 13 2023 04:25:42.
class-wp-list-util.php File 7443 bytes September 13 2023 04:25:41.
class-wp-locale-switcher.php File 6561 bytes September 13 2023 04:25:41.
class-wp-locale.php File 16115 bytes September 13 2023 04:25:41.
class-wp-matchesmapregex.php File 1826 bytes September 13 2023 04:25:41.
class-wp-meta-query.php File 30533 bytes September 13 2023 04:25:41.
class-wp-metadata-lazyloader.php File 6833 bytes September 13 2023 04:25:41.
class-wp-navigation-fallback.php File 6980 bytes September 13 2023 04:25:41.
class-wp-network-query.php File 19291 bytes September 13 2023 04:25:41.
class-wp-network.php File 12189 bytes September 13 2023 04:25:41.
class-wp-object-cache.php File 17594 bytes September 13 2023 04:25:42.
class-wp-oembed-controller.php File 6879 bytes September 13 2023 04:25:42.
class-wp-oembed.php File 31394 bytes September 13 2023 04:25:42.
class-wp-paused-extensions-storage.php File 5062 bytes September 13 2023 04:25:41.
class-wp-post-type.php File 25964 bytes September 13 2023 04:25:42.
class-wp-post.php File 6484 bytes September 13 2023 04:25:41.
class-wp-query.php File 150699 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-cookie-service.php File 6877 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-email-service.php File 11183 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-key-service.php File 4501 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-link-service.php File 3463 bytes September 13 2023 04:25:41.
class-wp-recovery-mode.php File 11435 bytes September 13 2023 04:25:41.
class-wp-rewrite.php File 63038 bytes September 13 2023 04:25:41.
class-wp-role.php File 2524 bytes September 13 2023 04:25:42.
class-wp-roles.php File 8578 bytes September 13 2023 04:25:41.
class-wp-scripts.php File 28351 bytes September 13 2023 04:25:41.
class-wp-session-tokens.php File 7451 bytes September 13 2023 04:25:41.
class-wp-simplepie-file.php File 3403 bytes September 13 2023 04:25:42.
class-wp-simplepie-sanitize-kses.php File 1800 bytes September 13 2023 04:25:41.
class-wp-site-query.php File 31020 bytes September 13 2023 04:25:42.
class-wp-site.php File 7454 bytes September 13 2023 04:25:41.
class-wp-styles.php File 10898 bytes September 13 2023 04:25:41.
class-wp-tax-query.php File 19545 bytes September 13 2023 04:25:42.
class-wp-taxonomy.php File 18567 bytes September 13 2023 04:25:41.
class-wp-term-query.php File 40451 bytes September 13 2023 04:25:42.
class-wp-term.php File 5298 bytes September 13 2023 04:25:41.
class-wp-text-diff-renderer-inline.php File 830 bytes September 13 2023 04:25:41.
class-wp-text-diff-renderer-table.php File 17187 bytes September 13 2023 04:25:41.
class-wp-textdomain-registry.php File 5976 bytes September 13 2023 04:25:41.
class-wp-theme-json-data.php File 1554 bytes September 13 2023 04:25:41.
class-wp-theme-json-resolver.php File 24669 bytes September 13 2023 04:25:41.
class-wp-theme-json-schema.php File 4301 bytes September 13 2023 04:25:41.
class-wp-theme-json.php File 129295 bytes October 13 2023 06:16:03.
class-wp-theme.php File 56188 bytes October 13 2023 06:16:03.
class-wp-user-meta-session-tokens.php File 2990 bytes August 05 2020 08:21:22.
class-wp-user-query.php File 42242 bytes September 13 2023 04:25:41.
class-wp-user-request.php File 2222 bytes September 13 2023 04:25:41.
class-wp-user.php File 22762 bytes September 13 2023 04:25:41.
class-wp-walker.php File 13167 bytes September 13 2023 04:25:41.
class-wp-widget-factory.php File 3347 bytes September 13 2023 04:25:42.
class-wp-widget.php File 18383 bytes September 13 2023 04:25:42.
class-wp-xmlrpc-server.php File 214130 bytes September 13 2023 04:25:41.
class-wp.php File 25978 bytes September 13 2023 04:25:41.
class-wpdb.php File 120418 bytes September 13 2023 04:25:41.
class.wp-dependencies.php File 373 bytes September 13 2023 04:25:42.
class.wp-scripts.php File 343 bytes September 13 2023 04:25:42.
class.wp-styles.php File 338 bytes September 13 2023 04:25:42.
comment-template.php File 101319 bytes September 13 2023 04:25:41.
comment.php File 128537 bytes September 13 2023 04:25:41.
compat.php File 15219 bytes September 13 2023 04:25:41.
cron.php File 41540 bytes September 13 2023 04:25:41.
date-long.php File 1000 bytes September 13 2023 04:25:41.
date.php File 400 bytes September 13 2023 04:25:41.
default-constants.php File 10981 bytes September 13 2023 04:25:41.
default-filters.php File 33016 bytes October 13 2023 06:16:03.
default-widgets.php File 2222 bytes September 13 2023 04:25:42.
deprecated.php File 159498 bytes September 13 2023 04:25:41.
embed-template.php File 338 bytes September 13 2023 04:25:41.
embed.php File 37470 bytes September 13 2023 04:25:42.
error-protection.php File 4121 bytes September 13 2023 04:25:42.
feed-atom-comments.php File 5448 bytes September 13 2023 04:25:42.
feed-atom.php File 3048 bytes September 13 2023 04:25:41.
feed-rdf.php File 2668 bytes August 05 2020 08:21:22.
feed-rss.php File 1189 bytes August 05 2020 08:21:23.
feed-rss2-comments.php File 4080 bytes September 13 2023 04:25:42.
feed-rss2.php File 3799 bytes August 05 2020 08:21:22.
feed.php File 23057 bytes September 13 2023 04:25:42.
formatting.php File 334312 bytes June 24 2024 20:05:07.
functions.php File 265650 bytes June 24 2024 20:05:07.
functions.wp-scripts.php File 14758 bytes September 13 2023 04:25:42.
functions.wp-styles.php File 8583 bytes September 13 2023 04:25:42.
general-template.php File 167726 bytes September 13 2023 04:25:42.
global-styles-and-settings.php File 18842 bytes September 13 2023 04:25:41.
http.php File 23848 bytes September 13 2023 04:25:42.
https-detection.php File 6505 bytes September 13 2023 04:25:41.
https-migration.php File 4741 bytes September 13 2023 04:25:42.
kses.php File 71670 bytes September 13 2023 04:25:41.
l10n.php File 62783 bytes September 13 2023 04:25:42.
link-template.php File 154510 bytes September 13 2023 04:25:41.
load.php File 53954 bytes September 13 2023 04:25:42.
locale.php File 162 bytes August 05 2020 08:21:22.
media-template.php File 61601 bytes September 13 2023 04:25:42.
media.php File 205173 bytes October 13 2023 06:16:03.
meta.php File 63276 bytes September 13 2023 04:25:42.
ms-blogs.php File 25628 bytes September 13 2023 04:25:42.
ms-default-constants.php File 4900 bytes September 13 2023 04:25:42.
ms-default-filters.php File 6636 bytes September 13 2023 04:25:41.
ms-deprecated.php File 21758 bytes September 13 2023 04:25:41.
ms-files.php File 2652 bytes September 13 2023 04:25:41.
ms-functions.php File 91258 bytes September 13 2023 04:25:42.
ms-load.php File 19870 bytes September 13 2023 04:25:41.
ms-network.php File 3782 bytes September 13 2023 04:25:41.
ms-settings.php File 4124 bytes September 13 2023 04:25:42.
ms-site.php File 40476 bytes September 13 2023 04:25:41.
nav-menu-template.php File 25785 bytes September 13 2023 04:25:42.
nav-menu.php File 44078 bytes September 13 2023 04:25:41.
navigation-fallback.php File 2298 bytes September 13 2023 04:25:41.
option.php File 80051 bytes September 13 2023 04:25:42.
pluggable-deprecated.php File 6263 bytes August 05 2020 08:21:22.
pluggable.php File 111475 bytes September 13 2023 04:25:41.
plugin.php File 35465 bytes September 13 2023 04:25:41.
post-formats.php File 7100 bytes September 13 2023 04:25:41.
post-template.php File 66904 bytes September 13 2023 04:25:41.
post-thumbnail-template.php File 10308 bytes September 13 2023 04:25:42.
post.php File 274389 bytes October 13 2023 06:16:03.
query.php File 37032 bytes September 13 2023 04:25:41.
registration-functions.php File 200 bytes September 13 2023 04:25:41.
registration.php File 200 bytes September 13 2023 04:25:41.
rest-api.php File 97068 bytes October 13 2023 06:16:03.
revision.php File 25433 bytes September 13 2023 04:25:41.
rewrite.php File 19514 bytes September 13 2023 04:25:41.
robots-template.php File 5185 bytes September 13 2023 04:25:41.
rss-functions.php File 255 bytes September 13 2023 04:25:41.
rss.php File 23015 bytes September 13 2023 04:25:41.
script-loader.php File 137080 bytes September 13 2023 04:25:41.
session.php File 258 bytes August 05 2020 08:21:23.
shortcodes.php File 23854 bytes October 13 2023 06:16:03.
sitemaps.php File 3238 bytes September 13 2023 04:25:42.
spl-autoload-compat.php File 441 bytes September 13 2023 04:25:41.
style-engine.php File 7198 bytes September 13 2023 04:25:42.
taxonomy.php File 172884 bytes September 13 2023 04:25:41.
template-canvas.php File 592 bytes September 13 2023 04:25:42.
template-loader.php File 3012 bytes September 13 2023 04:25:41.
template.php File 23327 bytes September 13 2023 04:25:41.
theme-i18n.json File 1151 bytes September 13 2023 04:25:41.
theme-previews.php File 2826 bytes October 13 2023 06:16:03.
theme-templates.php File 5522 bytes September 13 2023 04:25:42.
theme.json File 7203 bytes September 13 2023 04:25:42.
theme.php File 130874 bytes September 13 2023 04:25:42.
update.php File 36755 bytes September 13 2023 04:25:41.
user.php File 170915 bytes September 13 2023 04:25:41.
vars.php File 5838 bytes September 13 2023 04:25:42.
version.php File 928 bytes June 24 2024 20:05:07.
widgets.php File 69875 bytes September 13 2023 04:25:42.
wp-db.php File 445 bytes September 13 2023 04:25:41.
wp-diff.php File 647 bytes August 05 2020 08:21:23.

Reading File: /home/ivftiowh//public_html/wp-includes/class-snoopy.php

<?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 client
Author: Monte Ohrt <monte@ispi.net>
Copyright (c): 1999-2008 New Digital Group, all rights reserved
Version: 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  USA

You may contact the author of Snoopy by e-mail at:
monte@ohrt.com

The 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();

						foreach ( $frameurls as $frameurl )
						{
							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();

					foreach ( $frameurls as $frameurl )
					{
						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();

						foreach ( $frameurls as $frameurl )
						{
							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();

					foreach ( $frameurls as $frameurl )
					{
						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

		foreach ( $links[2] as $key => $val )
		{
			if(!empty($val))
				$match[] = $val;
		}

		foreach ( $links[3] as $key => $val )
		{
			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);'",
						"'&szlig;'i",
						);
		$replace = array(	"",
							"",
							"\\1",
							"\"",
							"&",
							"<",
							">",
							" ",
							chr(161),
							chr(162),
							chr(163),
							chr(169),
							chr(174),
							chr(176),
							chr(39),
							chr(128),
							chr(0xE4), // ANSI &auml;
							chr(0xF6), // ANSI &ouml;
							chr(0xFC), // ANSI &uuml;
							chr(0xC4), // ANSI &Auml;
							chr(0xD6), // ANSI &Ouml;
							chr(0xDC), // ANSI &Uuml;
							chr(0xDF), // ANSI &szlig;
						);

		$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;
			foreach ( $this->rawheaders as $headerKey => $headerVal )
				$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;
			foreach ( $this->rawheaders as $headerKey => $headerVal )
				$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);
				foreach ( $formvars as $key => $val ) {
					if (is_array($val) || is_object($val)) {
						foreach ( $val as $cur_key => $cur_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);
				foreach ( $formvars as $key => $val ) {
					if (is_array($val) || is_object($val)) {
						foreach ( $val as $cur_key => $cur_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);
				foreach ( $formfiles as $field_name => $file_names ) {
					settype($file_names, "array");
					foreach ( $file_names as $file_name ) {
						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;
?>

SILENT KILLER Tool