\n\t
$caption \n\t\n\n";
flush();
sleep($countd);
return true;
}
/*
* Counter for those filehosts that displays mirror after countdown
* @param int The number of seconds to count down
* @param string Text you want to display above the counter
* @param string The text you want to display when counting down
* @param string The text you want to display when count down is complete
*/
function insert_new_timer($countd, $displaytext, $caption = '', $text = '') {
if (!is_numeric($countd)) return html_error(lang(85));
echo ('
');
echo ('');
echo ('
' . lang(86) . '
');
echo ('');
if (!empty($text)) print $text;
require (TEMPLATE_DIR . '/footer.php');
}
/*
* Function to check if geturl function has completed successfully
*/
function is_page($lpage) {
global $lastError;
if (!$lpage) return html_error(lang(84) . "
$lastError");
}
function readCustomHeaders(&$referer) {
$headers = array();
if (!empty($referer)) {
$tmp = array_map('trim', explode("\n", $referer));
$referer = array_shift($tmp);
if (count($tmp) > 0) {
foreach (array_filter($tmp) as $tmp) {
$tmp = array_map('trim', explode(':', $tmp, 2));
// Avoid set an empty method header (key: '')
if ($tmp[0] !== '' || $tmp[1] !== '') {
// Key must be lowercase (for override default header)
$headers[strtolower($tmp[0])] = $tmp[1];
}
}
}
}
return $headers;
}
function headers2request(array $headers, $data = '') {
if (empty($headers) || empty($headers[''])) return html_error('Empty headers array or Non HTTP method');
$request = trim($headers['']) . "\r\n";
unset($headers['']);
foreach ($headers as $header => $value) {
$header = strtolower($header);
if ($header != 'connection' && $value !== '') {
$request .= strtr(ucwords(strtr(trim($header), '-', ' ')), ' ', '-') . ': ' . trim($value) . "\r\n";
}
}
$request .= "Connection: Close\r\n\r\n$data";
return $request;
}
function geturl($host, $port, $url, $referer = 0, $cookie = 0, $post = 0, $saveToFile = 0, $proxy = 0, $pauth = 0, $auth = 0, $scheme = 'http', $resume_from = 0, $XMLRequest = 0) {
global $nn, $lastError, $Resume, $bytesReceived, $fp, $fs, $force_name, $options, $sFilters;
$scheme = strtolower($scheme) . '://';
if (($post !== 0) && ($scheme == 'http://' || $scheme == 'https://')) {
$method = 'POST';
$postdata = is_array($post) ? formpostdata($post) : $post;
} else {
$method = 'GET';
$postdata = '';
}
if (!empty($cookie)) {
if (is_array($cookie)) $cookies = (count($cookie) > 0) ? CookiesToStr($cookie) : 0;
else $cookies = trim($cookie);
}
if ($scheme == 'https://') {
if (!extension_loaded('openssl')) return html_error('You need to install/enable PHP\'s OpenSSL extension to support downloading via HTTPS.');
$scheme = 'ssl://';
if ($port == 0 || $port == 80) $port = 443;
} else if ($port == 0) $port = 80;
if ($proxy) {
list($proxyHost, $proxyPort) = explode(':', $proxy, 2);
if ($scheme != 'ssl://') {
$host = $host . ($port != 80 && $port != 443 ? ":$port" : '');
$url = "$scheme$host$url";
}
}
if ($scheme != 'ssl://') $scheme = '';
$cHeaders = readCustomHeaders($referer);
$request = array();
$request[''] = $method . ' ' . str_replace(' ', '%20', $url) . ' HTTP/1.1';
$request['host'] = $host;
$request['user-agent'] = rl_UserAgent;
$request['accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
if (!$saveToFile) $request['accept-encoding'] = 'gzip, deflate';
$request['accept-language'] = 'en-US,en;q=0.5';
if (!empty($referer)) $request['referer'] = $referer;
if (!empty($cookies)) $request['cookie'] = $cookies;
$request['cache-control'] = $request['pragma'] = 'no-cache';
// if (!empty($Resume['use']) && $Resume['use'] === TRUE) $request['range'] = 'bytes=' . $Resume['from'] . '-';
if (!empty($auth)) $request['authorization'] = "Basic $auth";
if (!empty($pauth) && !$scheme) $request['proxy-authorization'] = "Basic $pauth";
if ($method == 'POST') {
$request['content-type'] = 'application/x-www-form-urlencoded';
$request['content-length'] = strlen($postdata);
}
if ($XMLRequest) $request['x-requested-with'] = 'XMLHttpRequest';
$request = headers2request(array_merge($request, $cHeaders), $postdata);
$errno = 0;
$errstr = '';
if ($scheme == 'ssl://') {
$hosts = (!empty($proxyHost) ? $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
if ($proxy) $url = "https://$host$url"; // For the 'connected to' message
} else $hosts = (!empty($proxyHost) ? $scheme . $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
$fp = @stream_socket_client($hosts, $errno, $errstr, 120, STREAM_CLIENT_CONNECT);
if (!$fp) {
if (!function_exists('stream_socket_client')) return html_error('[ERROR] stream_socket_client() is disabled.');
$dis_host = !empty($proxyHost) ? $proxyHost : $host;
$dis_port = !empty($proxyPort) ? $proxyPort : $port;
return html_error(sprintf(lang(88), $dis_host, $dis_port));
}
if ($errno || $errstr) {
$lastError = $errstr;
return false;
}
stream_set_timeout($fp, 120);
if ($saveToFile) {
if ($proxy) echo '' . sprintf(lang(89), $proxyHost, $proxyPort) . '
GET: ' . htmlspecialchars($url) . "...
\n";
else echo '
'.sprintf(lang(90), $host, $port).'
';
}
if ($scheme == 'ssl://' && $proxy) {
$connRequest = array();
$connRequest[''] = "CONNECT $host:$port HTTP/1.1";
if (!empty($pauth)) $connRequest['proxy-authorization'] = "Basic $pauth";
$connRequest['proxy-connection'] = 'Close';
$connRequest = headers2request($connRequest);
fwrite($fp, $connRequest);
fflush($fp);
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = 'No response from proxy after CONNECT.';
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
$status = intval(substr($header, 9, 3));
if ($status != 200) {
return html_error("Proxy returned $status after CONNECT.");
}
// Start TLS.
if (!stream_socket_enable_crypto($fp, true, (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT') ? STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT : STREAM_CRYPTO_METHOD_TLS_CLIENT))) return html_error('TLS Startup Error.');
}
#########################################################################
fwrite($fp, $request);
fflush($fp);
$timeStart = microtime(true);
// Rewrote the get header function according to the proxy script
// Also made sure it goes faster and I think 8192 is the best value for retrieving headers
// Oops.. The previous function hooked up everything and now I'm returning it back to normal
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = lang(91);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
// Array for active stream filters
$sFilters = array();
if (stripos($header, "\nTransfer-Encoding: chunked") !== false && in_array('dechunk', stream_get_filters())) {
// Add built-in dechunk filter
$sFilters['dechunk'] = stream_filter_append($fp, 'dechunk', STREAM_FILTER_READ);
if (!$sFilters['dechunk'] && $saveToFile) return html_error('Unknown error while initializing dechunk filter, cannot continue download.');
}
#########################################################################
if ($saveToFile) {
if (!isset($_GET['dis_plug']) || $_GET['dis_plug'] != 'on') {
$cbhost = (strpos($host, ':') !== false) ? substr($host, 0, strpos($host, ':')) : $host; // Remove the port that may be added when it's using proxy
$chkhost = preg_match('/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/', $cbhost) ? false : true;
if (!empty($referer)) {
$cbrefhost = (stripos($referer, 'www.') === 0) ? substr($referer, 4) : $referer;
$cbrefhost = parse_url($cbrefhost, PHP_URL_HOST);
$chkref = (empty($cbrefhost) || preg_match('/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/', $cbrefhost)) ? false : (($chkhost && strtolower($cbhost) == strtolower($cbrefhost)) ? false : true);
} else $chkref = false;
$found = false;
if ($chkhost || $chkref) foreach ($GLOBALS['host'] as $site => $file) {
if ($chkhost && host_matches($site, $cbhost)) {
$found = true;
break;
} elseif ($chkref && host_matches($site, $cbrefhost)) {
$found = true;
break;
}
}
if ($found) {
require_once(HOST_DIR . 'DownloadClass.php');
require_once(HOST_DIR . "download/$file");
$class = substr($file, 0, -4);
$firstchar = substr($file, 0, 1);
if ($firstchar > 0) $class = "d$class";
if (class_exists($class) && method_exists($class, 'CheckBack')) { // is_callable(array($class , 'CheckBack'))
$hostClass = new $class(false);
$hostClass->CheckBack($header);
}
}
unset($cbhost, $cbrefhost, $chkhost, $chkref, $found);
}
if (preg_match('/^HTTP\/1\.[0|1] (\d+) .*/', $header, $responsecode) && ($responsecode[1] == 404 || $responsecode[1] == 403)) {
// Do some checking, please, at least tell them what error it was
if ($responsecode [1] == 403) {
$lastError = lang(92);
} elseif ($responsecode [1] == 404) {
$lastError = lang(93);
} else {
// Weird, it shouldn't come here...
$lastError = lang(94);
}
return false;
}
//$bytesTotal = intval ( trim ( cut_str ( $header, "Content-Length:", "\n" ) ) );
$bytesTotal = trim(cut_str($header, "\nContent-Length: ", "\n"));
global $options;
if ($options['file_size_limit'] > 0 && ($bytesTotal > ($options['file_size_limit'] * 1024 * 1024))) {
$lastError = lang(336) . bytesToKbOrMbOrGb ($options['file_size_limit'] * 1024 * 1024) . '.';
return false;
}
if (stripos($header, "\nLocation: ") !== false && preg_match('/\nLocation: ([^\r\n]+)/i', $header, $redir)) {
$redirect = trim($redir[1]);
$lastError = sprintf(lang(95), $redirect);
return FALSE;
}
if (in_array(cut_str($header, "\nWWW-Authenticate: ", ' '), array('Basic', 'Digest'))) {
$lastError = lang(96);
return FALSE;
}
//$ContentType = trim (cut_str($header, "\nContent-Type:", "\n")); // Unused
if (!empty($Resume['use']) && $Resume['use'] === TRUE && stripos($header, "\nContent-Range: ") === false) {
$lastError = (stripos($header, '503 Limit Exceeded') !== false) ? lang(97) : lang(98);
return FALSE;
}
if ($force_name) $FileName = $force_name;
else {
$ContentDisposition = cut_str($header, "\nContent-Disposition: ", "\n");
if (!empty($ContentDisposition) && stripos($ContentDisposition, 'filename') !== false) {
if (preg_match("@filename\*=UTF-8''((?:[\w\-\.]|%[0-F]{2})+)@i", $ContentDisposition, $fn)) $FileName = rawurldecode($fn[1]);
else if (preg_match('@filename=(\")?([^\r\n]+?)(?(1)\"|[;\r\n])@i', $ContentDisposition, $fn)) {
if (preg_match('@&(?:[A-Z]+|#[0-9]+|#X[0-9A-F]+);@i', $fn[2])) $fn[3] = html_entity_decode($fn[2], ENT_QUOTES, 'UTF-8');
$FileName = (empty($fn[3]) ? $fn[2] : $fn[3]);
}
else $FileName = $saveToFile;
} else $FileName = $saveToFile;
}
$FileName = str_replace(array_merge(range(chr(0), chr(31)), str_split("<>:\"/|?*\x5C\x7F")), '', basename(trim($FileName)));
$extPos = strrpos($FileName, '.');
$ext = ($extPos ? substr($FileName, $extPos) : '');
if (is_array($options['forbidden_filetypes']) && in_array(strtolower($ext), array_map('strtolower', $options['forbidden_filetypes']))) {
if ($options['forbidden_filetypes_block']) return html_error(sprintf(lang(82), $ext));
if (empty($options['rename_these_filetypes_to'])) $options['rename_these_filetypes_to'] = '.xxx';
else if (strpos($options['rename_these_filetypes_to'], '.') === false) $options['rename_these_filetypes_to'] = '.' . $options['rename_these_filetypes_to'];
$FileName = substr_replace($FileName, $options['rename_these_filetypes_to'], $extPos);
}
if (!empty($options['rename_prefix'])) $FileName = $options['rename_prefix'] . '_' . $FileName;
if (!empty($options['rename_suffix'])) $FileName = ($extPos > 0 ? substr($FileName, 0, $extPos) : $FileName) . '_' . $options['rename_suffix'] . $ext;
if (!empty($options['rename_underscore'])) $FileName = str_replace(array(' ', '%20'), '_', $FileName);
$saveToFile = dirname($saveToFile) . PATH_SPLITTER . $FileName;
if (!empty($Resume['use']) && $Resume['use'] !== TRUE && @file_exists($saveToFile)) {
if ($options['bw_save']) return html_error(lang(99) . ': ' . link_for_file($saveToFile));
$FileName = time() . '_' . $FileName;
$saveToFile = dirname($saveToFile) . PATH_SPLITTER . $FileName;
}
$fs = @fopen($saveToFile, ((!empty($Resume['use']) && $Resume['use'] === TRUE) ? 'ab' : 'wb'));
if (!$fs) {
$lastError = sprintf(lang(101), $FileName, dirname($saveToFile)) . '
' . lang(102) . '
' . lang(103) . '';
return FALSE;
}
flock($fs, LOCK_EX);
if (!empty($Resume['use']) && $Resume['use'] === TRUE && stripos($header, "\nContent-Range: ") !== false) {
list($temp, $Resume['range']) = explode(' ', trim(cut_str($header, "\nContent-Range: ", "\n")));
list($Resume['range'], $fileSize) = explode('/', $Resume['range']);
$fileSize = bytesToKbOrMbOrGb($fileSize);
} else $fileSize = bytesToKbOrMbOrGb($bytesTotal);
$chunkSize = GetChunkSize($bytesTotal);
echo(lang(104) . " $FileName, " . lang(56) . " $fileSize...
");
//$scriptStarted = false;
require_once(TEMPLATE_DIR . '/transloadui.php');
if (!empty($Resume['use']) && $Resume['use'] === TRUE) {
$received = bytesToKbOrMbOrGb(filesize($saveToFile));
$percent = round($Resume['from'] / ($bytesTotal + $Resume['from']) * 100, 2);
echo "";
//$scriptStarted = true;
flush();
} else $Resume = array('use' => false, 'from' => 0, 'range' => 0);
$time = $last = $lastChunkTime = 0;
do {
$data = @fread($fp, $chunkSize);
$datalen = strlen($data);
if ($datalen <= 0) break;
$bytesSaved = fwrite($fs, $data);
if ($bytesSaved !== false && $datalen == $bytesSaved) {
$bytesReceived += $bytesSaved;
} else {
$lastError = sprintf(lang(105), $FileName);
// unlink($saveToFile);
return false;
}
if ($bytesReceived >= $bytesTotal) $percent = 100;
else $percent = @round(($bytesReceived + $Resume['from']) / ($bytesTotal + $Resume['from']) * 100, 2);
if ($bytesReceived > $last + $chunkSize && (!$lastChunkTime || !(((microtime(true) - $timeStart) - $lastChunkTime) < 1))) {
$received = bytesToKbOrMbOrGb($bytesReceived + $Resume['from']);
$time = microtime(true) - $timeStart;
$chunkTime = $time - $lastChunkTime;
$chunkTime = ($chunkTime > 0) ? $chunkTime : 1;
$lastChunkTime = $time;
$speed = @round((($bytesReceived - $last) / 1024) / $chunkTime, 2);
echo "";
flush();
$last = $bytesReceived;
}
if (!empty($bytesTotal) && ($bytesReceived + $chunkSize) > $bytesTotal) $chunkSize = max($bytesTotal - $bytesReceived, 4096);
} while (!feof($fp));
flock($fs, LOCK_UN);
fclose($fs);
if ($bytesReceived <= 0) {
$lastError = lang(106);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return FALSE;
}
} else {
$length = trim(cut_str($header, "\nContent-Length: ", "\n"));
if (!$length || !is_numeric($length)) $length = -1;
$page = stream_get_contents($fp, $length);
}
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
if ($saveToFile) {
return array('time' => sec2time(round($time)), 'speed' => @round($bytesTotal / 1024 / (microtime(true) - $timeStart), 2), 'received' => true, 'size' => $fileSize, 'bytesReceived' => ($bytesReceived + $Resume['from']), 'bytesTotal' => ($bytesTotal + $Resume ['from']), 'file' => $saveToFile, 'name' => $FileName);
} else {
if (empty($sFilters['dechunk']) && stripos($header, "\nTransfer-Encoding: chunked") !== false && function_exists('http_chunked_decode')) {
$dechunked = http_chunked_decode($page);
if ($dechunked !== false) $page = $dechunked;
unset($dechunked);
}
if (stripos($header, "\nContent-Encoding: gzip") !== false) {
$decompressed = gzinflate(substr($page, 10));
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
} else if (stripos($header, "\nContent-Encoding: deflate") !== false) {
$decompressed = gzinflate(in_array(substr($page, 0, 2), array("x\x01", "x\x9C", "x\xDA")) ? substr($page, 2) : $page);
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
}
$page = $header.$page;
return $page;
}
}
function cURL($link, $cookie = 0, $post = 0, $referer = 0, $auth = 0, $opts = 0) {
static $NSS, $ch, $lastProxy;
if (empty($link) || !is_string($link)) return html_error(lang(24));
if (!extension_loaded('curl') || !function_exists('curl_init') || !function_exists('curl_exec')) return html_error('cURL isn\'t enabled or cURL\'s functions are disabled');
if (!empty($referer)) {
$arr = array_map('trim', explode("\n", $referer));
$referer = array_shift($arr);
$header = array_filter($arr);
} else $header = array();
$link = str_replace(array(' ', "\r", "\n"), array('%20'), $link);
$opt = array(CURLOPT_HEADER => 1, CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 0, CURLOPT_FAILONERROR => 0,
CURLOPT_FORBID_REUSE => 0, CURLOPT_FRESH_CONNECT => 0,
CURLINFO_HEADER_OUT => 1, CURLOPT_URL => $link,
CURLOPT_SSLVERSION => (defined('CURL_SSLVERSION_TLSv1') ? CURL_SSLVERSION_TLSv1 : 1),
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_ENCODING => 'gzip, deflate', CURLOPT_USERAGENT => rl_UserAgent);
// Fixes "Unknown cipher in list: TLSv1" on cURL with NSS
if (!isset($NSS)) {
$cV = curl_version();
$NSS = (!empty($cV['ssl_version']) && strtoupper(substr($cV['ssl_version'], 0, 4)) == 'NSS/');
}
if (!$NSS) $opt[CURLOPT_SSL_CIPHER_LIST] = 'TLSv1';
// Uncomment next line if do you have IPv6 problems
// $opt[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
$opt[CURLOPT_REFERER] = !empty($referer) ? $referer : false;
$opt[CURLOPT_COOKIE] = !empty($cookie) ? (is_array($cookie) ? CookiesToStr($cookie) : trim($cookie)) : false;
if (!empty($_GET['useproxy']) && !empty($_GET['proxy'])) {
$opt[CURLOPT_HTTPPROXYTUNNEL] = strtolower(parse_url($link, PHP_URL_SCHEME) == 'https') ? true : false; // cURL https proxy support... Experimental.
// $opt[CURLOPT_HTTPPROXYTUNNEL] = false; // Uncomment this line for disable https proxy over curl.
$opt[CURLOPT_PROXY] = $_GET['proxy'];
$opt[CURLOPT_PROXYUSERPWD] = (!empty($GLOBALS['pauth']) ? base64_decode($GLOBALS['pauth']) : false);
} else $opt[CURLOPT_PROXY] = false;
// Send more headers...
$headers = array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Pragma: no-cache', 'Cache-Control: no-cache', 'Connection: Keep-Alive');
if (empty($opt[CURLOPT_REFERER])) $headers[] = 'Referer:';
if (empty($opt[CURLOPT_COOKIE])) $headers[] = 'Cookie:';
if (!empty($opt[CURLOPT_PROXY]) && empty($opt[CURLOPT_PROXYUSERPWD])) $headers[] = 'Proxy-Authorization:';
if (count($header) > 0) $headers = array_merge($headers, $header);
$opt[CURLOPT_HTTPHEADER] = $headers;
if ($post != '0') {
$opt[CURLOPT_POST] = 1;
$opt[CURLOPT_POSTFIELDS] = is_array($post) ? formpostdata($post) : $post;
} else $opt[CURLOPT_HTTPGET] = 1;
if ($auth) {
$opt[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
$opt[CURLOPT_USERPWD] = base64_decode($auth);
} else $opt[CURLOPT_HTTPAUTH] = false;
$opt[CURLOPT_CONNECTTIMEOUT] = $opt[CURLOPT_TIMEOUT] = 120;
if (is_array($opts) && count($opts) > 0) foreach ($opts as $O => $V) $opt[$O] = $V;
if (!isset($lastProxy)) $lastProxy = $opt[CURLOPT_PROXY];
if (!isset($ch)) $ch = curl_init();
elseif ($lastProxy != $opt[CURLOPT_PROXY]) {
// cURL seems that doesn't like switching proxies on a active resource, there is a bug about that @ https://bugs.php.net/bug.php?id=68211
curl_close($ch);
$ch = curl_init();
$lastProxy = $opt[CURLOPT_PROXY];
}
foreach ($opt as $O => $V) curl_setopt($ch, $O, $V); // Using this instead of 'curl_setopt_array'
$page = curl_exec($ch);
$info = curl_getinfo($ch);
$errz = curl_errno($ch);
$errz2 = curl_error($ch);
// curl_close($ch);
if (substr($page, 9, 3) == '100' || !empty($opt[CURLOPT_PROXY])) $page = preg_replace("@^HTTP/1\.[01] \d{3}(?:\s[^\r\n]+)?\r\n\r\n(HTTP/1\.[01] \d+ [^\r\n]+)@i", "$1", $page, 1); // The "100 Continue" or "200 Connection established" can break some functions in plugins, lets remove it...
if ($errz != 0) return html_error("[cURL:$errz] $errz2");
return $page;
}
// This new function requires less line and actually reduces filesize :P
// Besides, using less globals means more variables available for us to use
function formpostdata($post=array()) {
$postdata = '';
foreach ($post as $k => $v) $postdata .= "$k=$v&";
// Remove the last '&'
$postdata = substr($postdata, 0, -1);
return $postdata;
}
// function to convert an array of cookies into a string
function CookiesToStr($cookie=array()) {
if (empty($cookie)) return '';
$cookies = '';
foreach ($cookie as $k => $v) $cookies .= "$k=$v; ";
// Remove the last '; '
$cookies = substr($cookies, 0, -2);
return $cookies;
}
function GetCookies($content) {
if (($hpos = strpos($content, "\r\n\r\n")) > 0) $content = substr($content, 0, $hpos); // We need only the headers
if (empty($content) || stripos($content, "\nSet-Cookie: ") === false) return '';
// The U option will make sure that it matches the first character
// So that it won't grab other information about cookie such as expire, domain and etc
preg_match_all('/\nSet-Cookie: (.*)(;|\r\n)/Ui', $content, $temp);
$cookie = $temp[1];
$cookie = implode('; ', $cookie);
return $cookie;
}
/**
* Function to get cookies & converted into array
* @param string The content you want to get the cookie from
* @param array Array of cookies to be updated [optional]
* @param bool Options to remove "deleted" or expired cookies (usually it named as 'deleted') [optional]
* @param mixed The default name for temporary cookie, values are accepted in an array [optional]
*/
function GetCookiesArr($content, $cookie=array(), $del=true, $dval=array('','deleted')) {
if (!is_array($cookie)) $cookie = array();
if (($hpos = strpos($content, "\r\n\r\n")) > 0) $content = substr($content, 0, $hpos); // We need only the headers
if (empty($content) || stripos($content, "\nSet-Cookie: ") === false || !preg_match_all ('/\nSet-Cookie: ([^\r\n]+)/i', $content, $temp)) return $cookie;
foreach ($temp[1] as $v) {
if (strpos($v, ';') !== false) list($v, $p) = explode(';', $v, 2);
else $p = false;
$v = explode('=', $v, 2);
$cookie[$v[0]] = $v[1];
if ($del) {
if (!is_array($dval)) $dval = array($dval);
if (in_array($v[1], $dval)) unset($cookie[$v[0]]);
elseif (!empty($p)) {
if (stripos($p, 'Max-Age=') !== false && preg_match('/[ \;]?Max-Age=(-?\d+)/i', $p, $P) && (int)$P[1] < 1) unset($cookie[$v[0]]);
elseif (stripos($p, 'expires=') !== false && preg_match('/[ \;]?expires=([a-zA-Z]{3}, \d{1,2} [a-zA-Z]{3} \d{4} \d{1,2}:\d{1,2}:\d{1,2} GMT)/i', $p, $P) && ($P = strtotime($P[1])) !== false && $P <= time()) unset($cookie[$v[0]]);
}
}
}
return $cookie;
}
/**
* Function to convert a string of cookies into an array
* @param string The existing string cookie value
* @param array The existing array cookie value that we want to merged/updated [optional]
* @param bool Options to remove temporary cookie (usually it named as 'deleted') [optional]
* @param mixed The default name for temporary cookie, values are accepted in an array [optional]
*/
function StrToCookies($cookies, $cookie=array(), $del=true, $dval=array('','deleted')) {
if (!is_array($cookie)) $cookie = array();
$cookies = trim($cookies);
if (empty($cookies)) return $cookie;
foreach (array_filter(array_map('trim', explode(';', $cookies))) as $v) {
$v = array_map('trim', explode('=', $v, 2));
$cookie[$v[0]] = $v[1];
if ($del) {
if (!is_array($dval)) $dval = array($dval);
if (in_array($v[1], $dval)) unset($cookie[$v[0]]);
}
}
return $cookie;
}
function GetChunkSize($fsize) {
if ($fsize <= 0) return 4096;
if ($fsize < 4096) return intval($fsize);
if ($fsize <= 1024 * 1024) return 4096;
if ($fsize <= 1024 * 1024 * 10) return 4096 * 10;
if ($fsize <= 1024 * 1024 * 40) return 4096 * 30;
if ($fsize <= 1024 * 1024 * 80) return 4096 * 47;
if ($fsize <= 1024 * 1024 * 120) return 4096 * 65;
if ($fsize <= 1024 * 1024 * 150) return 4096 * 70;
if ($fsize <= 1024 * 1024 * 200) return 4096 * 85;
if ($fsize <= 1024 * 1024 * 250) return 4096 * 100;
if ($fsize <= 1024 * 1024 * 300) return 4096 * 115;
if ($fsize <= 1024 * 1024 * 400) return 4096 * 135;
if ($fsize <= 1024 * 1024 * 500) return 4096 * 170;
if ($fsize <= 1024 * 1024 * 1000) return 4096 * 200;
return 4096 * 210;
}
function upfile($host, $port, $url, $referer, $cookie, $post, $file, $filename, $fieldname, $field2name = '', $proxy = 0, $pauth = 0, $upagent = 0, $scheme = 'http') {
global $nn, $lastError, $fp, $fs;
if (empty($upagent)) $upagent = rl_UserAgent;
$scheme = strtolower("$scheme://");
$bound = '--------' . md5(microtime());
$saveToFile = 0;
$postdata = '';
if (!empty($post) && is_array($post)) foreach ($post as $key => $value) {
$postdata .= '--' . $bound . $nn;
$postdata .= "Content-Disposition: form-data; name=\"$key\"$nn$nn";
$postdata .= $value . $nn;
}
$fieldname = $fieldname ? $fieldname : 'file' . md5($filename);
if (!is_readable($file)) {
$lastError = sprintf(lang(65), $file);
return FALSE;
}
$fileSize = filesize($file);
if (!empty($field2name)) {
$postdata .= '--' . $bound . $nn;
$postdata .= "Content-Disposition: form-data; name=\"$field2name\"; filename=\"\"$nn";
$postdata .= "Content-Type: application/octet-stream$nn$nn";
}
$postdata .= '--' . $bound . $nn;
$postdata .= "Content-Disposition: form-data; name=\"$fieldname\"; filename=\"$filename\"$nn";
$postdata .= "Content-Type: application/octet-stream$nn$nn";
if (!empty($cookie)) {
if (is_array($cookie)) $cookies = (count($cookie) > 0) ? CookiesToStr($cookie) : 0;
else $cookies = trim($cookie);
}
if ($scheme == 'https://') {
if (!extension_loaded('openssl')) return html_error('You need to install/enable PHP\'s OpenSSL extension to support uploading via HTTPS.');
$scheme = 'ssl://';
if ($port == 0 || $port == 80) $port = 443;
} else if ($port == 0) $port = 80;
if (!empty($referer) && ($pos = strpos("\r\n", $referer)) !== 0) {
$origin = parse_url($pos ? substr($referer, 0, $pos) : $referer);
$origin = strtolower($origin['scheme']) . '://' . strtolower($origin['host']) . (!empty($origin['port']) && $origin['port'] != defport(array('scheme' => $origin['scheme'])) ? ':' . $origin['port'] : '');
} else $origin = ($scheme == 'ssl://' ? 'https://' : $scheme) . $host . ($port != 80 && ($scheme != 'ssl://' || $port != 443) ? ':' . $port : '');
if ($proxy) {
list($proxyHost, $proxyPort) = explode(':', $proxy, 2);
if ($scheme != 'ssl://') {
$host = $host . ($port != 80 && $port != 443 ? ":$port" : '');
$url = "$scheme$host$url";
}
}
if ($scheme != 'ssl://') $scheme = '';
$cHeaders = readCustomHeaders($referer);
$request = array();
$request[''] = 'POST ' . str_replace(' ', '%20', $url) . ' HTTP/1.1';
$request['host'] = $host;
$request['user-agent'] = $upagent;
$request['accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$request['accept-encoding'] = 'gzip, deflate';
$request['accept-language'] = 'en-US,en;q=0.5';
if (!empty($referer)) $request['referer'] = $referer;
if (!empty($cookies)) $request['cookie'] = $cookies;
if (!empty($pauth) && !$scheme) $request['proxy-authorization'] = "Basic $pauth";
$request['origin'] = $origin;
$request['content-type'] = "multipart/form-data; boundary=$bound";
$request['content-length'] = (strlen($postdata) + strlen($nn . "--" . $bound . "--" . $nn) + $fileSize);
$request = headers2request(array_merge($request, $cHeaders), $postdata);
$errno = 0;
$errstr = '';
if ($scheme == 'ssl://') {
$hosts = (!empty($proxyHost) ? $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
if ($proxy) $url = "https://$host$url"; // For the 'connected to' message
} else $hosts = (!empty($proxyHost) ? $scheme . $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
$fp = @stream_socket_client($hosts, $errno, $errstr, 120, STREAM_CLIENT_CONNECT);
if (!$fp) {
if (!function_exists('stream_socket_client')) return html_error('[ERROR] stream_socket_client() is disabled.');
$dis_host = !empty($proxyHost) ? $proxyHost : $host;
$dis_port = !empty($proxyPort) ? $proxyPort : $port;
return html_error(sprintf(lang(88), $dis_host, $dis_port));
}
if ($errno || $errstr) {
$lastError = $errstr;
return false;
}
if ($proxy) echo '' . sprintf(lang(89), $proxyHost, $proxyPort) . '
UPLOAD: ' . htmlspecialchars($url) . "...
\n";
else echo '
'.sprintf(lang(90), $host, $port).'
';
if ($scheme == 'ssl://' && $proxy) {
$connRequest = array();
$connRequest[''] = "CONNECT $host:$port HTTP/1.1";
if (!empty($pauth)) $connRequest['proxy-authorization'] = "Basic $pauth";
$connRequest['proxy-connection'] = 'Close';
$connRequest = headers2request($connRequest);
fwrite($fp, $connRequest);
fflush($fp);
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = 'No response from proxy after CONNECT.';
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
$status = intval(substr($header, 9, 3));
if ($status != 200) {
return html_error("Proxy returned $status after CONNECT.");
}
// Start TLS.
if (!stream_socket_enable_crypto($fp, true, (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT') ? STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT : STREAM_CRYPTO_METHOD_TLS_CLIENT))) return html_error('TLS Startup Error.');
}
echo(lang(104) . ' ' . htmlspecialchars($filename) . ', ' . lang(56) . ' ' . bytesToKbOrMbOrGb($fileSize) . '...
');
$GLOBALS['id'] = md5(time() * rand(0, 10));
require (TEMPLATE_DIR . '/uploadui.php');
flush();
fwrite($fp, $request);
fflush($fp);
$timeStart = microtime(true);
$chunkSize = GetChunkSize($fileSize);
$fs = fopen($file, 'r');
$totalsend = $time = $lastChunkTime = 0;
while (!feof($fs) && !$errno && !$errstr) {
$data = fread($fs, $chunkSize);
if ($data === false) {
fclose($fs);
fclose($fp);
return html_error(lang(112));
}
$sendbyte = @fwrite($fp, $data);
fflush($fp);
if ($sendbyte === false || strlen($data) > $sendbyte) {
fclose($fs);
fclose($fp);
return html_error(lang(113));
}
$totalsend += $sendbyte;
$time = microtime(true) - $timeStart;
$chunkTime = $time - $lastChunkTime;
$chunkTime = $chunkTime ? $chunkTime : 1;
$chunkTime = ($chunkTime > 0) ? $chunkTime : 1;
$lastChunkTime = $time;
$speed = round($sendbyte / 1024 / $chunkTime, 2);
$percent = round($totalsend / $fileSize * 100, 2);
echo "\n";
flush();
}
if ($errno || $errstr) {
$lastError = $errstr;
return false;
}
fclose($fs);
fwrite($fp, $nn . "--" . $bound . "--" . $nn);
fflush($fp);
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = lang(91);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
// Array for active stream filters
$sFilters = array();
if (stripos($header, "\nTransfer-Encoding: chunked") !== false && in_array('dechunk', stream_get_filters())) $sFilters['dechunk'] = stream_filter_append($fp, 'dechunk', STREAM_FILTER_READ); // Add built-in dechunk filter
$length = trim(cut_str($header, "\nContent-Length: ", "\n"));
if (!$length || !is_numeric($length)) $length = -1;
$page = stream_get_contents($fp, $length);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
if (empty($sFilters['dechunk']) && stripos($header, "\nTransfer-Encoding: chunked") !== false && function_exists('http_chunked_decode')) {
$dechunked = http_chunked_decode($page);
if ($dechunked !== false) $page = $dechunked;
unset($dechunked);
}
if (stripos($header, "\nContent-Encoding: gzip") !== false) {
$decompressed = gzinflate(substr($page, 10));
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
} else if (stripos($header, "\nContent-Encoding: deflate") !== false) {
$decompressed = gzinflate(in_array(substr($page, 0, 2), array("x\x01", "x\x9C", "x\xDA")) ? substr($page, 2) : $page);
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
}
$page = $header.$page;
return $page;
}
function putfile($host, $port, $url, $referer, $cookie, $file, $filename, $proxy = 0, $pauth = 0, $upagent = 0, $scheme = 'http') {
global $nn, $lastError, $fp, $fs;
if (empty($upagent)) $upagent = rl_UserAgent;
$scheme = strtolower("$scheme://");
if (!is_readable($file)) {
$lastError = sprintf(lang(65), $file);
return FALSE;
}
$fileSize = filesize($file);
if (!empty($cookie)) {
if (is_array($cookie)) $cookies = (count($cookie) > 0) ? CookiesToStr($cookie) : 0;
else $cookies = trim($cookie);
}
if ($scheme == 'https://') {
if (!extension_loaded('openssl')) return html_error('You need to install/enable PHP\'s OpenSSL extension to support uploading via HTTPS.');
$scheme = 'ssl://';
if ($port == 0 || $port == 80) $port = 443;
} else if ($port == 0) $port = 80;
if (!empty($referer) && ($pos = strpos("\r\n", $referer)) !== 0) {
$origin = parse_url($pos ? substr($referer, 0, $pos) : $referer);
$origin = strtolower($origin['scheme']) . '://' . strtolower($origin['host']) . (!empty($origin['port']) && $origin['port'] != defport(array('scheme' => $origin['scheme'])) ? ':' . $origin['port'] : '');
} else $origin = ($scheme == 'ssl://' ? 'https://' : $scheme) . $host . ($port != 80 && ($scheme != 'ssl://' || $port != 443) ? ':' . $port : '');
if ($proxy) {
list($proxyHost, $proxyPort) = explode(':', $proxy, 2);
if ($scheme != 'ssl://') {
$host = $host . ($port != 80 && $port != 443 ? ":$port" : '');
$url = "$scheme$host$url";
}
}
if ($scheme != 'ssl://') $scheme = '';
$cHeaders = readCustomHeaders($referer);
$request = array();
$request[''] = 'PUT ' . str_replace(' ', '%20', $url) . ' HTTP/1.1';
$request['host'] = $host;
$request['user-agent'] = $upagent;
$request['accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$request['accept-encoding'] = 'gzip, deflate';
$request['accept-language'] = 'en-US,en;q=0.5';
if (!empty($referer)) $request['referer'] = $referer;
if (!empty($cookies)) $request['cookie'] = $cookies;
if (!empty($pauth) && !$scheme) $request['proxy-authorization'] = "Basic $pauth";
$request['origin'] = $origin;
$request['content-disposition'] = 'attachment';
$request['content-type'] = 'multipart/form-data';
$request['x-file-name'] = $filename;
$request['x-file-size'] = $request['content-length'] = $fileSize;
$request = headers2request(array_merge($request, $cHeaders));
$errno = 0;
$errstr = '';
if ($scheme == 'ssl://') {
$hosts = (!empty($proxyHost) ? $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
if ($proxy) $url = "https://$host$url"; // For the 'connected to' message
} else $hosts = (!empty($proxyHost) ? $scheme . $proxyHost : $scheme . $host) . ':' . (!empty($proxyPort) ? $proxyPort : $port);
$fp = @stream_socket_client($hosts, $errno, $errstr, 120, STREAM_CLIENT_CONNECT);
if (!$fp) {
if (!function_exists('stream_socket_client')) return html_error('[ERROR] stream_socket_client() is disabled.');
$dis_host = !empty($proxyHost) ? $proxyHost : $host;
$dis_port = !empty($proxyPort) ? $proxyPort : $port;
return html_error(sprintf(lang(88), $dis_host, $dis_port));
}
if ($errno || $errstr) {
$lastError = $errstr;
return false;
}
if ($proxy) echo '' . sprintf(lang(89), $proxyHost, $proxyPort) . '
PUT: ' . htmlspecialchars($url) . "...
\n";
else echo '
'.sprintf(lang(90), $host, $port).'
';
if ($scheme == 'ssl://' && $proxy) {
$connRequest = array();
$connRequest[''] = "CONNECT $host:$port HTTP/1.1";
if (!empty($pauth)) $connRequest['proxy-authorization'] = "Basic $pauth";
$connRequest['proxy-connection'] = 'Close';
$connRequest = headers2request($connRequest);
fwrite($fp, $connRequest);
fflush($fp);
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = 'No response from proxy after CONNECT.';
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
$status = intval(substr($header, 9, 3));
if ($status != 200) {
return html_error("Proxy returned $status after CONNECT.");
}
// Start TLS.
if (!stream_socket_enable_crypto($fp, true, (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT') ? STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT : STREAM_CRYPTO_METHOD_TLS_CLIENT))) return html_error('TLS Startup Error.');
}
echo(lang(104) . ' ' . htmlspecialchars($filename) . ', ' . lang(56) . ' ' . bytesToKbOrMbOrGb($fileSize) . '...
');
$GLOBALS['id'] = md5(time() * rand(0, 10));
require (TEMPLATE_DIR . '/uploadui.php');
flush();
fwrite($fp, $request);
fflush($fp);
$timeStart = microtime(true);
$chunkSize = GetChunkSize($fileSize);
$fs = fopen($file, 'r');
$totalsend = $time = $lastChunkTime = 0;
while (!feof($fs) && !$errno && !$errstr) {
$data = fread($fs, $chunkSize);
if ($data === false) {
fclose($fs);
fclose($fp);
return html_error(lang(112));
}
$sendbyte = @fwrite($fp, $data);
fflush($fp);
if ($sendbyte === false || strlen($data) > $sendbyte) {
fclose($fs);
fclose($fp);
return html_error(lang(113));
}
$totalsend += $sendbyte;
$time = microtime(true) - $timeStart;
$chunkTime = $time - $lastChunkTime;
$chunkTime = ($chunkTime > 0) ? $chunkTime : 1;
$lastChunkTime = $time;
$speed = round($sendbyte / 1024 / $chunkTime, 2);
$percent = round($totalsend / $fileSize * 100, 2);
echo "\n";
flush();
}
if ($errno || $errstr) {
$lastError = $errstr;
return false;
}
fclose($fs);
fflush($fp);
$llen = 0;
$header = '';
do {
$header .= fgets($fp, 16384);
$len = strlen($header);
if (!$header || $len == $llen) {
$lastError = lang(91);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
return false;
}
$llen = $len;
} while (strpos($header, $nn . $nn) === false);
// Array for active stream filters
$sFilters = array();
if (stripos($header, "\nTransfer-Encoding: chunked") !== false && in_array('dechunk', stream_get_filters())) $sFilters['dechunk'] = stream_filter_append($fp, 'dechunk', STREAM_FILTER_READ); // Add built-in dechunk filter
$length = trim(cut_str($header, "\nContent-Length: ", "\n"));
if (!$length || !is_numeric($length)) $length = -1;
$page = stream_get_contents($fp, $length);
stream_socket_shutdown($fp, STREAM_SHUT_RDWR);
fclose($fp);
if (empty($sFilters['dechunk']) && stripos($header, "\nTransfer-Encoding: chunked") !== false && function_exists('http_chunked_decode')) {
$dechunked = http_chunked_decode($page);
if ($dechunked !== false) $page = $dechunked;
unset($dechunked);
}
if (stripos($header, "\nContent-Encoding: gzip") !== false) {
$decompressed = gzinflate(substr($page, 10));
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
} else if (stripos($header, "\nContent-Encoding: deflate") !== false) {
$decompressed = gzinflate(in_array(substr($page, 0, 2), array("x\x01", "x\x9C", "x\xDA")) ? substr($page, 2) : $page);
if ($decompressed !== false) $page = $decompressed;
unset($decompressed);
}
$page = $header.$page;
return $page;
}