PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.7.1
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.7.1
2.7.7 2.7.6 2.7.5 2.7.4 trunk 1.3 2.0.4 2.0.6 2.1.91 2.2.4 2.2.7 2.2.9 2.3.1 2.3.10 2.4.10 2.4.2 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.6.0 2.6.1 2.7.0 All 28 releases
← All changes | admin/includes/class.request.php +288 -288 2.4.102.7.1 View file →
@@ -1,288 +1,288 @@
1 -<?php
2 -/**
3 - * Woody Request class
4 - *
5 - * Contains methods for executing requests and processing responses.
6 - * Uses the WINP\JsonMapper\Mapper to convert the response to a convenient object.
7 - *
8 - * @author Webcraftic <wordpress.webraftic@gmail.com>
9 - * @copyright (c) 11.12.2018, Webcraftic
10 - * @version 1.0
11 - */
12 -
13 -// Exit if accessed directly
14 -use WpOrg\Requests\Requests;
15 -
16 -if ( ! defined( 'ABSPATH' ) ) {
17 - exit;
18 -}
19 -
20 -class WINP_Request {
21 - //В новых версиях Вуди начиная с 2.2.10 будет обращаться к новой версии API библиотеки сниппетов
22 - // это делается для обратной совместимости, чтобы старые версии продолжили работать со старым API
23 - //const WINP_REQUEST_URL = 'http://185.75.88.217/v2/woody/'; //тестовая после переноса на другой сервер
24 - const WINP_REQUEST_URL = 'https://api.woodysnippet.com/v2/woody/';
25 -
26 - /**
27 - * WINP_REQUEST constructor.
28 - */
29 - public function __construct() {
30 - require_once WINP_PLUGIN_DIR . '/includes/jsonmapper/class-json-mapper.php';
31 - require_once WINP_PLUGIN_DIR . '/includes/jsonmapper/exceptions/class-exception.php';
32 -
33 - /*add_filter( 'http_request_args', function ( $parsed_args, $url ) {
34 - $parsed_args['sslverify'] = false;
35 -
36 - return $parsed_args;
37 - }, 10, 2 );*/
38 - }
39 -
40 - /**
41 - * Get license key
42 - *
43 - * @return string
44 - */
45 - private function get_key() {
46 - return WINP_Plugin::app()->premium->get_license()->get_key();
47 - }
48 -
49 - /**
50 - * Get license plugin_id
51 - *
52 - * @return string
53 - */
54 - private function get_plugin_id() {
55 - return WINP_Plugin::app()->premium->get_setting( 'plugin_id' );
56 - }
57 -
58 - /**
59 - * Get base64 token string
60 - *
61 - * @return string
62 - */
63 - private function get_token() {
64 - return base64_encode( $this->get_key() );
65 - }
66 -
67 - /**
68 - * Get headers
69 - *
70 - * @return array
71 - */
72 - private function get_headers() {
73 - return [
74 - 'Authorization' => 'Bearer ' . $this->get_token(),
75 - 'PluginId' => $this->get_plugin_id(),
76 - ];
77 - }
78 -
79 - /**
80 - * Check is key data available
81 - *
82 - * @return bool
83 - */
84 - public function is_key() {
85 - return WINP_Plugin::app()->premium->is_activate() && $this->get_key();
86 - }
87 -
88 - /**
89 - * Make POST request with authorization headers and return response
90 - *
91 - * @param string $point
92 - * @param array $args
93 - *
94 - * @return array|bool|WP_Error
95 - */
96 - public function post( $point, $args = [] ) {
97 - if ( ! $this->is_key() ) {
98 - return false;
99 - }
100 -
101 - $args['headers'] = $this->get_headers();
102 -
103 - return wp_remote_post( self::WINP_REQUEST_URL . $point, $args );
104 - }
105 -
106 - /**
107 - * Make GET request with authorization headers and return response
108 - *
109 - * @param string $point
110 - * @param array $args
111 - *
112 - * @return array|bool|WP_Error
113 - */
114 - public function get( $point, $args = [] ) {
115 - if ( ! $this->is_key() ) {
116 - return false;
117 - }
118 -
119 - $args['headers'] = $this->get_headers();
120 -
121 - return wp_remote_get( self::WINP_REQUEST_URL . $point, $args );
122 - }
123 -
124 - /**
125 - * Make PUT request with authorization headers and return response
126 - *
127 - * @param string $point
128 - * @param array $args
129 - *
130 - * @return array|bool|WP_Error
131 - */
132 - public function put( $point, $args = [] ) {
133 - if ( ! $this->is_key() ) {
134 - return false;
135 - }
136 -
137 - $args['method'] = Requests::PUT;
138 - $args['headers'] = $this->get_headers();
139 -
140 - return wp_remote_request( self::WINP_REQUEST_URL . $point, $args );
141 - }
142 -
143 - /**
144 - * Check response
145 - *
146 - * @param $response
147 - *
148 - * @return bool
149 - */
150 - public function check_response( $response ) {
151 - if ( empty( $response ) || $response instanceof WP_Error ) {
152 - return false;
153 - }
154 -
155 - if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) {
156 - return false;
157 - }
158 -
159 - if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) {
160 - return false;
161 - }
162 -
163 - return true;
164 - }
165 -
166 - /**
167 - * Check body
168 - *
169 - * @param $body
170 - *
171 - * @return bool
172 - */
173 - public function check_body( $body ) {
174 - if ( empty( $body ) ) {
175 - return false;
176 - }
177 -
178 - if ( ! is_array( $body ) && ! is_object( $body ) ) {
179 - return false;
180 - }
181 -
182 - return true;
183 - }
184 -
185 - /**
186 - * Get response text error
187 - *
188 - * @param $response
189 - *
190 - * @return string
191 - */
192 - public function get_response_error( $response ) {
193 - if ( empty( $response ) ) {
194 - return 'Empty response';
195 - }
196 -
197 - if ( $response instanceof WP_Error ) {
198 - return $response->get_error_message();
199 - }
200 -
201 - if ( is_array( $response ) ) {
202 - if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) {
203 - return 'Empty body';
204 - }
205 -
206 - if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) {
207 - return $response['response']['message'] . ' [Code: ' . $response['response']['code'] . ']';
208 - }
209 - }
210 -
211 - return 'Unknown error';
212 - }
213 -
214 - /**
215 - * Get mapped object by name
216 - *
217 - * @param $json
218 - * @param $object_name
219 - *
220 - * @return bool|mixed
221 - */
222 - public function map_object( $json, $object_name ) {
223 - if ( ! $this->check_response( $json ) ) {
224 - error_log( 'Snippet api [map_object]: ' . $this->get_response_error( $json ) );
225 -
226 - return false;
227 - }
228 -
229 - $body = json_decode( $json['body'] );
230 -
231 - if ( ! $this->check_body( $body ) ) {
232 - error_log( 'Snippet api [map_objects]: Wrong body' );
233 -
234 - return false;
235 - }
236 -
237 - $mapper = new WINP\JsonMapper\Mapper();
238 -
239 - $mapper->bExceptionOnUndefinedProperty = true;
240 - $mapper->bExceptionOnMissingData = true;
241 -
242 - try {
243 - return $mapper->map( $body, new $object_name() );
244 - } catch ( WINP\JsonMapper\Exception $exception ) {
245 - error_log( 'Snippet api [map_object]: ' . $exception->getMessage() );
246 -
247 - return false;
248 - }
249 - }
250 -
251 - /**
252 - * Get mapped objects by name
253 - *
254 - * @param $json
255 - * @param $object_name
256 - *
257 - * @return bool|mixed
258 - */
259 - public function map_objects( $json, $object_name ) {
260 - if ( ! $this->check_response( $json ) ) {
261 - error_log( 'Snippet api [map_objects]: ' . $this->get_response_error( $json ) );
262 -
263 - return false;
264 - }
265 -
266 - $body = json_decode( $json['body'] );
267 -
268 - if ( ! $this->check_body( $body ) ) {
269 - error_log( 'Snippet api [map_objects]: Wrong body' );
270 -
271 - return false;
272 - }
273 -
274 - $mapper = new WINP\JsonMapper\Mapper();
275 -
276 - $mapper->bExceptionOnUndefinedProperty = true;
277 - $mapper->bExceptionOnMissingData = true;
278 -
279 - try {
280 - return $mapper->mapArray( $body, [], $object_name );
281 - } catch ( WINP\JsonMapper\Exception $exception ) {
282 - error_log( 'Snippet api [map_objects]: ' . $exception->getMessage() );
283 -
284 - return false;
285 - }
286 - }
287 -
288 -}
1 +<?php
2 +/**
3 + * Woody Request class
4 + *
5 + * Contains methods for executing requests and processing responses.
6 + * Uses the WINP\JsonMapper\Mapper to convert the response to a convenient object.
7 + *
8 + * @package Woody_Code_Snippets
9 + */
10 +
11 +// Exit if accessed directly
12 +use WpOrg\Requests\Requests;
13 +
14 +if ( ! defined( 'ABSPATH' ) ) {
15 + exit;
16 +}
17 +
18 +/**
19 + * WINP_Request class
20 + */
21 +class WINP_Request {
22 +
23 + /**
24 + * Base request URL.
25 + */
26 + const WINP_REQUEST_URL = 'https://api.woodysnippet.com/v2/woody/';
27 +
28 + /**
29 + * WINP_REQUEST constructor.
30 + */
31 + public function __construct() {
32 + // Load GPL-compatible DTO classes.
33 + require_once WINP_PLUGIN_DIR . '/admin/includes/dto/class-dto-base.php';
34 + require_once WINP_PLUGIN_DIR . '/admin/includes/dto/class-type.php';
35 + require_once WINP_PLUGIN_DIR . '/admin/includes/dto/class-snippet.php';
36 + }
37 +
38 + /**
39 + * Get license key
40 + *
41 + * @return string
42 + */
43 + private function get_key() {
44 + return WINP_Plugin::app()->premium->get_key();
45 + }
46 +
47 + /**
48 + * Get license plugin_id
49 + *
50 + * @return string
51 + */
52 + private function get_plugin_id() {
53 + return WINP_Plugin::app()->premium->get_setting( 'plugin_id' );
54 + }
55 +
56 + /**
57 + * Get base64 token string
58 + *
59 + * @return string
60 + */
61 + private function get_token() {
62 + return base64_encode( $this->get_key() );
63 + }
64 +
65 + /**
66 + * Get headers
67 + *
68 + * @return array
69 + */
70 + private function get_headers() {
71 + return [
72 + 'Authorization' => 'Bearer ' . $this->get_token(),
73 + 'PluginId' => $this->get_plugin_id(),
74 + 'Version' => 'v2', // That tells server that the user is using SDK, not Freemius.
75 + ];
76 + }
77 +
78 + /**
79 + * Check is key data available
80 + *
81 + * @return bool
82 + */
83 + public function is_key() {
84 + return WINP_Plugin::app()->premium->is_active() && $this->get_key();
85 + }
86 +
87 + /**
88 + * Make POST request with authorization headers and return response
89 + *
90 + * @param string $point
91 + * @param array $args
92 + *
93 + * @return array|bool|WP_Error
94 + */
95 + public function post( $point, $args = [] ) {
96 + if ( ! $this->is_key() ) {
97 + return false;
98 + }
99 +
100 + $args['headers'] = $this->get_headers();
101 +
102 + return wp_remote_post( self::WINP_REQUEST_URL . $point, $args );
103 + }
104 +
105 + /**
106 + * Make GET request with authorization headers and return response
107 + *
108 + * @param string $point
109 + * @param array $args
110 + *
111 + * @return array|bool|WP_Error
112 + */
113 + public function get( $point, $args = [] ) {
114 + // Allow common endpoints without authentication.
115 + $is_common_endpoint = strpos( $point, 'common' ) === 0;
116 +
117 + if ( ! $is_common_endpoint && ! $this->is_key() ) {
118 + return false;
119 + }
120 +
121 + // Add headers if user has valid license (even for common endpoints).
122 + if ( $this->is_key() ) {
123 + $args['headers'] = $this->get_headers();
124 + }
125 +
126 + return wp_remote_get( self::WINP_REQUEST_URL . $point, $args );
127 + }
128 +
129 + /**
130 + * Make PUT request with authorization headers and return response
131 + *
132 + * @param string $point
133 + * @param array $args
134 + *
135 + * @return array|bool|WP_Error
136 + */
137 + public function put( $point, $args = [] ) {
138 + if ( ! $this->is_key() ) {
139 + return false;
140 + }
141 +
142 + $args['method'] = Requests::PUT;
143 + $args['headers'] = $this->get_headers();
144 +
145 + return wp_remote_request( self::WINP_REQUEST_URL . $point, $args );
146 + }
147 +
148 + /**
149 + * Check response
150 + *
151 + * @param $response
152 + *
153 + * @return bool
154 + */
155 + public function check_response( $response ) {
156 + if ( empty( $response ) || $response instanceof WP_Error ) {
157 + return false;
158 + }
159 +
160 + if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) {
161 + return false;
162 + }
163 +
164 + if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) {
165 + return false;
166 + }
167 +
168 + return true;
169 + }
170 +
171 + /**
172 + * Check body
173 + *
174 + * @param $body
175 + *
176 + * @return bool
177 + */
178 + public function check_body( $body ) {
179 + if ( empty( $body ) ) {
180 + return false;
181 + }
182 +
183 + if ( ! is_array( $body ) && ! is_object( $body ) ) {
184 + return false;
185 + }
186 +
187 + return true;
188 + }
189 +
190 + /**
191 + * Get response text error
192 + *
193 + * @param $response
194 + *
195 + * @return string
196 + */
197 + public function get_response_error( $response ) {
198 + if ( empty( $response ) ) {
199 + return 'Empty response';
200 + }
201 +
202 + if ( $response instanceof WP_Error ) {
203 + return $response->get_error_message();
204 + }
205 +
206 + if ( is_array( $response ) ) {
207 + if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) {
208 + return 'Empty body';
209 + }
210 +
211 + if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) {
212 + return $response['response']['message'] . ' [Code: ' . $response['response']['code'] . ']';
213 + }
214 + }
215 +
216 + return 'Unknown error';
217 + }
218 +
219 + /**
220 + * Get mapped object by name
221 + *
222 + * @param array<string, mixed>|bool|WP_Error $json Response array from wp_remote_* functions.
223 + * @param string $object_name Class name (e.g., 'WINP_DTO_Snippet').
224 + *
225 + * @return object|bool Object instance or false on failure.
226 + * @throws Exception If mapping fails.
227 + */
228 + public function map_object( $json, $object_name ) {
229 + if ( ! $this->check_response( $json ) ) {
230 + return false;
231 + }
232 +
233 + if ( is_wp_error( $json ) || ! isset( $json['body'] ) ) {
234 + return false;
235 + }
236 +
237 + $body = json_decode( $json['body'], true );
238 +
239 + if ( ! $this->check_body( $body ) ) {
240 + return false;
241 + }
242 +
243 + try {
244 + if ( ! method_exists( $object_name, 'from_array' ) ) {
245 + throw new Exception( "Class {$object_name} does not have a from_array method" );
246 + }
247 +
248 + return $object_name::from_array( $body );
249 + } catch ( Exception $exception ) {
250 + return false;
251 + }
252 + }
253 +
254 + /**
255 + * Get mapped objects by name
256 + *
257 + * @param array<string, mixed>|bool|WP_Error $json Response array from wp_remote_* functions.
258 + * @param string $object_name Class name (e.g., 'WINP_DTO_Snippet').
259 + *
260 + * @return array<object>|bool Array of object instances or false on failure.
261 + * @throws Exception If mapping fails.
262 + */
263 + public function map_objects( $json, $object_name ) {
264 + if ( ! $this->check_response( $json ) ) {
265 + return false;
266 + }
267 +
268 + if ( is_wp_error( $json ) || ! isset( $json['body'] ) ) {
269 + return false;
270 + }
271 +
272 + $body = json_decode( $json['body'], true );
273 +
274 + if ( ! is_array( $body ) ) {
275 + return false;
276 + }
277 +
278 + try {
279 + if ( ! method_exists( $object_name, 'array_from_json' ) ) {
280 + throw new Exception( "Class {$object_name} does not have an array_from_json method" );
281 + }
282 +
283 + return $object_name::array_from_json( $body );
284 + } catch ( Exception $exception ) {
285 + return false;
286 + }
287 + }
288 +}