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;