PluginProbe
Translation with DeepL API / trunk
Translation with DeepL API vtrunk
trunk 0.1.20180323 1.0 1.2.5.1 1.5.2.5 1.7.5 2.4.3.12 2.4.3.9 2.4.5
wpdeepl / client / deeplapi.class.php

deeplapi.class.php in Translation with DeepL API trunk, at client/deeplapi.class.php

462 lines 11.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 }