PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / trunk
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress vtrunk
11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 10.3.0 10.4.0 All 60 releases
acymailing / back / Core / wordpress / request.php

request.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress trunk, at back/Core/wordpress/request.php

161 lines 5.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 defined('ABSPATH') || die('Restricted Access');
3
4 /**
5 * @param string $url
6 * @param array $options
7 * - verifySsl: boolean, default true
8 * - headers: array for example ['Content-Type' => 'application/json']
9 * - data: array, if Content-Type is application/json, the data will be json_encoded otherwise it will be urlencoded
10 * - dns: string
11 * - proxy: array ['host' => '127.0.0.1:8888', 'auth' => 'user:password'] the auth is optional
12 * - method: string GET, POST, etc
13 *
14 * @return array
15 */
16 function acym_makeCurlCall(string $url, array $options = []): array
17 {
18 $verifySsl = $options['verifySsl'] ?? true;
19 $headers = (!empty($options['headers']) && is_array($options['headers'])) ? $options['headers'] : [];
20 $data = (!empty($options['data']) && is_array($options['data'])) ? $options['data'] : [];
21 $files = (!empty($options['files']) && is_array($options['files'])) ? $options['files'] : [];
22
23 $method = (!empty($options['method']) && in_array($options['method'], ['GET', 'POST'], true)) ? $options['method'] : 'GET';
24
25 $multipart = !empty($options['multipart']) || !empty($files);
26
27 $contentTypeKey = '';
28 foreach (array_keys($headers) as $headerName) {
29 if (strtolower($headerName) === 'content-type') {
30 $contentTypeKey = $headerName;
31 break;
32 }
33 }
34
35 $args = [
36 'method' => $method,
37 'sslverify' => (bool)$verifySsl,
38 'timeout' => 30,
39 ];
40
41 if ($method === 'POST' && $multipart) {
42 if (!empty($files)) {
43 global $wp_filesystem;
44 if (empty($wp_filesystem)) {
45 require_once ABSPATH.'wp-admin/includes/file.php';
46 WP_Filesystem();
47 }
48 }
49
50 $boundary = wp_generate_password(24, false);
51 $eol = "\r\n";
52 $body = '';
53 foreach ($data as $name => $value) {
54 $body .= '--'.$boundary.$eol;
55 $body .= 'Content-Disposition: form-data; name="'.$name.'"'.$eol.$eol;
56 $body .= $value.$eol;
57 }
58 foreach ($files as $file) {
59 if (empty($file['path']) || empty($wp_filesystem) || !$wp_filesystem->exists($file['path'])) {
60 continue;
61 }
62
63 $content = $wp_filesystem->get_contents($file['path']);
64 if ($content === false) {
65 continue;
66 }
67
68 $fileName = $file['filename'] ?? basename($file['path']);
69 $body .= '--'.$boundary.$eol;
70 $body .= 'Content-Disposition: form-data; name="'.$file['name'].'"; filename="'.$fileName.'"'.$eol;
71 $body .= 'Content-Type: application/octet-stream'.$eol.$eol;
72 $body .= $content.$eol;
73 }
74 $body .= '--'.$boundary.'--'.$eol;
75
76 if ($contentTypeKey !== '') {
77 unset($headers[$contentTypeKey]);
78 }
79 $headers['Content-Type'] = 'multipart/form-data; boundary='.$boundary;
80 $args['body'] = $body;
81 } else {
82 $dataFormatted = '';
83 if (!empty($data)) {
84 $isJson = $contentTypeKey !== '' && strtolower(trim($headers[$contentTypeKey])) === 'application/json';
85 $dataFormatted = ($method === 'POST' && $isJson) ? wp_json_encode($data) : http_build_query($data);
86 }
87 if ($method === 'GET' && !empty($dataFormatted)) {
88 $url .= (strpos($url, '?') === false ? '?' : '&').$dataFormatted;
89 }
90 if ($method === 'POST' && !empty($dataFormatted)) {
91 $args['body'] = $dataFormatted;
92 }
93 }
94
95 $args['headers'] = $headers;
96
97 $response = wp_remote_request($url, $args);
98
99 if (is_wp_error($response)) {
100 return ['error' => $response->get_error_message(), 'status_code' => 0];
101 }
102
103 $httpCode = (int)wp_remote_retrieve_response_code($response);
104 $decoded = json_decode(wp_remote_retrieve_body($response), true);
105
106 if (!is_array($decoded)) {
107 $decoded = [];
108 }
109 $decoded['status_code'] = $httpCode;
110
111 return $decoded;
112 }
113
114 function acym_asyncUrlCalls(array $urls): void
115 {
116 $args = [
117 'timeout' => 5,
118 'blocking' => false,
119 // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- Applying SSL WP filter.
120 'sslverify' => apply_filters('https_local_ssl_verify', false),
121 ];
122
123 $errors = [];
124 foreach ($urls as $url) {
125 $response = wp_remote_get($url, $args);
126 if (is_wp_error($response)) {
127 $errors[] = $response->get_error_message();
128 }
129 }
130
131 if (empty($errors)) {
132 return;
133 }
134
135 $config = acym_config();
136 $reportPath = $config->get('cron_savepath');
137 if (empty($reportPath)) {
138 return;
139 }
140
141 global $wp_filesystem;
142 if (empty($wp_filesystem)) {
143 require_once ABSPATH.'wp-admin/includes/file.php';
144 WP_Filesystem();
145 }
146 if (empty($wp_filesystem)) {
147 return;
148 }
149
150 $reportPath = str_replace(['{year}', '{month}'], [gmdate('Y'), gmdate('m')], $reportPath);
151 $reportPath = acym_cleanPath(ACYM_ROOT.trim(html_entity_decode($reportPath)));
152 acym_createDir(dirname($reportPath), true, true);
153
154 $lr = "\r\n";
155 $message = $lr.$lr.'******************** '.acym_getDate(time()).' ********************'.$lr
156 .'An error occurred while calling the queue sending script: '.implode(' | ', $errors);
157
158 $existing = $wp_filesystem->exists($reportPath) ? $wp_filesystem->get_contents($reportPath) : '';
159 $wp_filesystem->put_contents($reportPath, $existing.$message, FS_CHMOD_FILE);
160 }
161