bibhamrokhanpin/wp-content/__plugins/wp-optimize/includes/class-updraft-resmushit-task.php

203 lines
5.6 KiB
PHP
Raw Normal View History

2024-04-10 12:01:06 +00:00
<?php
/**
* A sample implementation using the Resmush.it API and our tasks library
*/
if (!defined('ABSPATH')) die('Access denied.');
if (!class_exists('Updraft_Smush_Task')) require_once('class-updraft-smush-task.php');
if (!class_exists('Re_Smush_It_Task')) :
class Re_Smush_It_Task extends Updraft_Smush_Task {
public $label = 're-smush-it';
const MAX_FILESIZE = 5242880;
const API_URL = 'http://api.resmush.it/';
/**
* Checks if the server is online
*
* @return boolean - true if yes, false otherwise
*/
public static function is_server_online() {
global $wp_version;
$test_image = WPO_PLUGIN_MAIN_PATH . 'images/icon/wpo.png';
$boundary = wp_generate_password(12);
$file_name = basename($test_image);
$body = "--$boundary";
$body .= "\r\n";
$body .= "Content-Disposition: form-data; name=\"files\"; filename=\"$file_name\"\r\n";
$body .= "\r\n";
$body .= file_get_contents($test_image);
$body .= "\r\n";
$body .= "--$boundary";
$request = array(
'headers' => array( "content-type" => "multipart/form-data; boundary=$boundary" ),
'user-agent' => "WordPress $wp_version/WP-Optimize ".WPO_VERSION.' - anonymous', // Anonymous until Resmushit has a clear privacy statement that we can link to
'timeout' => 10,
'body' => $body,
);
$response = wp_remote_post(self::API_URL, $request);
if (is_wp_error($response)) {
update_option(__CLASS__, $response->get_error_message());
return false;
}
$data = json_decode(wp_remote_retrieve_body($response));
if (empty($data)) {
update_option(__CLASS__, "Empty data returned by server");
return false;
}
if (isset($data->error)) {
update_option(__CLASS__, $data->error_long);
return false;
}
return true;
}
/**
* Prepares the image as part of the post data for the specific implementation
*
* @param String $local_file - The image to e optimised
* @param array $options - Eventual options
*/
public function prepare_post_request($local_file, $options) {
global $wp_version;
$boundary = wp_generate_password(12);
$headers = array( "content-type" => "multipart/form-data; boundary=$boundary" );
$lossy = $this->get_option('lossy_compression');
if ($lossy) {
$quality = $this->get_option('image_quality');
} else {
$quality = 100;
}
if (isset($options['quality']) && is_int($options['quality']) && 0 < $options['quality']) $quality = $options['quality'];
$this->log($quality);
$post_fields = array(
'qlty' => $quality,
'exif' => $this->get_option('preserve_exif', false)
);
$payload = '';
$file_name = basename($local_file);
foreach ($post_fields as $name => $value) {
$payload .= "--$boundary";
$payload .= "\r\n";
$payload .= "Content-Disposition: form-data; name='$name' \r\n\r\n $value";
$payload .= "\r\n";
}
$payload .= "--$boundary";
$payload .= "\r\n";
$payload .= "Content-Disposition: form-data; name=\"files\"; filename=\"$file_name\"\r\n";
$payload .= "\r\n";
$payload .= file_get_contents($local_file);
$payload .= "\r\n";
$payload .= "--$boundary";
return array(
'headers' => $headers,
'timeout' => $this->get_option('request_timeout'),
'user-agent' => "WordPress $wp_version/WP-Optimize ".WPO_VERSION.' - anonymous', // Anonymous until Resmushit has a clear privacy statement that we can link to
'body' => $payload,
);
}
/**
* Processes the response recieved from the remote server
*
* @param String $response - The response object
*/
public function process_server_response($response) {
global $http_response_header;
$response = parent::process_server_response($response);
$data = json_decode(wp_remote_retrieve_body($response));
if (!$data) {
$this->log("Cannot establish connection with reSmush.it webservice. Please try later");
return false;
}
if (isset($data->error)) {
$this->fail($data->error, $data->error_long);
return false;
}
if (!property_exists($data, 'dest')) {
$this->fail("invalid_response", "The response does not contain the compressed file URL");
$this->log("data: ".json_encode($data));
return false;
}
$compressed_image_response = wp_remote_get($data->dest);
if (!is_wp_error($compressed_image_response)) {
$image_contents = wp_remote_retrieve_body($compressed_image_response);
if ($this->is_downloaded_image_buffer_mime_type_valid($image_contents)) {
return $image_contents;
} else {
$this->log("The downloaded resource does not have a matching mime type.");
return false;
}
} else {
$this->fail("invalid_response", "The compression apparently succeeded, but WP-Optimize could not retrieve the compressed image from the remote server.");
$this->log("data: ".json_encode($data));
if (!empty($http_response_header) && is_array($http_response_header)) {
$this->log("headers: ".implode("\n", $http_response_header));
}
return false;
}
}
/**
* Retrieve features for this service
*
* @return Array - an array of options
*/
public static function get_features() {
return array(
'max_filesize' => self::MAX_FILESIZE,
'lossy_compression' => false,
'preserve_exif' => true,
);
}
/**
* Retrieve default options for this task type.
*
* @return Array - an array of options
*/
public function get_default_options() {
return array(
'allowed_file_types' => array('gif', 'png', 'jpg', 'tif', 'jpeg'),
'request_timeout' => 30,
'keep_original' => true,
'preserve_exif' => false,
'image_quality' => 98,
'api_endpoint' => self::API_URL,
'max_filesize' => self::MAX_FILESIZE,
'version' => '0.1.13',
'backup_prefix' => '-updraft-pre-smush-original.'
);
}
}
endif;