Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/litespee.../src
File: utility.cls.php
<?php
[0] Fix | Delete
[1] Fix | Delete
/**
[2] Fix | Delete
* The utility class.
[3] Fix | Delete
*
[4] Fix | Delete
* @since 1.1.5
[5] Fix | Delete
* @since 1.5 Moved into /inc
[6] Fix | Delete
*/
[7] Fix | Delete
[8] Fix | Delete
namespace LiteSpeed;
[9] Fix | Delete
[10] Fix | Delete
defined('WPINC') || exit();
[11] Fix | Delete
[12] Fix | Delete
class Utility extends Root
[13] Fix | Delete
{
[14] Fix | Delete
private static $_internal_domains;
[15] Fix | Delete
[16] Fix | Delete
/**
[17] Fix | Delete
* Validate regex
[18] Fix | Delete
*
[19] Fix | Delete
* @since 1.0.9
[20] Fix | Delete
* @since 3.0 Moved here from admin-settings.cls
[21] Fix | Delete
* @access public
[22] Fix | Delete
* @return bool True for valid rules, false otherwise.
[23] Fix | Delete
*/
[24] Fix | Delete
public static function syntax_checker($rules)
[25] Fix | Delete
{
[26] Fix | Delete
return preg_match(self::arr2regex($rules), '') !== false;
[27] Fix | Delete
}
[28] Fix | Delete
[29] Fix | Delete
/**
[30] Fix | Delete
* Combine regex array to regex rule
[31] Fix | Delete
*
[32] Fix | Delete
* @since 3.0
[33] Fix | Delete
*/
[34] Fix | Delete
public static function arr2regex($arr, $drop_delimiter = false)
[35] Fix | Delete
{
[36] Fix | Delete
$arr = self::sanitize_lines($arr);
[37] Fix | Delete
[38] Fix | Delete
$new_arr = array();
[39] Fix | Delete
foreach ($arr as $v) {
[40] Fix | Delete
$new_arr[] = preg_quote($v, '#');
[41] Fix | Delete
}
[42] Fix | Delete
[43] Fix | Delete
$regex = implode('|', $new_arr);
[44] Fix | Delete
$regex = str_replace(' ', '\\ ', $regex);
[45] Fix | Delete
[46] Fix | Delete
if ($drop_delimiter) {
[47] Fix | Delete
return $regex;
[48] Fix | Delete
}
[49] Fix | Delete
[50] Fix | Delete
return '#' . $regex . '#';
[51] Fix | Delete
}
[52] Fix | Delete
[53] Fix | Delete
/**
[54] Fix | Delete
* Replace wildcard to regex
[55] Fix | Delete
*
[56] Fix | Delete
* @since 3.2.2
[57] Fix | Delete
*/
[58] Fix | Delete
public static function wildcard2regex($string)
[59] Fix | Delete
{
[60] Fix | Delete
if (is_array($string)) {
[61] Fix | Delete
return array_map(__CLASS__ . '::wildcard2regex', $string);
[62] Fix | Delete
}
[63] Fix | Delete
[64] Fix | Delete
if (strpos($string, '*') !== false) {
[65] Fix | Delete
$string = preg_quote($string, '#');
[66] Fix | Delete
$string = str_replace('\*', '.*', $string);
[67] Fix | Delete
}
[68] Fix | Delete
[69] Fix | Delete
return $string;
[70] Fix | Delete
}
[71] Fix | Delete
[72] Fix | Delete
/**
[73] Fix | Delete
* Check if an URL or current page is REST req or not
[74] Fix | Delete
*
[75] Fix | Delete
* @since 2.9.3
[76] Fix | Delete
* @deprecated 2.9.4 Moved to REST class
[77] Fix | Delete
* @access public
[78] Fix | Delete
*/
[79] Fix | Delete
public static function is_rest($url = false)
[80] Fix | Delete
{
[81] Fix | Delete
return false;
[82] Fix | Delete
}
[83] Fix | Delete
[84] Fix | Delete
/**
[85] Fix | Delete
* Get current page type
[86] Fix | Delete
*
[87] Fix | Delete
* @since 2.9
[88] Fix | Delete
*/
[89] Fix | Delete
public static function page_type()
[90] Fix | Delete
{
[91] Fix | Delete
global $wp_query;
[92] Fix | Delete
$page_type = 'default';
[93] Fix | Delete
[94] Fix | Delete
if ($wp_query->is_page) {
[95] Fix | Delete
$page_type = is_front_page() ? 'front' : 'page';
[96] Fix | Delete
} elseif ($wp_query->is_home) {
[97] Fix | Delete
$page_type = 'home';
[98] Fix | Delete
} elseif ($wp_query->is_single) {
[99] Fix | Delete
// $page_type = $wp_query->is_attachment ? 'attachment' : 'single';
[100] Fix | Delete
$page_type = get_post_type();
[101] Fix | Delete
} elseif ($wp_query->is_category) {
[102] Fix | Delete
$page_type = 'category';
[103] Fix | Delete
} elseif ($wp_query->is_tag) {
[104] Fix | Delete
$page_type = 'tag';
[105] Fix | Delete
} elseif ($wp_query->is_tax) {
[106] Fix | Delete
$page_type = 'tax';
[107] Fix | Delete
// $page_type = get_queried_object()->taxonomy;
[108] Fix | Delete
} elseif ($wp_query->is_archive) {
[109] Fix | Delete
if ($wp_query->is_day) {
[110] Fix | Delete
$page_type = 'day';
[111] Fix | Delete
} elseif ($wp_query->is_month) {
[112] Fix | Delete
$page_type = 'month';
[113] Fix | Delete
} elseif ($wp_query->is_year) {
[114] Fix | Delete
$page_type = 'year';
[115] Fix | Delete
} elseif ($wp_query->is_author) {
[116] Fix | Delete
$page_type = 'author';
[117] Fix | Delete
} else {
[118] Fix | Delete
$page_type = 'archive';
[119] Fix | Delete
}
[120] Fix | Delete
} elseif ($wp_query->is_search) {
[121] Fix | Delete
$page_type = 'search';
[122] Fix | Delete
} elseif ($wp_query->is_404) {
[123] Fix | Delete
$page_type = '404';
[124] Fix | Delete
}
[125] Fix | Delete
[126] Fix | Delete
return $page_type;
[127] Fix | Delete
[128] Fix | Delete
// if ( is_404() ) {
[129] Fix | Delete
// $page_type = '404';
[130] Fix | Delete
// }
[131] Fix | Delete
// elseif ( is_singular() ) {
[132] Fix | Delete
// $page_type = get_post_type();
[133] Fix | Delete
// }
[134] Fix | Delete
// elseif ( is_home() && get_option( 'show_on_front' ) == 'page' ) {
[135] Fix | Delete
// $page_type = 'home';
[136] Fix | Delete
// }
[137] Fix | Delete
// elseif ( is_front_page() ) {
[138] Fix | Delete
// $page_type = 'front';
[139] Fix | Delete
// }
[140] Fix | Delete
// elseif ( is_tax() ) {
[141] Fix | Delete
// $page_type = get_queried_object()->taxonomy;
[142] Fix | Delete
// }
[143] Fix | Delete
// elseif ( is_category() ) {
[144] Fix | Delete
// $page_type = 'category';
[145] Fix | Delete
// }
[146] Fix | Delete
// elseif ( is_tag() ) {
[147] Fix | Delete
// $page_type = 'tag';
[148] Fix | Delete
// }
[149] Fix | Delete
[150] Fix | Delete
// return $page_type;
[151] Fix | Delete
}
[152] Fix | Delete
[153] Fix | Delete
/**
[154] Fix | Delete
* Get ping speed
[155] Fix | Delete
*
[156] Fix | Delete
* @since 2.9
[157] Fix | Delete
*/
[158] Fix | Delete
public static function ping($domain)
[159] Fix | Delete
{
[160] Fix | Delete
if (strpos($domain, ':')) {
[161] Fix | Delete
$domain = parse_url($domain, PHP_URL_HOST);
[162] Fix | Delete
}
[163] Fix | Delete
$starttime = microtime(true);
[164] Fix | Delete
$file = fsockopen($domain, 443, $errno, $errstr, 10);
[165] Fix | Delete
$stoptime = microtime(true);
[166] Fix | Delete
$status = 0;
[167] Fix | Delete
[168] Fix | Delete
if (!$file) {
[169] Fix | Delete
$status = 99999;
[170] Fix | Delete
}
[171] Fix | Delete
// Site is down
[172] Fix | Delete
else {
[173] Fix | Delete
fclose($file);
[174] Fix | Delete
$status = ($stoptime - $starttime) * 1000;
[175] Fix | Delete
$status = floor($status);
[176] Fix | Delete
}
[177] Fix | Delete
[178] Fix | Delete
Debug2::debug("[Util] ping [Domain] $domain \t[Speed] $status");
[179] Fix | Delete
[180] Fix | Delete
return $status;
[181] Fix | Delete
}
[182] Fix | Delete
[183] Fix | Delete
/**
[184] Fix | Delete
* Set seconds/timestamp to readable format
[185] Fix | Delete
*
[186] Fix | Delete
* @since 1.6.5
[187] Fix | Delete
* @access public
[188] Fix | Delete
*/
[189] Fix | Delete
public static function readable_time($seconds_or_timestamp, $timeout = 3600, $forward = false)
[190] Fix | Delete
{
[191] Fix | Delete
if (strlen($seconds_or_timestamp) == 10) {
[192] Fix | Delete
$seconds = time() - $seconds_or_timestamp;
[193] Fix | Delete
if ($seconds > $timeout) {
[194] Fix | Delete
return date('m/d/Y H:i:s', $seconds_or_timestamp + LITESPEED_TIME_OFFSET);
[195] Fix | Delete
}
[196] Fix | Delete
} else {
[197] Fix | Delete
$seconds = $seconds_or_timestamp;
[198] Fix | Delete
}
[199] Fix | Delete
[200] Fix | Delete
$res = '';
[201] Fix | Delete
if ($seconds > 86400) {
[202] Fix | Delete
$num = floor($seconds / 86400);
[203] Fix | Delete
$res .= $num . 'd';
[204] Fix | Delete
$seconds %= 86400;
[205] Fix | Delete
}
[206] Fix | Delete
[207] Fix | Delete
if ($seconds > 3600) {
[208] Fix | Delete
if ($res) {
[209] Fix | Delete
$res .= ', ';
[210] Fix | Delete
}
[211] Fix | Delete
$num = floor($seconds / 3600);
[212] Fix | Delete
$res .= $num . 'h';
[213] Fix | Delete
$seconds %= 3600;
[214] Fix | Delete
}
[215] Fix | Delete
[216] Fix | Delete
if ($seconds > 60) {
[217] Fix | Delete
if ($res) {
[218] Fix | Delete
$res .= ', ';
[219] Fix | Delete
}
[220] Fix | Delete
$num = floor($seconds / 60);
[221] Fix | Delete
$res .= $num . 'm';
[222] Fix | Delete
$seconds %= 60;
[223] Fix | Delete
}
[224] Fix | Delete
[225] Fix | Delete
if ($seconds > 0) {
[226] Fix | Delete
if ($res) {
[227] Fix | Delete
$res .= ' ';
[228] Fix | Delete
}
[229] Fix | Delete
$res .= $seconds . 's';
[230] Fix | Delete
}
[231] Fix | Delete
[232] Fix | Delete
if (!$res) {
[233] Fix | Delete
return $forward ? __('right now', 'litespeed-cache') : __('just now', 'litespeed-cache');
[234] Fix | Delete
}
[235] Fix | Delete
[236] Fix | Delete
$res = $forward ? $res : sprintf(__(' %s ago', 'litespeed-cache'), $res);
[237] Fix | Delete
[238] Fix | Delete
return $res;
[239] Fix | Delete
}
[240] Fix | Delete
[241] Fix | Delete
/**
[242] Fix | Delete
* Convert array to string
[243] Fix | Delete
*
[244] Fix | Delete
* @since 1.6
[245] Fix | Delete
* @access public
[246] Fix | Delete
*/
[247] Fix | Delete
public static function arr2str($arr)
[248] Fix | Delete
{
[249] Fix | Delete
if (!is_array($arr)) {
[250] Fix | Delete
return $arr;
[251] Fix | Delete
}
[252] Fix | Delete
[253] Fix | Delete
return base64_encode(\json_encode($arr));
[254] Fix | Delete
}
[255] Fix | Delete
[256] Fix | Delete
/**
[257] Fix | Delete
* Get human readable size
[258] Fix | Delete
*
[259] Fix | Delete
* @since 1.6
[260] Fix | Delete
* @access public
[261] Fix | Delete
*/
[262] Fix | Delete
public static function real_size($filesize, $is_1000 = false)
[263] Fix | Delete
{
[264] Fix | Delete
$unit = $is_1000 ? 1000 : 1024;
[265] Fix | Delete
[266] Fix | Delete
if ($filesize >= pow($unit, 3)) {
[267] Fix | Delete
$filesize = round(($filesize / pow($unit, 3)) * 100) / 100 . 'G';
[268] Fix | Delete
} elseif ($filesize >= pow($unit, 2)) {
[269] Fix | Delete
$filesize = round(($filesize / pow($unit, 2)) * 100) / 100 . 'M';
[270] Fix | Delete
} elseif ($filesize >= $unit) {
[271] Fix | Delete
$filesize = round(($filesize / $unit) * 100) / 100 . 'K';
[272] Fix | Delete
} else {
[273] Fix | Delete
$filesize = $filesize . 'B';
[274] Fix | Delete
}
[275] Fix | Delete
return $filesize;
[276] Fix | Delete
}
[277] Fix | Delete
[278] Fix | Delete
/**
[279] Fix | Delete
* Parse attributes from string
[280] Fix | Delete
*
[281] Fix | Delete
* @since 1.2.2
[282] Fix | Delete
* @since 1.4 Moved from optimize to utility
[283] Fix | Delete
* @access private
[284] Fix | Delete
* @param string $str
[285] Fix | Delete
* @return array All the attributes
[286] Fix | Delete
*/
[287] Fix | Delete
public static function parse_attr($str)
[288] Fix | Delete
{
[289] Fix | Delete
$attrs = array();
[290] Fix | Delete
preg_match_all('#([\w-]+)=(["\'])([^\2]*)\2#isU', $str, $matches, PREG_SET_ORDER);
[291] Fix | Delete
foreach ($matches as $match) {
[292] Fix | Delete
$attrs[$match[1]] = trim($match[3]);
[293] Fix | Delete
}
[294] Fix | Delete
return $attrs;
[295] Fix | Delete
}
[296] Fix | Delete
[297] Fix | Delete
/**
[298] Fix | Delete
* Check if an array has a string
[299] Fix | Delete
*
[300] Fix | Delete
* Support $ exact match
[301] Fix | Delete
*
[302] Fix | Delete
* @since 1.3
[303] Fix | Delete
* @access private
[304] Fix | Delete
* @param string $needle The string to search with
[305] Fix | Delete
* @param array $haystack
[306] Fix | Delete
* @return bool|string False if not found, otherwise return the matched string in haystack.
[307] Fix | Delete
*/
[308] Fix | Delete
public static function str_hit_array($needle, $haystack, $has_ttl = false)
[309] Fix | Delete
{
[310] Fix | Delete
if (!$haystack) {
[311] Fix | Delete
return false;
[312] Fix | Delete
}
[313] Fix | Delete
/**
[314] Fix | Delete
* Safety check to avoid PHP warning
[315] Fix | Delete
* @see https://github.com/litespeedtech/lscache_wp/pull/131/commits/45fc03af308c7d6b5583d1664fad68f75fb6d017
[316] Fix | Delete
*/
[317] Fix | Delete
if (!is_array($haystack)) {
[318] Fix | Delete
Debug2::debug('[Util] ❌ bad param in str_hit_array()!');
[319] Fix | Delete
[320] Fix | Delete
return false;
[321] Fix | Delete
}
[322] Fix | Delete
[323] Fix | Delete
$hit = false;
[324] Fix | Delete
$this_ttl = 0;
[325] Fix | Delete
foreach ($haystack as $item) {
[326] Fix | Delete
if (!$item) {
[327] Fix | Delete
continue;
[328] Fix | Delete
}
[329] Fix | Delete
[330] Fix | Delete
if ($has_ttl) {
[331] Fix | Delete
$this_ttl = 0;
[332] Fix | Delete
$item = explode(' ', $item);
[333] Fix | Delete
if (!empty($item[1])) {
[334] Fix | Delete
$this_ttl = $item[1];
[335] Fix | Delete
}
[336] Fix | Delete
$item = $item[0];
[337] Fix | Delete
}
[338] Fix | Delete
[339] Fix | Delete
if (substr($item, 0, 1) === '^' && substr($item, -1) === '$') {
[340] Fix | Delete
// do exact match
[341] Fix | Delete
if (substr($item, 1, -1) === $needle) {
[342] Fix | Delete
$hit = $item;
[343] Fix | Delete
break;
[344] Fix | Delete
}
[345] Fix | Delete
} elseif (substr($item, -1) === '$') {
[346] Fix | Delete
// match end
[347] Fix | Delete
if (substr($item, 0, -1) === substr($needle, -strlen($item) + 1)) {
[348] Fix | Delete
$hit = $item;
[349] Fix | Delete
break;
[350] Fix | Delete
}
[351] Fix | Delete
} elseif (substr($item, 0, 1) === '^') {
[352] Fix | Delete
// match beginning
[353] Fix | Delete
if (substr($item, 1) === substr($needle, 0, strlen($item) - 1)) {
[354] Fix | Delete
$hit = $item;
[355] Fix | Delete
break;
[356] Fix | Delete
}
[357] Fix | Delete
} else {
[358] Fix | Delete
if (strpos($needle, $item) !== false) {
[359] Fix | Delete
$hit = $item;
[360] Fix | Delete
break;
[361] Fix | Delete
}
[362] Fix | Delete
}
[363] Fix | Delete
}
[364] Fix | Delete
[365] Fix | Delete
if ($hit) {
[366] Fix | Delete
if ($has_ttl) {
[367] Fix | Delete
return array($hit, $this_ttl);
[368] Fix | Delete
}
[369] Fix | Delete
[370] Fix | Delete
return $hit;
[371] Fix | Delete
}
[372] Fix | Delete
[373] Fix | Delete
return false;
[374] Fix | Delete
}
[375] Fix | Delete
[376] Fix | Delete
/**
[377] Fix | Delete
* Improve compatibility to PHP old versions
[378] Fix | Delete
*
[379] Fix | Delete
* @since 1.2.2
[380] Fix | Delete
*
[381] Fix | Delete
*/
[382] Fix | Delete
public static function compatibility()
[383] Fix | Delete
{
[384] Fix | Delete
require_once LSCWP_DIR . 'lib/php-compatibility.func.php';
[385] Fix | Delete
}
[386] Fix | Delete
[387] Fix | Delete
/**
[388] Fix | Delete
* Convert URI to URL
[389] Fix | Delete
*
[390] Fix | Delete
* @since 1.3
[391] Fix | Delete
* @access public
[392] Fix | Delete
* @param string $uri `xx/xx.html` or `/subfolder/xx/xx.html`
[393] Fix | Delete
* @return string http://www.example.com/subfolder/xx/xx.html
[394] Fix | Delete
*/
[395] Fix | Delete
public static function uri2url($uri)
[396] Fix | Delete
{
[397] Fix | Delete
if (substr($uri, 0, 1) === '/') {
[398] Fix | Delete
self::domain_const();
[399] Fix | Delete
$url = LSCWP_DOMAIN . $uri;
[400] Fix | Delete
} else {
[401] Fix | Delete
$url = home_url('/') . $uri;
[402] Fix | Delete
}
[403] Fix | Delete
[404] Fix | Delete
return $url;
[405] Fix | Delete
}
[406] Fix | Delete
[407] Fix | Delete
/**
[408] Fix | Delete
* Convert URL to basename (filename)
[409] Fix | Delete
*
[410] Fix | Delete
* @since 4.7
[411] Fix | Delete
*/
[412] Fix | Delete
public static function basename($url)
[413] Fix | Delete
{
[414] Fix | Delete
$url = trim($url);
[415] Fix | Delete
$uri = @parse_url($url, PHP_URL_PATH);
[416] Fix | Delete
$basename = pathinfo($uri, PATHINFO_BASENAME);
[417] Fix | Delete
[418] Fix | Delete
return $basename;
[419] Fix | Delete
}
[420] Fix | Delete
[421] Fix | Delete
/**
[422] Fix | Delete
* Drop .webp if existed in filename
[423] Fix | Delete
*
[424] Fix | Delete
* @since 4.7
[425] Fix | Delete
*/
[426] Fix | Delete
public static function drop_webp($filename)
[427] Fix | Delete
{
[428] Fix | Delete
if (substr($filename, -5) === '.webp') {
[429] Fix | Delete
$filename = substr($filename, 0, -5);
[430] Fix | Delete
}
[431] Fix | Delete
[432] Fix | Delete
return $filename;
[433] Fix | Delete
}
[434] Fix | Delete
[435] Fix | Delete
/**
[436] Fix | Delete
* Convert URL to URI
[437] Fix | Delete
*
[438] Fix | Delete
* @since 1.2.2
[439] Fix | Delete
* @since 1.6.2.1 Added 2nd param keep_qs
[440] Fix | Delete
* @access public
[441] Fix | Delete
*/
[442] Fix | Delete
public static function url2uri($url, $keep_qs = false)
[443] Fix | Delete
{
[444] Fix | Delete
$url = trim($url);
[445] Fix | Delete
$uri = @parse_url($url, PHP_URL_PATH);
[446] Fix | Delete
$qs = @parse_url($url, PHP_URL_QUERY);
[447] Fix | Delete
[448] Fix | Delete
if (!$keep_qs || !$qs) {
[449] Fix | Delete
return $uri;
[450] Fix | Delete
}
[451] Fix | Delete
[452] Fix | Delete
return $uri . '?' . $qs;
[453] Fix | Delete
}
[454] Fix | Delete
[455] Fix | Delete
/**
[456] Fix | Delete
* Get attachment relative path to upload folder
[457] Fix | Delete
*
[458] Fix | Delete
* @since 3.0
[459] Fix | Delete
* @access public
[460] Fix | Delete
* @param string `https://aa.com/bbb/wp-content/upload/2018/08/test.jpg` or `/bbb/wp-content/upload/2018/08/test.jpg`
[461] Fix | Delete
* @return string `2018/08/test.jpg`
[462] Fix | Delete
*/
[463] Fix | Delete
public static function att_short_path($url)
[464] Fix | Delete
{
[465] Fix | Delete
if (!defined('LITESPEED_UPLOAD_PATH')) {
[466] Fix | Delete
$_wp_upload_dir = wp_upload_dir();
[467] Fix | Delete
[468] Fix | Delete
$upload_path = self::url2uri($_wp_upload_dir['baseurl']);
[469] Fix | Delete
[470] Fix | Delete
define('LITESPEED_UPLOAD_PATH', $upload_path);
[471] Fix | Delete
}
[472] Fix | Delete
[473] Fix | Delete
$local_file = self::url2uri($url);
[474] Fix | Delete
[475] Fix | Delete
$short_path = substr($local_file, strlen(LITESPEED_UPLOAD_PATH) + 1);
[476] Fix | Delete
[477] Fix | Delete
return $short_path;
[478] Fix | Delete
}
[479] Fix | Delete
[480] Fix | Delete
/**
[481] Fix | Delete
* Make URL to be relative
[482] Fix | Delete
*
[483] Fix | Delete
* NOTE: for subfolder home_url, will keep subfolder part (strip nothing but scheme and host)
[484] Fix | Delete
*
[485] Fix | Delete
* @param string $url
[486] Fix | Delete
* @return string Relative URL, start with /
[487] Fix | Delete
*/
[488] Fix | Delete
public static function make_relative($url)
[489] Fix | Delete
{
[490] Fix | Delete
// replace home_url if the url is full url
[491] Fix | Delete
self::domain_const();
[492] Fix | Delete
if (strpos($url, LSCWP_DOMAIN) === 0) {
[493] Fix | Delete
$url = substr($url, strlen(LSCWP_DOMAIN));
[494] Fix | Delete
}
[495] Fix | Delete
return trim($url);
[496] Fix | Delete
}
[497] Fix | Delete
[498] Fix | Delete
/**
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function