PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / trunk
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts vtrunk
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 2.7.1 All 27 releases
insert-php / admin / includes / class.request.php

class.request.php in Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts trunk, at admin/includes/class.request.php

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