Edit File by line
/home/zeestwma/ajeebong.../wp-inclu.../Requests/src
File: Requests.php
* If the `$options` parameter is specified, individual requests will
[500] Fix | Delete
* inherit options from it. This can be used to use a single hooking system,
[501] Fix | Delete
* or set all the types to `\WpOrg\Requests\Requests::POST`, for example.
[502] Fix | Delete
*
[503] Fix | Delete
* In addition, the `$options` parameter takes the following global options:
[504] Fix | Delete
*
[505] Fix | Delete
* - `complete`: A callback for when a request is complete. Takes two
[506] Fix | Delete
* parameters, a \WpOrg\Requests\Response/\WpOrg\Requests\Exception reference, and the
[507] Fix | Delete
* ID from the request array (Note: this can also be overridden on a
[508] Fix | Delete
* per-request basis, although that's a little silly)
[509] Fix | Delete
* (callback)
[510] Fix | Delete
*
[511] Fix | Delete
* @param array $requests Requests data (see description for more information)
[512] Fix | Delete
* @param array $options Global and default options (see {@see \WpOrg\Requests\Requests::request()})
[513] Fix | Delete
* @return array Responses (either \WpOrg\Requests\Response or a \WpOrg\Requests\Exception object)
[514] Fix | Delete
*
[515] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $requests argument is not an array or iterable object with array access.
[516] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $options argument is not an array.
[517] Fix | Delete
*/
[518] Fix | Delete
public static function request_multiple($requests, $options = []) {
[519] Fix | Delete
if (InputValidator::has_array_access($requests) === false || InputValidator::is_iterable($requests) === false) {
[520] Fix | Delete
throw InvalidArgument::create(1, '$requests', 'array|ArrayAccess&Traversable', gettype($requests));
[521] Fix | Delete
}
[522] Fix | Delete
[523] Fix | Delete
if (is_array($options) === false) {
[524] Fix | Delete
throw InvalidArgument::create(2, '$options', 'array', gettype($options));
[525] Fix | Delete
}
[526] Fix | Delete
[527] Fix | Delete
$options = array_merge(self::get_default_options(true), $options);
[528] Fix | Delete
[529] Fix | Delete
if (!empty($options['hooks'])) {
[530] Fix | Delete
$options['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']);
[531] Fix | Delete
if (!empty($options['complete'])) {
[532] Fix | Delete
$options['hooks']->register('multiple.request.complete', $options['complete']);
[533] Fix | Delete
}
[534] Fix | Delete
}
[535] Fix | Delete
[536] Fix | Delete
foreach ($requests as $id => &$request) {
[537] Fix | Delete
if (!isset($request['headers'])) {
[538] Fix | Delete
$request['headers'] = [];
[539] Fix | Delete
}
[540] Fix | Delete
[541] Fix | Delete
if (!isset($request['data'])) {
[542] Fix | Delete
$request['data'] = [];
[543] Fix | Delete
}
[544] Fix | Delete
[545] Fix | Delete
if (!isset($request['type'])) {
[546] Fix | Delete
$request['type'] = self::GET;
[547] Fix | Delete
}
[548] Fix | Delete
[549] Fix | Delete
if (!isset($request['options'])) {
[550] Fix | Delete
$request['options'] = $options;
[551] Fix | Delete
$request['options']['type'] = $request['type'];
[552] Fix | Delete
} else {
[553] Fix | Delete
if (empty($request['options']['type'])) {
[554] Fix | Delete
$request['options']['type'] = $request['type'];
[555] Fix | Delete
}
[556] Fix | Delete
[557] Fix | Delete
$request['options'] = array_merge($options, $request['options']);
[558] Fix | Delete
}
[559] Fix | Delete
[560] Fix | Delete
self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']);
[561] Fix | Delete
[562] Fix | Delete
// Ensure we only hook in once
[563] Fix | Delete
if ($request['options']['hooks'] !== $options['hooks']) {
[564] Fix | Delete
$request['options']['hooks']->register('transport.internal.parse_response', [static::class, 'parse_multiple']);
[565] Fix | Delete
if (!empty($request['options']['complete'])) {
[566] Fix | Delete
$request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']);
[567] Fix | Delete
}
[568] Fix | Delete
}
[569] Fix | Delete
}
[570] Fix | Delete
[571] Fix | Delete
unset($request);
[572] Fix | Delete
[573] Fix | Delete
if (!empty($options['transport'])) {
[574] Fix | Delete
$transport = $options['transport'];
[575] Fix | Delete
[576] Fix | Delete
if (is_string($options['transport'])) {
[577] Fix | Delete
$transport = new $transport();
[578] Fix | Delete
}
[579] Fix | Delete
} else {
[580] Fix | Delete
$transport = self::get_transport();
[581] Fix | Delete
}
[582] Fix | Delete
[583] Fix | Delete
$responses = $transport->request_multiple($requests, $options);
[584] Fix | Delete
[585] Fix | Delete
foreach ($responses as $id => &$response) {
[586] Fix | Delete
// If our hook got messed with somehow, ensure we end up with the
[587] Fix | Delete
// correct response
[588] Fix | Delete
if (is_string($response)) {
[589] Fix | Delete
$request = $requests[$id];
[590] Fix | Delete
self::parse_multiple($response, $request);
[591] Fix | Delete
$request['options']['hooks']->dispatch('multiple.request.complete', [&$response, $id]);
[592] Fix | Delete
}
[593] Fix | Delete
}
[594] Fix | Delete
[595] Fix | Delete
return $responses;
[596] Fix | Delete
}
[597] Fix | Delete
[598] Fix | Delete
/**
[599] Fix | Delete
* Get the default options
[600] Fix | Delete
*
[601] Fix | Delete
* @see \WpOrg\Requests\Requests::request() for values returned by this method
[602] Fix | Delete
* @param boolean $multirequest Is this a multirequest?
[603] Fix | Delete
* @return array Default option values
[604] Fix | Delete
*/
[605] Fix | Delete
protected static function get_default_options($multirequest = false) {
[606] Fix | Delete
$defaults = static::OPTION_DEFAULTS;
[607] Fix | Delete
$defaults['verify'] = self::$certificate_path;
[608] Fix | Delete
[609] Fix | Delete
if ($multirequest !== false) {
[610] Fix | Delete
$defaults['complete'] = null;
[611] Fix | Delete
}
[612] Fix | Delete
[613] Fix | Delete
return $defaults;
[614] Fix | Delete
}
[615] Fix | Delete
[616] Fix | Delete
/**
[617] Fix | Delete
* Get default certificate path.
[618] Fix | Delete
*
[619] Fix | Delete
* @return string Default certificate path.
[620] Fix | Delete
*/
[621] Fix | Delete
public static function get_certificate_path() {
[622] Fix | Delete
return self::$certificate_path;
[623] Fix | Delete
}
[624] Fix | Delete
[625] Fix | Delete
/**
[626] Fix | Delete
* Set default certificate path.
[627] Fix | Delete
*
[628] Fix | Delete
* @param string|Stringable|bool $path Certificate path, pointing to a PEM file.
[629] Fix | Delete
*
[630] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed $url argument is not a string, Stringable or boolean.
[631] Fix | Delete
*/
[632] Fix | Delete
public static function set_certificate_path($path) {
[633] Fix | Delete
if (InputValidator::is_string_or_stringable($path) === false && is_bool($path) === false) {
[634] Fix | Delete
throw InvalidArgument::create(1, '$path', 'string|Stringable|bool', gettype($path));
[635] Fix | Delete
}
[636] Fix | Delete
[637] Fix | Delete
self::$certificate_path = $path;
[638] Fix | Delete
}
[639] Fix | Delete
[640] Fix | Delete
/**
[641] Fix | Delete
* Set the default values
[642] Fix | Delete
*
[643] Fix | Delete
* The $options parameter is updated with the results.
[644] Fix | Delete
*
[645] Fix | Delete
* @param string $url URL to request
[646] Fix | Delete
* @param array $headers Extra headers to send with the request
[647] Fix | Delete
* @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
[648] Fix | Delete
* @param string $type HTTP request type
[649] Fix | Delete
* @param array $options Options for the request
[650] Fix | Delete
* @return void
[651] Fix | Delete
*
[652] Fix | Delete
* @throws \WpOrg\Requests\Exception When the $url is not an http(s) URL.
[653] Fix | Delete
*/
[654] Fix | Delete
protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) {
[655] Fix | Delete
if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) {
[656] Fix | Delete
throw new Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url);
[657] Fix | Delete
}
[658] Fix | Delete
[659] Fix | Delete
if (empty($options['hooks'])) {
[660] Fix | Delete
$options['hooks'] = new Hooks();
[661] Fix | Delete
}
[662] Fix | Delete
[663] Fix | Delete
if (is_array($options['auth'])) {
[664] Fix | Delete
$options['auth'] = new Basic($options['auth']);
[665] Fix | Delete
}
[666] Fix | Delete
[667] Fix | Delete
if ($options['auth'] !== false) {
[668] Fix | Delete
$options['auth']->register($options['hooks']);
[669] Fix | Delete
}
[670] Fix | Delete
[671] Fix | Delete
if (is_string($options['proxy']) || is_array($options['proxy'])) {
[672] Fix | Delete
$options['proxy'] = new Http($options['proxy']);
[673] Fix | Delete
}
[674] Fix | Delete
[675] Fix | Delete
if ($options['proxy'] !== false) {
[676] Fix | Delete
$options['proxy']->register($options['hooks']);
[677] Fix | Delete
}
[678] Fix | Delete
[679] Fix | Delete
if (is_array($options['cookies'])) {
[680] Fix | Delete
$options['cookies'] = new Jar($options['cookies']);
[681] Fix | Delete
} elseif (empty($options['cookies'])) {
[682] Fix | Delete
$options['cookies'] = new Jar();
[683] Fix | Delete
}
[684] Fix | Delete
[685] Fix | Delete
if ($options['cookies'] !== false) {
[686] Fix | Delete
$options['cookies']->register($options['hooks']);
[687] Fix | Delete
}
[688] Fix | Delete
[689] Fix | Delete
if ($options['idn'] !== false) {
[690] Fix | Delete
$iri = new Iri($url);
[691] Fix | Delete
$iri->host = IdnaEncoder::encode($iri->ihost);
[692] Fix | Delete
$url = $iri->uri;
[693] Fix | Delete
}
[694] Fix | Delete
[695] Fix | Delete
// Massage the type to ensure we support it.
[696] Fix | Delete
$type = strtoupper($type);
[697] Fix | Delete
[698] Fix | Delete
if (!isset($options['data_format'])) {
[699] Fix | Delete
if (in_array($type, [self::HEAD, self::GET, self::DELETE], true)) {
[700] Fix | Delete
$options['data_format'] = 'query';
[701] Fix | Delete
} else {
[702] Fix | Delete
$options['data_format'] = 'body';
[703] Fix | Delete
}
[704] Fix | Delete
}
[705] Fix | Delete
}
[706] Fix | Delete
[707] Fix | Delete
/**
[708] Fix | Delete
* HTTP response parser
[709] Fix | Delete
*
[710] Fix | Delete
* @param string $headers Full response text including headers and body
[711] Fix | Delete
* @param string $url Original request URL
[712] Fix | Delete
* @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects
[713] Fix | Delete
* @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects
[714] Fix | Delete
* @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects
[715] Fix | Delete
* @return \WpOrg\Requests\Response
[716] Fix | Delete
*
[717] Fix | Delete
* @throws \WpOrg\Requests\Exception On missing head/body separator (`requests.no_crlf_separator`)
[718] Fix | Delete
* @throws \WpOrg\Requests\Exception On missing head/body separator (`noversion`)
[719] Fix | Delete
* @throws \WpOrg\Requests\Exception On missing head/body separator (`toomanyredirects`)
[720] Fix | Delete
*/
[721] Fix | Delete
protected static function parse_response($headers, $url, $req_headers, $req_data, $options) {
[722] Fix | Delete
$return = new Response();
[723] Fix | Delete
if (!$options['blocking']) {
[724] Fix | Delete
return $return;
[725] Fix | Delete
}
[726] Fix | Delete
[727] Fix | Delete
$return->raw = $headers;
[728] Fix | Delete
$return->url = (string) $url;
[729] Fix | Delete
$return->body = '';
[730] Fix | Delete
[731] Fix | Delete
if (!$options['filename']) {
[732] Fix | Delete
$pos = strpos($headers, "\r\n\r\n");
[733] Fix | Delete
if ($pos === false) {
[734] Fix | Delete
// Crap!
[735] Fix | Delete
throw new Exception('Missing header/body separator', 'requests.no_crlf_separator');
[736] Fix | Delete
}
[737] Fix | Delete
[738] Fix | Delete
$headers = substr($return->raw, 0, $pos);
[739] Fix | Delete
// Headers will always be separated from the body by two new lines - `\n\r\n\r`.
[740] Fix | Delete
$body = substr($return->raw, $pos + 4);
[741] Fix | Delete
if (!empty($body)) {
[742] Fix | Delete
$return->body = $body;
[743] Fix | Delete
}
[744] Fix | Delete
}
[745] Fix | Delete
[746] Fix | Delete
// Pretend CRLF = LF for compatibility (RFC 2616, section 19.3)
[747] Fix | Delete
$headers = str_replace("\r\n", "\n", $headers);
[748] Fix | Delete
// Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2)
[749] Fix | Delete
$headers = preg_replace('/\n[ \t]/', ' ', $headers);
[750] Fix | Delete
$headers = explode("\n", $headers);
[751] Fix | Delete
preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches);
[752] Fix | Delete
if (empty($matches)) {
[753] Fix | Delete
throw new Exception('Response could not be parsed', 'noversion', $headers);
[754] Fix | Delete
}
[755] Fix | Delete
[756] Fix | Delete
$return->protocol_version = (float) $matches[1];
[757] Fix | Delete
$return->status_code = (int) $matches[2];
[758] Fix | Delete
if ($return->status_code >= 200 && $return->status_code < 300) {
[759] Fix | Delete
$return->success = true;
[760] Fix | Delete
}
[761] Fix | Delete
[762] Fix | Delete
foreach ($headers as $header) {
[763] Fix | Delete
list($key, $value) = explode(':', $header, 2);
[764] Fix | Delete
$value = trim($value);
[765] Fix | Delete
preg_replace('#(\s+)#i', ' ', $value);
[766] Fix | Delete
$return->headers[$key] = $value;
[767] Fix | Delete
}
[768] Fix | Delete
[769] Fix | Delete
if (isset($return->headers['transfer-encoding'])) {
[770] Fix | Delete
$return->body = self::decode_chunked($return->body);
[771] Fix | Delete
unset($return->headers['transfer-encoding']);
[772] Fix | Delete
}
[773] Fix | Delete
[774] Fix | Delete
if (isset($return->headers['content-encoding'])) {
[775] Fix | Delete
$return->body = self::decompress($return->body);
[776] Fix | Delete
}
[777] Fix | Delete
[778] Fix | Delete
//fsockopen and cURL compatibility
[779] Fix | Delete
if (isset($return->headers['connection'])) {
[780] Fix | Delete
unset($return->headers['connection']);
[781] Fix | Delete
}
[782] Fix | Delete
[783] Fix | Delete
$options['hooks']->dispatch('requests.before_redirect_check', [&$return, $req_headers, $req_data, $options]);
[784] Fix | Delete
[785] Fix | Delete
if ($return->is_redirect() && $options['follow_redirects'] === true) {
[786] Fix | Delete
if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) {
[787] Fix | Delete
if ($return->status_code === 303) {
[788] Fix | Delete
$options['type'] = self::GET;
[789] Fix | Delete
}
[790] Fix | Delete
[791] Fix | Delete
$options['redirected']++;
[792] Fix | Delete
$location = $return->headers['location'];
[793] Fix | Delete
if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) {
[794] Fix | Delete
// relative redirect, for compatibility make it absolute
[795] Fix | Delete
$location = Iri::absolutize($url, $location);
[796] Fix | Delete
$location = $location->uri;
[797] Fix | Delete
}
[798] Fix | Delete
[799] Fix | Delete
$hook_args = [
[800] Fix | Delete
&$location,
[801] Fix | Delete
&$req_headers,
[802] Fix | Delete
&$req_data,
[803] Fix | Delete
&$options,
[804] Fix | Delete
$return,
[805] Fix | Delete
];
[806] Fix | Delete
$options['hooks']->dispatch('requests.before_redirect', $hook_args);
[807] Fix | Delete
$redirected = self::request($location, $req_headers, $req_data, $options['type'], $options);
[808] Fix | Delete
$redirected->history[] = $return;
[809] Fix | Delete
return $redirected;
[810] Fix | Delete
} elseif ($options['redirected'] >= $options['redirects']) {
[811] Fix | Delete
throw new Exception('Too many redirects', 'toomanyredirects', $return);
[812] Fix | Delete
}
[813] Fix | Delete
}
[814] Fix | Delete
[815] Fix | Delete
$return->redirects = $options['redirected'];
[816] Fix | Delete
[817] Fix | Delete
$options['hooks']->dispatch('requests.after_request', [&$return, $req_headers, $req_data, $options]);
[818] Fix | Delete
return $return;
[819] Fix | Delete
}
[820] Fix | Delete
[821] Fix | Delete
/**
[822] Fix | Delete
* Callback for `transport.internal.parse_response`
[823] Fix | Delete
*
[824] Fix | Delete
* Internal use only. Converts a raw HTTP response to a \WpOrg\Requests\Response
[825] Fix | Delete
* while still executing a multiple request.
[826] Fix | Delete
*
[827] Fix | Delete
* `$response` is either set to a \WpOrg\Requests\Response instance, or a \WpOrg\Requests\Exception object
[828] Fix | Delete
*
[829] Fix | Delete
* @param string $response Full response text including headers and body (will be overwritten with Response instance)
[830] Fix | Delete
* @param array $request Request data as passed into {@see \WpOrg\Requests\Requests::request_multiple()}
[831] Fix | Delete
* @return void
[832] Fix | Delete
*/
[833] Fix | Delete
public static function parse_multiple(&$response, $request) {
[834] Fix | Delete
try {
[835] Fix | Delete
$url = $request['url'];
[836] Fix | Delete
$headers = $request['headers'];
[837] Fix | Delete
$data = $request['data'];
[838] Fix | Delete
$options = $request['options'];
[839] Fix | Delete
$response = self::parse_response($response, $url, $headers, $data, $options);
[840] Fix | Delete
} catch (Exception $e) {
[841] Fix | Delete
$response = $e;
[842] Fix | Delete
}
[843] Fix | Delete
}
[844] Fix | Delete
[845] Fix | Delete
/**
[846] Fix | Delete
* Decoded a chunked body as per RFC 2616
[847] Fix | Delete
*
[848] Fix | Delete
* @link https://tools.ietf.org/html/rfc2616#section-3.6.1
[849] Fix | Delete
* @param string $data Chunked body
[850] Fix | Delete
* @return string Decoded body
[851] Fix | Delete
*/
[852] Fix | Delete
protected static function decode_chunked($data) {
[853] Fix | Delete
if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) {
[854] Fix | Delete
return $data;
[855] Fix | Delete
}
[856] Fix | Delete
[857] Fix | Delete
$decoded = '';
[858] Fix | Delete
$encoded = $data;
[859] Fix | Delete
[860] Fix | Delete
while (true) {
[861] Fix | Delete
$is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches);
[862] Fix | Delete
if (!$is_chunked) {
[863] Fix | Delete
// Looks like it's not chunked after all
[864] Fix | Delete
return $data;
[865] Fix | Delete
}
[866] Fix | Delete
[867] Fix | Delete
$length = hexdec(trim($matches[1]));
[868] Fix | Delete
if ($length === 0) {
[869] Fix | Delete
// Ignore trailer headers
[870] Fix | Delete
return $decoded;
[871] Fix | Delete
}
[872] Fix | Delete
[873] Fix | Delete
$chunk_length = strlen($matches[0]);
[874] Fix | Delete
$decoded .= substr($encoded, $chunk_length, $length);
[875] Fix | Delete
$encoded = substr($encoded, $chunk_length + $length + 2);
[876] Fix | Delete
[877] Fix | Delete
if (trim($encoded) === '0' || empty($encoded)) {
[878] Fix | Delete
return $decoded;
[879] Fix | Delete
}
[880] Fix | Delete
}
[881] Fix | Delete
[882] Fix | Delete
// We'll never actually get down here
[883] Fix | Delete
// @codeCoverageIgnoreStart
[884] Fix | Delete
}
[885] Fix | Delete
// @codeCoverageIgnoreEnd
[886] Fix | Delete
[887] Fix | Delete
/**
[888] Fix | Delete
* Convert a key => value array to a 'key: value' array for headers
[889] Fix | Delete
*
[890] Fix | Delete
* @param iterable $dictionary Dictionary of header values
[891] Fix | Delete
* @return array List of headers
[892] Fix | Delete
*
[893] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not iterable.
[894] Fix | Delete
*/
[895] Fix | Delete
public static function flatten($dictionary) {
[896] Fix | Delete
if (InputValidator::is_iterable($dictionary) === false) {
[897] Fix | Delete
throw InvalidArgument::create(1, '$dictionary', 'iterable', gettype($dictionary));
[898] Fix | Delete
}
[899] Fix | Delete
[900] Fix | Delete
$return = [];
[901] Fix | Delete
foreach ($dictionary as $key => $value) {
[902] Fix | Delete
$return[] = sprintf('%s: %s', $key, $value);
[903] Fix | Delete
}
[904] Fix | Delete
[905] Fix | Delete
return $return;
[906] Fix | Delete
}
[907] Fix | Delete
[908] Fix | Delete
/**
[909] Fix | Delete
* Decompress an encoded body
[910] Fix | Delete
*
[911] Fix | Delete
* Implements gzip, compress and deflate. Guesses which it is by attempting
[912] Fix | Delete
* to decode.
[913] Fix | Delete
*
[914] Fix | Delete
* @param string $data Compressed data in one of the above formats
[915] Fix | Delete
* @return string Decompressed string
[916] Fix | Delete
*
[917] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string.
[918] Fix | Delete
*/
[919] Fix | Delete
public static function decompress($data) {
[920] Fix | Delete
if (is_string($data) === false) {
[921] Fix | Delete
throw InvalidArgument::create(1, '$data', 'string', gettype($data));
[922] Fix | Delete
}
[923] Fix | Delete
[924] Fix | Delete
if (trim($data) === '') {
[925] Fix | Delete
// Empty body does not need further processing.
[926] Fix | Delete
return $data;
[927] Fix | Delete
}
[928] Fix | Delete
[929] Fix | Delete
$marker = substr($data, 0, 2);
[930] Fix | Delete
if (!isset(self::$magic_compression_headers[$marker])) {
[931] Fix | Delete
// Not actually compressed. Probably cURL ruining this for us.
[932] Fix | Delete
return $data;
[933] Fix | Delete
}
[934] Fix | Delete
[935] Fix | Delete
if (function_exists('gzdecode')) {
[936] Fix | Delete
$decoded = @gzdecode($data);
[937] Fix | Delete
if ($decoded !== false) {
[938] Fix | Delete
return $decoded;
[939] Fix | Delete
}
[940] Fix | Delete
}
[941] Fix | Delete
[942] Fix | Delete
if (function_exists('gzinflate')) {
[943] Fix | Delete
$decoded = @gzinflate($data);
[944] Fix | Delete
if ($decoded !== false) {
[945] Fix | Delete
return $decoded;
[946] Fix | Delete
}
[947] Fix | Delete
}
[948] Fix | Delete
[949] Fix | Delete
$decoded = self::compatible_gzinflate($data);
[950] Fix | Delete
if ($decoded !== false) {
[951] Fix | Delete
return $decoded;
[952] Fix | Delete
}
[953] Fix | Delete
[954] Fix | Delete
if (function_exists('gzuncompress')) {
[955] Fix | Delete
$decoded = @gzuncompress($data);
[956] Fix | Delete
if ($decoded !== false) {
[957] Fix | Delete
return $decoded;
[958] Fix | Delete
}
[959] Fix | Delete
}
[960] Fix | Delete
[961] Fix | Delete
return $data;
[962] Fix | Delete
}
[963] Fix | Delete
[964] Fix | Delete
/**
[965] Fix | Delete
* Decompression of deflated string while staying compatible with the majority of servers.
[966] Fix | Delete
*
[967] Fix | Delete
* Certain Servers will return deflated data with headers which PHP's gzinflate()
[968] Fix | Delete
* function cannot handle out of the box. The following function has been created from
[969] Fix | Delete
* various snippets on the gzinflate() PHP documentation.
[970] Fix | Delete
*
[971] Fix | Delete
* Warning: Magic numbers within. Due to the potential different formats that the compressed
[972] Fix | Delete
* data may be returned in, some "magic offsets" are needed to ensure proper decompression
[973] Fix | Delete
* takes place. For a simple progmatic way to determine the magic offset in use, see:
[974] Fix | Delete
* https://core.trac.wordpress.org/ticket/18273
[975] Fix | Delete
*
[976] Fix | Delete
* @since 1.6.0
[977] Fix | Delete
* @link https://core.trac.wordpress.org/ticket/18273
[978] Fix | Delete
* @link https://www.php.net/gzinflate#70875
[979] Fix | Delete
* @link https://www.php.net/gzinflate#77336
[980] Fix | Delete
*
[981] Fix | Delete
* @param string $gz_data String to decompress.
[982] Fix | Delete
* @return string|bool False on failure.
[983] Fix | Delete
*
[984] Fix | Delete
* @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not a string.
[985] Fix | Delete
*/
[986] Fix | Delete
public static function compatible_gzinflate($gz_data) {
[987] Fix | Delete
if (is_string($gz_data) === false) {
[988] Fix | Delete
throw InvalidArgument::create(1, '$gz_data', 'string', gettype($gz_data));
[989] Fix | Delete
}
[990] Fix | Delete
[991] Fix | Delete
if (trim($gz_data) === '') {
[992] Fix | Delete
return false;
[993] Fix | Delete
}
[994] Fix | Delete
[995] Fix | Delete
// Compressed data might contain a full zlib header, if so strip it for
[996] Fix | Delete
// gzinflate()
[997] Fix | Delete
if (substr($gz_data, 0, 3) === "\x1f\x8b\x08") {
[998] Fix | Delete
$i = 10;
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function