| 1 |
<?php |
| 2 |
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly |
| 3 |
abstract class DeepLApi extends DeepLData { |
| 4 |
protected $endPoint = ''; |
| 5 |
protected $http_mode = ''; |
| 6 |
private $endPointURL = false; |
| 7 |
protected $authKey = ''; |
| 8 |
protected $log = false; |
| 9 |
protected $headers = array(); |
| 10 |
|
| 11 |
public $languages; |
| 12 |
public $doing_cron; |
| 13 |
public $instance; |
| 14 |
public $result; |
| 15 |
public $why_no_cache; |
| 16 |
public $final_request; |
| 17 |
public $format; |
| 18 |
|
| 19 |
protected $cache_dir = false; |
| 20 |
|
| 21 |
protected $request = array(); |
| 22 |
protected $uniqid = false; |
| 23 |
protected $cache_file = false; |
| 24 |
protected $response = false; |
| 25 |
public $cache_prefix = false; |
| 26 |
protected $cache_id = false; |
| 27 |
|
| 28 |
public $allow_cache = true; |
| 29 |
public $response_type = 'fresh'; |
| 30 |
public $request_cache_file = ''; |
| 31 |
public $response_cache_file = ''; |
| 32 |
|
| 33 |
public $start_microtime = 0; |
| 34 |
public $end_microtime = 0; |
| 35 |
public $request_microtime = 0; |
| 36 |
|
| 37 |
const TIMEOUT = 15; |
| 38 |
|
| 39 |
public function __construct( $languages = array(), $log = false ) { |
| 40 |
$this->authKey = DeepLConfiguration::getAPIKey(); |
| 41 |
//$this->request['auth_key'] = $auth_key; |
| 42 |
$this->log = $log; |
| 43 |
|
| 44 |
$this->languages = DeepLConfiguration::DefaultsAllLanguages(); |
| 45 |
|
| 46 |
if ( defined( 'DOING_CRON' ) && DOING_CRON ) { |
| 47 |
$this->doing_cron = true; |
| 48 |
} |
| 49 |
else { |
| 50 |
$this->doing_cron = false; |
| 51 |
} |
| 52 |
|
| 53 |
$this->instance = $this; |
| 54 |
|
| 55 |
$this->cache_dir = $this->getCacheDirectory(); |
| 56 |
} |
| 57 |
|
| 58 |
public function allowCache( $allow_cache ) { |
| 59 |
$this->allow_cache = filter_var( $allow_cache, FILTER_VALIDATE_BOOLEAN ); |
| 60 |
} |
| 61 |
|
| 62 |
public function wasItCached() { |
| 63 |
return $this->response_type === 'cache'; |
| 64 |
} |
| 65 |
|
| 66 |
public function getTimeElapsed() { |
| 67 |
return $this->request_microtime; |
| 68 |
} |
| 69 |
|
| 70 |
abstract public function buildBody( $mode, $endPoint ); |
| 71 |
|
| 72 |
public function getRequestUniqueID() { |
| 73 |
if ( $this->cache_id ) { |
| 74 |
$this->uniqid = $this->cache_id; |
| 75 |
} |
| 76 |
elseif ( !$this->uniqid ) { |
| 77 |
$this->uniqid = microtime(); |
| 78 |
} |
| 79 |
return $this->uniqid; |
| 80 |
} |
| 81 |
|
| 82 |
public function isValidRequest() { |
| 83 |
return true; |
| 84 |
} |
| 85 |
|
| 86 |
/* |
| 87 |
protected function maybeLimitRequestSize() { |
| 88 |
} |
| 89 |
*/ |
| 90 |
protected function saveRequest() { |
| 91 |
if ( isset( $this->request_cache_file ) ) { |
| 92 |
file_put_contents( $this->request_cache_file, json_encode( $this->final_request ) ); |
| 93 |
} |
| 94 |
} |
| 95 |
|
| 96 |
protected function addHeaders( $headers ) { |
| 97 |
return $headers; |
| 98 |
} |
| 99 |
|
| 100 |
protected function doRequest( $mode = false ) { |
| 101 |
if( !$mode ) |
| 102 |
$mode = $this->http_mode; |
| 103 |
|
| 104 |
|
| 105 |
if ( $mode == 'GET' ) { |
| 106 |
$response = $this->doGETRequest(); |
| 107 |
} |
| 108 |
elseif( $mode == 'DELETE' ) { |
| 109 |
$response = $this->doGETRequest( 'DELETE' ); |
| 110 |
} |
| 111 |
elseif( $mode == 'PUT' ) { |
| 112 |
$response = $this->doGETRequest( 'PUT' ); |
| 113 |
} |
| 114 |
else { |
| 115 |
$response = $this->doPOSTRequest(); |
| 116 |
} |
| 117 |
|
| 118 |
return $response; |
| 119 |
} |
| 120 |
|
| 121 |
static function getInstance() { |
| 122 |
return self::instance; |
| 123 |
} |
| 124 |
|
| 125 |
protected function setCacheID( $idstring ) { |
| 126 |
$this->cache_id = $idstring; |
| 127 |
} |
| 128 |
|
| 129 |
public function setCachePrefix( $prefix = '' ) { |
| 130 |
if ( !empty( $prefix ) ) { |
| 131 |
$this->cache_prefix = $prefix; |
| 132 |
} |
| 133 |
else { |
| 134 |
$this->cache_prefix = ''; |
| 135 |
} |
| 136 |
} |
| 137 |
|
| 138 |
public function getCacheFile( $type ) { |
| 139 |
if ( $type == 'response' ) { |
| 140 |
return $this->response_cache_file; |
| 141 |
} |
| 142 |
elseif ( $type == 'request' ) { |
| 143 |
return $this->request_cache_file; |
| 144 |
} |
| 145 |
} |
| 146 |
|
| 147 |
public function setCacheNames() { |
| 148 |
$cache_name = ''; |
| 149 |
if ( !empty( $this->cache_prefix ) ) { |
| 150 |
$cache_name .= $this->cache_prefix .'-'; |
| 151 |
} |
| 152 |
$cache_name .= $this->cache_id; |
| 153 |
$this->request_cache_file = trailingslashit( $this->cache_dir ) . $cache_name . '-request'; |
| 154 |
$this->response_cache_file = trailingslashit( $this->cache_dir ) . $cache_name . '-response'; |
| 155 |
} |
| 156 |
|
| 157 |
public function request() { |
| 158 |
|
| 159 |
$log_bits = array('class' => get_class($this)); |
| 160 |
|
| 161 |
if ( $this->allow_cache ) |
| 162 |
$this->uniqid = $this->getRequestUniqueID(); |
| 163 |
|
| 164 |
$log_bits['uniqid'] = $this->uniqid; |
| 165 |
|
| 166 |
$this->setCacheNames(); |
| 167 |
$this->result = false; |
| 168 |
|
| 169 |
|
| 170 |
|
| 171 |
if ( $this->isCacheValid( $this->response_cache_file ) ) { |
| 172 |
$this->response_type = 'cache'; |
| 173 |
$this->why_no_cache = false; |
| 174 |
$this->result = file_get_contents( $this->response_cache_file ); |
| 175 |
$log_bits['type'] = 'cached'; |
| 176 |
|
| 177 |
} |
| 178 |
else { |
| 179 |
$log_bits['type'] = 'fresh'; |
| 180 |
$log_bits['mode'] = $this->http_mode; |
| 181 |
$this->start_microtime = microtime( true ); |
| 182 |
//echo "\nIS FRESH"; |
| 183 |
$this->response_type = 'fresh'; |
| 184 |
|
| 185 |
|
| 186 |
if ( $this->http_mode == 'GET' ) { |
| 187 |
$response = $this->doRequest( 'GET' ); |
| 188 |
} |
| 189 |
else { |
| 190 |
$response = $this->doRequest( 'POST' ); |
| 191 |
} |
| 192 |
|
| 193 |
|
| 194 |
$this->end_microtime = microtime( true ); |
| 195 |
$this->request_microtime = $this->end_microtime - $this->start_microtime; |
| 196 |
|
| 197 |
if ( is_wp_error( $response ) ) { |
| 198 |
return $response->get_error_message(); |
| 199 |
} |
| 200 |
|
| 201 |
if ( $response['response']['code'] > 299 ) { |
| 202 |
$log_bits['response_error'] = $response['response']['code']; |
| 203 |
$log_bits['response'] = $response['response']; |
| 204 |
if ( $response['response']['code'] == 429 ) { |
| 205 |
$log_bits['error_cause'] = 'Excessive request size'; |
| 206 |
} |
| 207 |
if ( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation"); |
| 208 |
|
| 209 |
$body = json_decode( $response['body'], true ); |
| 210 |
$message = isset( $body['message'] ) ? $body['message'] : false; |
| 211 |
return new WP_Error( $message ); |
| 212 |
} |
| 213 |
|
| 214 |
if ( array_key_exists( 'body', $response ) && strlen( $response['body'] ) ) |
| 215 |
$this->result = $response['body']; |
| 216 |
else |
| 217 |
$this->result = false; |
| 218 |
|
| 219 |
if ( $this->result ) { |
| 220 |
//echo " putting " . strlen( serialize( $this->result ) ) ." in " |
| 221 |
try { |
| 222 |
file_put_contents( $this->response_cache_file, $this->result ); |
| 223 |
} catch (Exception $e) { |
| 224 |
|
| 225 |
} |
| 226 |
} |
| 227 |
|
| 228 |
$log_bits['request_microtime'] = $this->request_microtime; |
| 229 |
} |
| 230 |
|
| 231 |
if ( DeepLConfiguration::getLogLevel() ) { |
| 232 |
if ( DeepLConfiguration::getLogLevel() > 1 ) { |
| 233 |
foreach( $this->request as $key => $value ) { |
| 234 |
if( is_string( $value ) && strlen( $value ) > 500 ) |
| 235 |
$log_bits['args'][$key] = "LEN=" . strlen( $value) .", string = " . substr( $value, 0, 100 ); |
| 236 |
else |
| 237 |
$log_bits['args'][$key] = $value; |
| 238 |
|
| 239 |
} |
| 240 |
} |
| 241 |
else { |
| 242 |
foreach ( array ('source_lang', 'target_lang') as $key ) { |
| 243 |
if ( isset( $this->request[$key] ) ) { |
| 244 |
$log_bits[$key] = $this->request[$key]; |
| 245 |
} |
| 246 |
} |
| 247 |
} |
| 248 |
if ( isset( $this->request['text'] ) ) { |
| 249 |
$text_size = 0; |
| 250 |
foreach ( $this->request['text'] as $i => $string ) { |
| 251 |
$text_size += strlen($string); |
| 252 |
} |
| 253 |
$log_bits['text_size'] = $text_size; |
| 254 |
} |
| 255 |
} |
| 256 |
|
| 257 |
if ($this->response_type == 'fresh') { |
| 258 |
// test if JSON |
| 259 |
json_decode($this->result); |
| 260 |
if (json_last_error() == JSON_ERROR_NONE) { |
| 261 |
$log_bits['response'] = json_decode($this->result, 1 ); |
| 262 |
if ( DeepLConfiguration::getLogLevel() ) { |
| 263 |
if (isset( $log_bits['response']['translations'] ) ) { |
| 264 |
$translated_text_size = 0; |
| 265 |
foreach ( $log_bits['response']['translations'] as $i => $translation ) { |
| 266 |
$translated_text_size += strlen( $translation['text'] ); |
| 267 |
} |
| 268 |
$log_bits['translated_text_size'] = $translated_text_size; |
| 269 |
} |
| 270 |
} |
| 271 |
} |
| 272 |
else { |
| 273 |
$log_bits['response'] = $this->result; |
| 274 |
} |
| 275 |
|
| 276 |
} |
| 277 |
else { |
| 278 |
$log_bits['response'] = '--hidden response because cached request--'; |
| 279 |
|
| 280 |
} |
| 281 |
$log_bits['response_length'] = strlen($this->result); |
| 282 |
|
| 283 |
//plouf( $this ); die('erorkez'); |
| 284 |
|
| 285 |
if ( $this->result ) { |
| 286 |
$this->result = json_decode( $this->result ); |
| 287 |
|
| 288 |
$this->result = ( array ) $this->result; |
| 289 |
$this->result['response_type'] = $this->response_type; |
| 290 |
if ( $this->why_no_cache ) { |
| 291 |
$log_bits['why_no_cache'] = $this->why_no_cache; |
| 292 |
$this->result['why_no_cache'] = $this->why_no_cache; |
| 293 |
} |
| 294 |
if ( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation"); |
| 295 |
return $this->result; |
| 296 |
} |
| 297 |
else { |
| 298 |
if ( DeepLConfiguration::getLogLevel() ) wpdeepl_log($log_bits, "operation"); |
| 299 |
return $this->response['response']['message']; |
| 300 |
} |
| 301 |
} |
| 302 |
|
| 303 |
public function getRequestTime( $result_in_milliseconds = false ) { |
| 304 |
if ( !$this->request_microtime ) { |
| 305 |
return false; |
| 306 |
} |
| 307 |
|
| 308 |
if ( $result_in_milliseconds ) { |
| 309 |
return floatval( $this->request_microtime ); |
| 310 |
} |
| 311 |
else { |
| 312 |
return floatval( $this->request_microtime/1000 ); |
| 313 |
} |
| 314 |
} |
| 315 |
|
| 316 |
public function getEndPointURL( $add_auth_key = false ) { |
| 317 |
|
| 318 |
|
| 319 |
$APIServer = DeepLConfiguration::getAPIServer(); |
| 320 |
if ( !$this->endPointURL ) { |
| 321 |
if ( $this->endPoint === '' ) { |
| 322 |
$this->endPointURL = $APIServer; |
| 323 |
} |
| 324 |
else { |
| 325 |
$this->endPointURL = trailingslashit( $APIServer ) . $this->endPoint; |
| 326 |
} |
| 327 |
} |
| 328 |
|
| 329 |
if ( $add_auth_key ) { |
| 330 |
$this->endPointURL .= '?auth_key=' . $this->authKey; |
| 331 |
} |
| 332 |
|
| 333 |
return $this->endPointURL; |
| 334 |
} |
| 335 |
/* |
| 336 |
* send a POST request |
| 337 |
* |
| 338 |
* @since 0.1 |
| 339 |
*/ |
| 340 |
public function doPOSTRequest( $args = array() ) { |
| 341 |
|
| 342 |
|
| 343 |
$args = array( |
| 344 |
'method' => 'POST', |
| 345 |
'timeout' => self::TIMEOUT, |
| 346 |
); |
| 347 |
|
| 348 |
$args['headers'] = array( |
| 349 |
'Authorization' => 'DeepL-Auth-Key ' . $this->authKey |
| 350 |
); |
| 351 |
|
| 352 |
$args['headers'] = $this->addHeaders( $args['headers'] ); |
| 353 |
$args['body'] = $this->buildBody( 'POST', $this->endPoint ); |
| 354 |
|
| 355 |
//wpdeepl_debug_display( $args ,__METHOD__ . "args"); |
| 356 |
|
| 357 |
/* |
| 358 |
$args['auth_key'] = $this->authKey; |
| 359 |
|
| 360 |
$request = array(); |
| 361 |
if ( $this->request ) { |
| 362 |
foreach ( $this->request as $key => $value ) { |
| 363 |
$request[$key] = $value; |
| 364 |
} |
| 365 |
} |
| 366 |
$args['query'] = http_build_query( $request ); |
| 367 |
$args['timeout'] = |
| 368 |
*/ |
| 369 |
//$args['headers']['Content-Type'] = 'application/x-www-form-urlencoded'; |
| 370 |
// $this->headers['Content-Length'] = strlen( $this->request['text'] ); |
| 371 |
|
| 372 |
|
| 373 |
|
| 374 |
$add_auth_key = false; |
| 375 |
$remoteURL = $this->getEndPointURL( $add_auth_key ); |
| 376 |
|
| 377 |
$bits = array_merge( array( $remoteURL, 'POST' ), $args ); |
| 378 |
// unsafe |
| 379 |
//wpdeepl_log( $bits, 'apiRequests'); |
| 380 |
// wpdeepl_debug_display( $args, "args" ); |
| 381 |
/* |
| 382 |
$exec = "curl -X POST '$remoteURL' \\\n"; |
| 383 |
foreach( $args['headers'] as $key => $value ) { |
| 384 |
$exec .= "-H '$key: $value' \\\n"; |
| 385 |
} |
| 386 |
foreach( $args['body'] as $key => $value ) { |
| 387 |
$exec .= "-d '$value' \\\n"; |
| 388 |
} |
| 389 |
|
| 390 |
wpdeepl_debug_display( $exec ); |
| 391 |
$response = exec ( $exec ); |
| 392 |
wpdeepl_debug_display( $response ); |
| 393 |
die('okaz4a6e4a68e4a86e'); |
| 394 |
*/ |
| 395 |
|
| 396 |
//wpdeepl_debug_display( $args, $remoteURL ); die('68z4e6z48a68ee8aok'); |
| 397 |
|
| 398 |
//$args['body'] = str_replace('target_lang=NO', 'target_lang=NB', $args['body'] ); |
| 399 |
$response = wp_remote_post( $remoteURL, $args ); |
| 400 |
//wpdeepl_debug_display( $args, $remoteURL, " post request"); wpdeepl_debug_display( $response ); die('okesoezporjkezor'); |
| 401 |
|
| 402 |
// wpdeepl_debug_display( $args, " args pour $remoteURL" ); wpdeepl_debug_display( $response, "zeirjzpeijrpizerjpirj" ); die('okaze6aze44e'); |
| 403 |
//wpdeepl_debug_display( $args, "args"); |
| 404 |
|
| 405 |
// wpdeepl_debug_display( $args, "POST request to $remoteURL ");die('okaz5ea5zea4e'); |
| 406 |
|
| 407 |
if ( is_wp_error( $response ) ) { |
| 408 |
$this->response = $response->get_error_message(); |
| 409 |
wpdeepl_debug_display( $args, $this->getEndPointURL() ); |
| 410 |
die( __METHOD__ ); |
| 411 |
} |
| 412 |
else { |
| 413 |
$this->response = $response; |
| 414 |
} |
| 415 |
return $response; |
| 416 |
} |
| 417 |
|
| 418 |
/* |
| 419 |
* send a GET request |
| 420 |
* |
| 421 |
* @since 0.1 |
| 422 |
*/ |
| 423 |
public function doGETRequest( $alt_mode = false ) { |
| 424 |
|
| 425 |
$method = 'GET'; |
| 426 |
if( in_array( $alt_mode, array('PUT', 'DELETE' ) ) ) |
| 427 |
$method = $alt_mode; |
| 428 |
$args = array( |
| 429 |
'method' => $method, |
| 430 |
'timeout' => self::TIMEOUT, |
| 431 |
); |
| 432 |
|
| 433 |
$args['headers'] = array( |
| 434 |
'Authorization' => 'DeepL-Auth-Key ' . $this->authKey |
| 435 |
); |
| 436 |
$args['headers'] = $this->addHeaders( $args['headers'] ); |
| 437 |
|
| 438 |
$remoteURL = $this->getEndPointURL(); |
| 439 |
//if( $args['query'] ) $remoteURL .= '?' . $args['query']; |
| 440 |
|
| 441 |
|
| 442 |
$curl_string = 'curl -X ' . $args['method'] . " '$remoteURL'\n"; |
| 443 |
foreach( $args['headers'] as $key => $value ) { |
| 444 |
$curl_string .= "$key: $value\n"; |
| 445 |
} |
| 446 |
//echo "\n CURL = " . str_replace("\n", '<br />', $curl_string ); |
| 447 |
$bits = array_merge( array( $remoteURL, 'GET' ), $args ); |
| 448 |
// unsafe |
| 449 |
//wpdeepl_log( $bits, 'apiRequests'); |
| 450 |
|
| 451 |
// wpdeepl_debug_display( $args, $remoteURL ); die('oazea4ze9684e84azek'); |
| 452 |
|
| 453 |
$response = wp_remote_get( $remoteURL, $args ); |
| 454 |
//wpdeepl_debug_display( $args, $remoteURL ); wpdeepl_debug_display( $response ); die('ok'); |
| 455 |
if ( is_wp_error( $response ) ) { |
| 456 |
$this->response = $response->get_error_message(); |
| 457 |
} else { |
| 458 |
$this->response = $response; |
| 459 |
} |
| 460 |
return $response; |
| 461 |
} |
| 462 |
} |