PluginProbe
Extendify / 3.1.5
Extendify v3.1.5
3.2.1 3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 All 127 releases
extendify / app / Shared / Services / HttpClient.php

HttpClient.php in Extendify 3.1.5, at app/Shared/Services/HttpClient.php

137 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * HTTP Client utility for making secure requests
5 */
6
7 namespace Extendify\Shared\Services;
8
9 use Extendify\Config;
10 use Extendify\PartnerData;
11
12 defined('ABSPATH') || die('No direct access.');
13
14 /**
15 * Utility class for making secure HTTP requests with WordPress data
16 */
17 class HttpClient
18 {
19 /**
20 * Build WordPress environment parameters
21 *
22 * @param \WP_REST_Request|null $request - Optional request object
23 * @param array $additionalParams - Additional parameters to merge
24 * @return array
25 */
26 public static function buildParams($request = null, $additionalParams = [])
27 {
28 $params = [
29 'wp_language' => \get_locale(),
30 'wp_theme' => \get_option('template'),
31 'wp_version' => \get_bloginfo('version'),
32 'mode' => Config::$environment,
33 'library_version' => Config::$version,
34 'wp_active_plugins' => ($request && $request->get_method() === 'POST') ? \get_option('active_plugins') : [],
35 'is_block_theme' => function_exists('wp_is_block_theme') ? wp_is_block_theme() : false,
36 'sdk_partner' => PartnerData::$id,
37 ];
38
39 // Add devmode if header is set
40 if ($request && $request->get_header('x_extendify_dev_mode') === 'true') {
41 $params['devmode'] = true;
42 }
43
44 return array_merge($params, $additionalParams);
45 }
46
47 /**
48 * Build headers
49 *
50 * @param \WP_REST_Request|null $request - Optional request object
51 * @param array $additionalHeaders - Additional headers to merge
52 * @return array
53 */
54 public static function buildHeaders($request = null, $additionalHeaders = [])
55 {
56 $headers = [
57 'Accept' => 'application/json',
58 ];
59
60 if ($request) {
61 $headers['referer'] = $request->get_header('referer');
62 $headers['user_agent'] = $request->get_header('user_agent');
63 }
64
65 return array_filter(array_merge($headers, $additionalHeaders));
66 }
67
68 /**
69 * Make a GET request with WordPress parameters and proper error handling
70 *
71 * @param string $url - Base URL for the request
72 * @param array $extra - Array containing 'params' and/or 'headers' keys for additional data
73 * @param \WP_REST_Request|null $request - Optional request object for headers
74 * @return array - Array containing 'response' data and 'code' status
75 */
76 public static function get($url, $extra = [], $request = null)
77 {
78 $params = self::buildParams($request, $extra['params'] ?? []);
79 $headers = self::buildHeaders($request, $extra['headers'] ?? []);
80
81 $requestUrl = \add_query_arg(
82 \urlencode_deep(\urldecode_deep($params)),
83 $url
84 );
85
86 $response = \wp_safe_remote_get($requestUrl, ['headers' => $headers]);
87
88 // If there was an error, return 500
89 if (\is_wp_error($response) || \wp_remote_retrieve_response_code($response) !== 200) {
90 return ['response' => [], 'code' => 500];
91 }
92
93 $result = json_decode(\wp_remote_retrieve_body($response), true);
94
95 // Validate JSON decode was successful and has expected structure
96 if (json_last_error() !== JSON_ERROR_NONE || !is_array($result)) {
97 return ['response' => [], 'code' => 500];
98 }
99
100 return ['response' => $result, 'code' => 200];
101 }
102
103 /**
104 * Make a POST request with WordPress parameters and proper error handling
105 *
106 * @param string $url - Base URL for the request
107 * @param array $extra - Array containing 'params' and/or 'headers' keys for additional data
108 * @param \WP_REST_Request|null $request - Optional request object for headers
109 * @param bool $encode - Whether to JSON encode the body (default: false)
110 * @return array - Array containing 'response' data and 'code' status
111 */
112 public static function post($url, $extra = [], $request = null, $encode = false)
113 {
114 $body = self::buildParams($request, $extra['params'] ?? []);
115 $headers = self::buildHeaders($request, $extra['headers'] ?? []);
116
117 $response = \wp_safe_remote_post($url, [
118 'headers' => $headers,
119 'body' => $encode ? \wp_json_encode($body) : $body,
120 ]);
121
122 // If there was an error, return 500
123 if (\is_wp_error($response) || \wp_remote_retrieve_response_code($response) !== 200) {
124 return ['response' => [], 'code' => 500];
125 }
126
127 $result = json_decode(\wp_remote_retrieve_body($response), true);
128
129 // Validate JSON decode was successful and has expected structure
130 if (json_last_error() !== JSON_ERROR_NONE || !is_array($result)) {
131 return ['response' => [], 'code' => 500];
132 }
133
134 return ['response' => $result, 'code' => 200];
135 }
136 }
137