mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Scribunto: Hack timeout to limit Scribunto execution to 5 seconds [#737]
This commit is contained in:
parent
398a1c854a
commit
27756f8056
@ -1,18 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
for your project on a case-by-case basis.
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.wikis.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
|
package gplx.xowa.wikis.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
|
||||||
import gplx.core.caches.*;
|
import gplx.core.caches.*;
|
||||||
public class Xow_page_cache {
|
public class Xow_page_cache {
|
||||||
@ -61,11 +61,11 @@ public class Xow_page_cache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void Free_mem(boolean clear_permanent_itms) {
|
public void Free_mem(boolean clear_permanent_itms) {
|
||||||
synchronized (thread_lock) { // LOCK:app-level; DATE:2016-07-06
|
// synchronized (thread_lock) { // LOCK:app-level; DATE:2016-07-06
|
||||||
if (clear_permanent_itms) {
|
if (clear_permanent_itms) {
|
||||||
cache.Clear_all();
|
cache.Clear_all();
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
private Xow_page_cache_itm Load_page(Xoa_ttl ttl) {
|
private Xow_page_cache_itm Load_page(Xoa_ttl ttl) {
|
||||||
// vars
|
// vars
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
for your project on a case-by-case basis.
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.xtns.scribunto; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
|
package gplx.xowa.xtns.scribunto; import gplx.*;
|
||||||
|
import gplx.core.threads.Thread_adp;
|
||||||
|
import gplx.core.threads.Thread_adp_;
|
||||||
|
import gplx.xowa.*; import gplx.xowa.xtns.*;
|
||||||
import gplx.core.brys.fmtrs.*; import gplx.core.envs.*;
|
import gplx.core.brys.fmtrs.*; import gplx.core.envs.*;
|
||||||
import gplx.langs.htmls.*;
|
import gplx.langs.htmls.*;
|
||||||
import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.msgs.*;
|
import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.msgs.*;
|
||||||
@ -57,8 +60,23 @@ public class Scrib_invoke_func extends Pf_func_base {
|
|||||||
else
|
else
|
||||||
mod_raw = mod.Text_bry();
|
mod_raw = mod.Text_bry();
|
||||||
if (!core.Enabled()) {bfr.Add_mid(src, self.Src_bgn(), self.Src_end()); return;}
|
if (!core.Enabled()) {bfr.Add_mid(src, self.Src_bgn(), self.Src_end()); return;}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
core.Invoke(wiki, ctx, src, caller, self, bfr, mod_name, mod_raw, fnc_name);
|
// core.Invoke(wiki, ctx, src, caller, self, bfr, mod_name, mod_raw, fnc_name);
|
||||||
|
// if (invoke_wkr != null)
|
||||||
|
// invoke_wkr.Eval_end(ctx.Page(), mod_name, fnc_name, log_time_bgn);
|
||||||
|
|
||||||
|
int timeoutInMs = 5000;
|
||||||
|
long timeBgn = System_.Ticks();
|
||||||
|
|
||||||
|
InvokeInvoker invoker = new InvokeInvoker(core, wiki, ctx, src, caller, self, bfr, mod_name, mod_raw, fnc_name);
|
||||||
|
Thread_adp thread = Thread_adp_.Start_by_key("scribunto", invoker, "default");
|
||||||
|
while (thread.Thread__is_alive()) {
|
||||||
|
if (System_.Ticks__elapsed_in_frac(timeBgn) > timeoutInMs) {
|
||||||
|
thread.Thread__interrupt();
|
||||||
|
throw Err_.new_wo_type(String_.Format("scribunto timeout: page={0} mod={1} func={2} time={3}", ctx.Page_url_str(), mod_name, fnc_name, timeoutInMs));
|
||||||
|
}
|
||||||
|
}
|
||||||
if (invoke_wkr != null)
|
if (invoke_wkr != null)
|
||||||
invoke_wkr.Eval_end(ctx.Page(), mod_name, fnc_name, log_time_bgn);
|
invoke_wkr.Eval_end(ctx.Page(), mod_name, fnc_name, log_time_bgn);
|
||||||
}
|
}
|
||||||
@ -88,4 +106,34 @@ public class Scrib_invoke_func extends Pf_func_base {
|
|||||||
}
|
}
|
||||||
private static final Bry_fmtr error_fmtr = Bry_fmtr.new_("<strong class=\"error\"><span class=\"scribunto-error\" id=\"mw-scribunto-error-0\">~{0}: ~{1}</span></strong>"); // NOTE: must be "error" not 'error'; iferror checks for quote not apos; DATE:2015-09-17
|
private static final Bry_fmtr error_fmtr = Bry_fmtr.new_("<strong class=\"error\"><span class=\"scribunto-error\" id=\"mw-scribunto-error-0\">~{0}: ~{1}</span></strong>"); // NOTE: must be "error" not 'error'; iferror checks for quote not apos; DATE:2015-09-17
|
||||||
public static final String Err_mod_missing = "No such module";
|
public static final String Err_mod_missing = "No such module";
|
||||||
|
|
||||||
|
class InvokeInvoker implements Gfo_invk {
|
||||||
|
private final Scrib_core core;
|
||||||
|
private final Xowe_wiki wiki;
|
||||||
|
private final Xop_ctx ctx;
|
||||||
|
private final byte[] src;
|
||||||
|
private final Xot_invk caller;
|
||||||
|
private final Xot_invk self;
|
||||||
|
private final Bry_bfr bfr;
|
||||||
|
private final byte[] mod_name;
|
||||||
|
private final byte[] mod_raw;
|
||||||
|
private final byte[] fnc_name;
|
||||||
|
|
||||||
|
public InvokeInvoker(Scrib_core core, Xowe_wiki wiki, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr, byte[] mod_name, byte[] mod_raw, byte[] fnc_name) {
|
||||||
|
this.core = core;
|
||||||
|
this.wiki = wiki;
|
||||||
|
this.ctx = ctx;
|
||||||
|
this.src = src;
|
||||||
|
this.caller = caller;
|
||||||
|
this.self = self;
|
||||||
|
this.bfr = bfr;
|
||||||
|
this.mod_name = mod_name;
|
||||||
|
this.mod_raw = mod_raw;
|
||||||
|
this.fnc_name = fnc_name;
|
||||||
|
}
|
||||||
|
public Object Invk(GfsCtx gctx, int ikey, String k, GfoMsg m) {
|
||||||
|
core.Invoke(wiki, ctx, src, caller, self, bfr, mod_name, mod_raw, fnc_name);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user