Skip to content

Commit d631825

Browse files
author
Vithusha Kethiri
committed
Add retry limit to admin settings
1 parent e966a30 commit d631825

File tree

5 files changed

+93
-12
lines changed

5 files changed

+93
-12
lines changed

classes/privacy/provider.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
defined('MOODLE_INTERNAL') || die();
2828

2929
/**
30-
* The mod_modname module does not store any data.
30+
* The filter_oembed module does not store any data.
3131
*
3232
*/
3333
class provider implements \core_privacy\local\metadata\null_provider {

classes/provider/provider.php

+34-3
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,39 @@ public function get_oembed_request($text) {
181181
* @param string $url The consumer request URL.
182182
* @return array JSON decoded array.
183183
*/
184-
public function oembed_response($url) {
185-
$ret = download_file_content($url, null, null, true, 300, 20, false, null, false);
186-
return json_decode($ret->results, true);
184+
public function oembed_response($url, $retryno = 0) {
185+
static $cache;
186+
187+
if (!isset($cache)) {
188+
$cache = \cache::make('filter_oembed', 'embeddata');
189+
}
190+
191+
if ($ret = $cache->get(md5($url))) {
192+
return json_decode($ret, true);
193+
}
194+
195+
$curl = new \curl();
196+
$ret = $curl->get($url);
197+
198+
// Check if curl call fails.
199+
if ($curl->errno == CURLE_OK) {
200+
$cache->set(md5($url), $ret);
201+
$result = json_decode($ret, true);
202+
return $result;
203+
}
204+
205+
$retrylimit = get_config('filter_oembed', 'retrylimit');
206+
// Check if error is due to network connection.
207+
if (!in_array($curl->errno, [6, 7, 28])) {
208+
return null;
209+
}
210+
// Try curl call up to $retrylimit times.
211+
usleep(50000);
212+
$retryno = (!is_int($retryno)) ? 0 : $retryno + 1;
213+
if ($retryno >= $retrylimit) {
214+
return null;
215+
}
216+
return $this->oembed_response($url, $retryno);
187217
}
188218

189219
/**
@@ -224,6 +254,7 @@ protected function endpoints_regex(endpoint $endpoint) {
224254
$find = ['.', '*'];
225255
$replace = ['\.', '.*?'];
226256
$url = str_replace($find, $replace, $url);
257+
$url = str_replace('.*??', '.*?\?', $url);
227258
$regexarr[] = '(' . $url . ')';
228259
}
229260

filter.php

+30-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public function filter($text, array $options = array()) {
6868
return $text;
6969
}
7070

71-
$filtered = $text; // We need to return the original value if regex fails!
71+
$filtered = $this->embed_extra_mappings($text); // We need to return the original value if regex fails!
7272
if ($targettag == 'divtag') {
7373
$search = '/\<div\s[^\>]*data-oembed-href="(.*?)"(.*?)>(.*?)\<\/div\>/';
7474
} else { // Using 'atag'.
@@ -84,6 +84,35 @@ public function filter($text, array $options = array()) {
8484
}
8585
}
8686

87+
private function embed_extra_mappings($html) {
88+
$extra = get_config('filter_oembed', 'extra_mappings');
89+
if (empty($extra)) {
90+
return $html;
91+
}
92+
93+
$mappings = explode("\n", trim($extra));
94+
foreach ($mappings as $mapping) {
95+
$mapping = trim($mapping);
96+
$params = explode('=>', $mapping);
97+
if (count($params) != 2) {
98+
if ($params != '') { // Ignore empty lines.
99+
debugging('Invalid extra mapping: '.$mapping);
100+
}
101+
continue;
102+
}
103+
104+
$html = $this->embed_extra_mapping($html, trim($params[0]), trim($params[1]));
105+
}
106+
107+
return $html;
108+
}
109+
110+
private function embed_extra_mapping($html, $url, $endpoint) {
111+
$search = '#<a\s[^>]*href="('.$url.')"(.*?)>(.*?)</a>#is'; // URL to Link filter will create <a> tags.
112+
$html = preg_replace_callback($search, 'self::find_oembeds_callback', $html);
113+
return $html;
114+
}
115+
87116
/**
88117
* Callback function to be used by the main filter
89118
*

lang/en/filter_oembed.php

+5
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,9 @@
6363
$string['targettag'] = 'Target tag';
6464
$string['targettag_desc'] = 'What tag type should be filtered - anchors or divs with the oembed class.';
6565
$string['updateproviders'] = 'Update Oembed provider information.';
66+
$string['extramappings'] = 'Extra Mappings';
67+
$string['extramappingsdescription'] = 'Format: <b>REGEX => ENDPOINT</b><br />Where <i>REGEX</i> is what to replace and <i>ENDPOINT</i> is where to fetch the JSON parameters for the embed.';
6668
$string['privacy:metadata'] = 'Oembed filter does not store any personal data.';
69+
$string['once'] = 'Once';
70+
$string['retrylimit'] = 'Limit to retry getting filtered content';
71+
$string['times'] = '{$a} times';

settings.php

+23-7
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,49 @@
3131

3232
use filter_oembed\service\oembed;
3333

34-
$ADMIN->add('filtersettings', new admin_category('filteroembedfolder', get_string('filtername', 'filter_oembed')));
35-
$settings = new admin_settingpage($section, get_string('settings'));
34+
$ADMIN->add('filtersettings', new admin_category('filteroembedfolder', new lang_string('filtername', 'filter_oembed')));
35+
$settings = new admin_settingpage($section, new lang_string('settings'));
3636

3737
if ($ADMIN->fulltree) {
3838
$targettags = [
39-
'a' => get_string('atag', 'filter_oembed'),
40-
'div' => get_string('divtag', 'filter_oembed')
39+
'a' => new lang_string('atag', 'filter_oembed'),
40+
'div' => new lang_string('divtag', 'filter_oembed')
4141
];
4242

4343
$config = get_config('filter_oembed');
4444

45+
$item = new admin_setting_configtextarea(
46+
'filter_oembed/extra_mappings',
47+
get_string('extramappings', 'filter_oembed'),
48+
get_string('extramappingsdescription', 'filter_oembed'),
49+
'',
50+
PARAM_RAW
51+
);
52+
$settings->add($item);
53+
4554
$item = new admin_setting_configselect(
4655
'filter_oembed/targettag',
47-
get_string('targettag', 'filter_oembed'),
48-
get_string('targettag_desc', 'filter_oembed'),
56+
new lang_string('targettag', 'filter_oembed'),
57+
new lang_string('targettag_desc', 'filter_oembed'),
4958
'atag',
5059
['atag' => 'atag', 'divtag' => 'divtag']
5160
);
5261
$settings->add($item);
5362

63+
$retrylist = array('0' => new lang_string('none'), '1' => new lang_string('once', 'filter_oembed'),
64+
'2' => new lang_string('times', 'filter_oembed', '2'),
65+
'3' => new lang_string('times', 'filter_oembed', '3'));
66+
$item = new admin_setting_configselect('filter_oembed/retrylimit',
67+
new lang_string('retrylimit', 'filter_oembed'), '', '1', $retrylist);
68+
$settings->add($item);
69+
5470
$item = new admin_setting_configcheckbox('filter_oembed/lazyload', new lang_string('lazyload', 'filter_oembed'), '', 1);
5571
$settings->add($item);
5672
}
5773

5874
$ADMIN->add('filteroembedfolder', $settings);
5975

6076
$ADMIN->add('filteroembedfolder', new admin_externalpage('filter_oembed_providers',
61-
get_string('manageproviders', 'filter_oembed'), new moodle_url('/filter/oembed/manageproviders.php')));
77+
new lang_string('manageproviders', 'filter_oembed'), new moodle_url('/filter/oembed/manageproviders.php')));
6278

6379
$settings = null;

0 commit comments

Comments
 (0)