mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
'v3.6.3.1'
This commit is contained in:
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
|
||||
import gplx.core.primitives.*; import gplx.core.js.*;
|
||||
import gplx.gfui.*;
|
||||
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.gfui.controls.gxws.*;
|
||||
import gplx.xowa.apps.servers.tcp.*;
|
||||
import gplx.xowa.apps.servers.http.*; import gplx.xowa.guis.views.*;
|
||||
public class Gxw_html_server implements Gxw_html {
|
||||
@@ -32,12 +32,13 @@ public class Gxw_html_server implements Gxw_html {
|
||||
public void Html_doc_html_load_tid_(byte v) {html_doc_html_load_tid = v;}
|
||||
public void Html_dispose() {}
|
||||
public void Html_js_enabled_(boolean v) {}
|
||||
public String Html_js_eval_proc_as_str(String name, Object... args) {return Exec_as_str(js_wtr.Write_statement_return_func(name, args).To_str_and_clear());} // TODO: add other params
|
||||
public String Html_js_eval_proc_as_str(String name, Object... args) {return Exec_as_str(js_wtr.Write_statement_return_func(name, args).To_str_and_clear());} // TODO_OLD: add other params
|
||||
public boolean Html_js_eval_proc_as_bool(String name, Object... args) {return Exec_as_bool(js_wtr.Write_statement_return_func(name, args).To_str_and_clear());}
|
||||
public String Html_js_eval_script(String script) {return Exec_as_str(script);}
|
||||
public void Html_js_cbks_add(String js_func_name, GfoInvkAble invk) {}
|
||||
public Object Html_js_eval_script_as_obj(String script) {return Exec_as_str(script);}
|
||||
public void Html_js_cbks_add(String js_func_name, Gfo_invk invk) {}
|
||||
public String Html_js_send_json(String name, String data) {throw Err_.new_unimplemented();}
|
||||
public void Html_invk_src_(GfoEvObj v) {}
|
||||
public void Html_invk_src_(Gfo_evt_itm v) {}
|
||||
public GxwCore_base Core() {throw Err_.new_unimplemented();}
|
||||
public GxwCbkHost Host() {throw Err_.new_unimplemented();} public void Host_set(GxwCbkHost host) {throw Err_.new_unimplemented();}
|
||||
public Object UnderElem() {throw Err_.new_unimplemented();}
|
||||
@@ -58,19 +59,28 @@ public class Gxw_html_server implements Gxw_html {
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_set)) {}
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_set = "set";
|
||||
public static void Init_gui_for_server(Xoae_app app, Xosrv_socket_wtr wtr) {
|
||||
Mem_kit mem_kit = (Mem_kit)gplx.gfui.Gfui_kit_.Mem();
|
||||
Mem_kit mem_kit = (Mem_kit)Gfui_kit_.Mem();
|
||||
mem_kit.New_html_impl_prototype_(new Gxw_html_server(app.Usr_dlg(), wtr)); // NOTE: set prototype before calling Kit_
|
||||
app.Gui_mgr().Kit_(mem_kit);
|
||||
}
|
||||
public static void Assert_tab(Xoae_app app, Xoae_page page) {
|
||||
Xog_win_itm browser_win = app.Gui_mgr().Browser_win();
|
||||
if (browser_win.Active_tab() == null) { // no active tab
|
||||
Xowe_wiki wiki = page.Wikie(); // take wiki from current page; NOTE: do not take from browser_win.Active_tab().Wiki(); DATE:2015-02-23
|
||||
browser_win.Tab_mgr().Tabs_new_init(wiki, page); // create at least one active tab; DATE:2014-07-30
|
||||
if (browser_win.Active_tab() == null) { // no active tab
|
||||
Xowe_wiki wiki = page.Wikie(); // take wiki from current page; NOTE: do not take from browser_win.Active_tab().Wiki(); DATE:2015-02-23
|
||||
browser_win.Tab_mgr().Tabs_new_init(wiki, page); // create at least one active tab; DATE:2014-07-30
|
||||
}
|
||||
}
|
||||
public static Xog_tab_itm Assert_tab2(Xoae_app app, Xowe_wiki wiki) {
|
||||
Xog_win_itm browser_win = app.Gui_mgr().Browser_win();
|
||||
Xog_tab_itm rv = browser_win.Active_tab();
|
||||
if (rv == null) { // no active tab
|
||||
Xoae_page page = Xoae_page.New(wiki, wiki.Ttl_parse(Bry_.new_a7("Empty_tab")));
|
||||
rv = browser_win.Tab_mgr().Tabs_new_init(wiki, page); // create at least one active tab; DATE:2014-07-30
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,30 +36,25 @@ package gplx.xowa.apps.servers.http; import gplx.*; import gplx.xowa.*; import g
|
||||
import gplx.core.threads.*; import gplx.core.net.*; import gplx.core.primitives.*; import gplx.core.envs.*;
|
||||
import gplx.langs.jsons.*; import gplx.langs.htmls.encoders.*;
|
||||
import gplx.xowa.wikis.pages.*;
|
||||
public class Http_server_mgr implements GfoInvkAble {
|
||||
private final Object thread_lock = new Object();
|
||||
private final Gfo_usr_dlg usr_dlg;
|
||||
public class Http_server_mgr implements Gfo_invk {
|
||||
private final Object thread_lock = new Object();
|
||||
private final Gfo_usr_dlg usr_dlg;
|
||||
private Http_server_socket wkr;
|
||||
private byte retrieve_mode = File_retrieve_mode.Mode_wait;
|
||||
private boolean running, init_gui_done;
|
||||
private boolean running, init_gui_needed = true;
|
||||
public Http_server_mgr(Xoae_app app) {
|
||||
this.app = app;
|
||||
this.usr_dlg = app.Usr_dlg();
|
||||
this.request_parser = new Http_request_parser(server_wtr, false);
|
||||
}
|
||||
public Xoae_app App() {return app;} private final Xoae_app app;
|
||||
public Http_server_wtr Server_wtr() {return server_wtr;} private final Http_server_wtr server_wtr = Http_server_wtr_.new_console();
|
||||
public Http_request_parser Request_parser() {return request_parser;} private final Http_request_parser request_parser;
|
||||
public Gfo_url_encoder Encoder() {return encoder;} private final Gfo_url_encoder encoder = Gfo_url_encoder_.New__http_url().Make();
|
||||
public Xoae_app App() {return app;} private final Xoae_app app;
|
||||
public Http_server_wtr Server_wtr() {return server_wtr;} private final Http_server_wtr server_wtr = Http_server_wtr_.new_console();
|
||||
public Http_request_parser Request_parser() {return request_parser;} private final Http_request_parser request_parser;
|
||||
public Gfo_url_encoder Encoder() {return encoder;} private final Gfo_url_encoder encoder = Gfo_url_encoder_.New__http_url().Make();
|
||||
public int Port() {return port;} public Http_server_mgr Port_(int v) {port = v; return this;} private int port = 8080;
|
||||
public Http_server_wkr_pool Wkr_pool() {return wkr_pool;} private final Http_server_wkr_pool wkr_pool = new Http_server_wkr_pool();
|
||||
public Int_pool Uid_pool() {return uid_pool;} private final Int_pool uid_pool = new Int_pool();
|
||||
public Http_server_wkr_pool Wkr_pool() {return wkr_pool;} private final Http_server_wkr_pool wkr_pool = new Http_server_wkr_pool();
|
||||
public Int_pool Uid_pool() {return uid_pool;} private final Int_pool uid_pool = new Int_pool();
|
||||
public byte[] Home() {return home;} public void Home_(byte[] v) {home = Bry_.Add(Byte_ascii.Slash_bry, v);} private byte[] home = Bry_.new_a7("/home/wiki/Main_Page");
|
||||
private void Init_gui() { // create a shim gui to automatically handle default XOWA gui JS calls
|
||||
if (init_gui_done) return;
|
||||
init_gui_done = true;
|
||||
Gxw_html_server.Init_gui_for_server(app, null);
|
||||
}
|
||||
private void Running_(boolean val) {
|
||||
if (val) {
|
||||
if (running)
|
||||
@@ -81,7 +76,7 @@ public class Http_server_mgr implements GfoInvkAble {
|
||||
}
|
||||
public void Run() {
|
||||
if (wkr == null) wkr = new Http_server_socket(this);
|
||||
Thread_adp_.invk_("thread:xowa.http_server.server", wkr, Http_server_socket.Invk_run).Start();
|
||||
Thread_adp_.Start_by_key("thread:xowa.http_server.server", wkr, Http_server_socket.Invk_run);
|
||||
Note("HTTP Server started: Navigate to http://localhost:" + Int_.To_str(port));
|
||||
}
|
||||
public void Run_xowa_cmd(Xoae_app app, String url_encoded_str) {
|
||||
@@ -89,34 +84,43 @@ public class Http_server_mgr implements GfoInvkAble {
|
||||
String cmd = url_converter.Decode_str(url_encoded_str);
|
||||
app.Gfs_mgr().Run_str(cmd);
|
||||
}
|
||||
public String Parse_page_to_html(Http_data__client data__client, byte[] wiki_domain, byte[] page_ttl) {
|
||||
public String Parse_page_to_html(Http_data__client data__client, byte[] wiki_domain, byte[] ttl_bry) {
|
||||
synchronized (thread_lock) {
|
||||
Init_gui();
|
||||
Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(wiki_domain); // get the wiki; assert init for Main_Page; EX:click zh.w on wiki sidebar; DATE:2015-07-19
|
||||
if (Env_.System_memory_total() > Io_mgr.Len_gb) Xow_wiki_.Rls_mem(wiki, true); // release memory at 1 GB; DATE:2015-09-11
|
||||
if (Bry_.Len_eq_0(page_ttl)) page_ttl = wiki.Props().Main_page();
|
||||
Xoa_url page_url = wiki.Utl__url_parser().Parse(page_ttl); // get the url (needed for query args)
|
||||
Xoa_ttl ttl = Xoa_ttl.parse(wiki, page_ttl); // get the ttl
|
||||
Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(page_url, ttl); // get page and parse it
|
||||
Gxw_html_server.Assert_tab(app, page); // HACK: assert at least 1 tab
|
||||
app.Gui_mgr().Browser_win().Active_page_(page); // HACK: init gui_mgr's page for output (which server ordinarily doesn't need)
|
||||
if (page.Missing()) { // if page does not exist, replace with message; else null_ref error; DATE:2014-03-08
|
||||
// create a shim gui to automatically handle default XOWA gui JS calls
|
||||
if (init_gui_needed) {
|
||||
init_gui_needed = false;
|
||||
Gxw_html_server.Init_gui_for_server(app, null);
|
||||
}
|
||||
|
||||
// get the wiki
|
||||
Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(wiki_domain); // assert init for Main_Page; EX:click zh.w on wiki sidebar; DATE:2015-07-19
|
||||
if (Env_.System_memory_total() > Io_mgr.Len_gb) Xowe_wiki_.Rls_mem(wiki, true); // release memory at 1 GB; DATE:2015-09-11
|
||||
|
||||
// get the url / ttl
|
||||
if (Bry_.Len_eq_0(ttl_bry)) ttl_bry = wiki.Props().Main_page();
|
||||
Xoa_url url = wiki.Utl__url_parser().Parse(ttl_bry);
|
||||
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
|
||||
|
||||
// get the page
|
||||
gplx.xowa.guis.views.Xog_tab_itm tab = Gxw_html_server.Assert_tab2(app, wiki); // HACK: assert tab exists
|
||||
Xoae_page page = wiki.Page_mgr().Load_page(url, ttl, tab);
|
||||
app.Gui_mgr().Browser_win().Active_page_(page); // HACK: init gui_mgr's page for output (which server ordinarily doesn't need)
|
||||
if (page.Missing()) { // if page does not exist, replace with message; else null_ref error; DATE:2014-03-08
|
||||
page.Data_raw_(Bry_.new_a7("'''Page not found.'''"));
|
||||
wiki.Parser_mgr().Parse(page, false);
|
||||
}
|
||||
page.Html_data().Head_mgr().Itm__server().Init_by_http(data__client).Enabled_y_();
|
||||
byte[] output_html = wiki.Html_mgr().Page_wtr_mgr().Gen(page, Xopg_page_.Tid_read); // write html from page data
|
||||
|
||||
// generate html
|
||||
switch (retrieve_mode) {
|
||||
case File_retrieve_mode.Mode_skip: break; // noop
|
||||
case File_retrieve_mode.Mode_async_server: app.Gui_mgr().Browser_win().Page__async__bgn(page.Tab_data().Tab()); break;
|
||||
case File_retrieve_mode.Mode_wait:
|
||||
if (page.File_queue().Count() > 0) {
|
||||
app.Gui_mgr().Browser_win().Active_tab().Async();
|
||||
output_html = wiki.Html_mgr().Page_wtr_mgr().Gen(page, Xopg_page_.Tid_read);
|
||||
}
|
||||
case File_retrieve_mode.Mode_async_server: app.Gui_mgr().Browser_win().Page__async__bgn(tab); break;
|
||||
case File_retrieve_mode.Mode_wait:
|
||||
gplx.xowa.guis.views.Xog_async_wkr.Async(page, tab.Html_itm());
|
||||
page = wiki.Page_mgr().Load_page(url, ttl, tab); // HACK: fetch page again so that HTML will now include img data
|
||||
break;
|
||||
}
|
||||
return String_.new_u8(output_html);
|
||||
return String_.new_u8(wiki.Html_mgr().Page_wtr_mgr().Gen(page, Xopg_page_.Tid_read));
|
||||
}
|
||||
}
|
||||
private void Note(String s) {
|
||||
@@ -131,7 +135,7 @@ public class Http_server_mgr implements GfoInvkAble {
|
||||
else if (ctx.Match(k, Invk_retrieve_mode)) return File_retrieve_mode.Xto_str(retrieve_mode);
|
||||
else if (ctx.Match(k, Invk_retrieve_mode_)) retrieve_mode = File_retrieve_mode.Xto_byte(m.ReadStr("v"));
|
||||
else if (ctx.Match(k, Invk_retrieve_mode_list)) return File_retrieve_mode.Options__list;
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
private static final String
|
||||
|
||||
@@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.net.*; import gplx.core.threads.*; import gplx.core.primitives.*;
|
||||
class Http_server_socket implements GfoInvkAble {
|
||||
private final Http_server_mgr server_mgr;
|
||||
class Http_server_socket implements Gfo_invk {
|
||||
private final Http_server_mgr server_mgr;
|
||||
private Server_socket_adp server_socket;
|
||||
public Http_server_socket(Http_server_mgr server_mgr) {this.server_mgr = server_mgr;}
|
||||
public boolean Canceled() {return canceled;}
|
||||
@@ -53,12 +53,12 @@ class Http_server_socket implements GfoInvkAble {
|
||||
}
|
||||
Http_server_wkr_v2 wkr = new Http_server_wkr_v2(server_mgr, wkr_uid);
|
||||
wkr.Init_by_thread(client_socket);
|
||||
Thread_adp_.invk_("thread:xowa.http_server.client", wkr, Http_server_wkr_v2.Invk_run).Start();
|
||||
Thread_adp_.Start_by_key("thread:xowa.http_server.client", wkr, Http_server_wkr_v2.Invk_run);
|
||||
}
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_run)) this.Run();
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} public static final String Invk_run = "run";
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.xowa.apps.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Http_server_wkr_pool {
|
||||
private final Ordered_hash hash = Ordered_hash_.New(); private final Int_obj_ref hash_key = Int_obj_ref.neg1_();
|
||||
private final Ordered_hash hash = Ordered_hash_.New(); private final Int_obj_ref hash_key = Int_obj_ref.New_neg1();
|
||||
public boolean Enabled() {return max != 0;}
|
||||
public int Max() {return max;} private int max;
|
||||
public int Timeout() {return timeout;} private int timeout;
|
||||
@@ -28,7 +28,7 @@ public class Http_server_wkr_pool {
|
||||
public void Add(int uid) {
|
||||
if (max == 0) return; // disabled
|
||||
synchronized (hash) {
|
||||
Int_obj_ref wkr_key = Int_obj_ref.new_(uid);
|
||||
Int_obj_ref wkr_key = Int_obj_ref.New(uid);
|
||||
hash.Add(wkr_key, wkr_key);
|
||||
++len;
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.ios.*;
|
||||
import gplx.core.ios.*; import gplx.core.ios.streams.*;
|
||||
import gplx.core.primitives.*; import gplx.core.net.*; import gplx.langs.htmls.encoders.*;
|
||||
import gplx.xowa.apps.*;
|
||||
import gplx.xowa.htmls.js.*;
|
||||
class Http_server_wkr_v2 implements GfoInvkAble {
|
||||
class Http_server_wkr_v2 implements Gfo_invk {
|
||||
private final int uid;
|
||||
private final Http_server_mgr server_mgr;
|
||||
private final Http_server_wtr server_wtr;
|
||||
@@ -31,7 +31,7 @@ class Http_server_wkr_v2 implements GfoInvkAble {
|
||||
private final Xoae_app app;
|
||||
private final String root_dir_http;
|
||||
private final byte[] root_dir_fsys;
|
||||
private final Bry_bfr tmp_bfr = Bry_bfr.new_(64);
|
||||
private final Bry_bfr tmp_bfr = Bry_bfr_.New_w_size(64);
|
||||
private Socket_adp socket;
|
||||
private Http_data__client data__client;
|
||||
public Http_server_wkr_v2(Http_server_mgr server_mgr, int uid){
|
||||
@@ -149,7 +149,7 @@ class Http_server_wkr_v2 implements GfoInvkAble {
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_run)) {this.Run();}
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} public static final String Invk_run = "run";
|
||||
private static final byte[]
|
||||
@@ -163,7 +163,7 @@ class Xosrv_http_wkr_ {
|
||||
public static void Write_response_as_html(Http_client_wtr client_wtr, boolean cross_domain, byte[] html) {
|
||||
try{
|
||||
client_wtr.Write_bry(Rsp__http_ok);
|
||||
// TODO: add command-line argument to allow testing from local file
|
||||
// TODO_OLD: add command-line argument to allow testing from local file
|
||||
// if (cross_domain)
|
||||
// client_wtr.Write_str("Access-Control-Allow-Origin: *\n"); // No 'Access-Control-Allow-Origin' header is present on the requested resource.
|
||||
client_wtr.Write_bry(Rsp__content_type_html);
|
||||
|
||||
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.ios.*;
|
||||
import gplx.core.ios.*; import gplx.core.ios.streams.*;
|
||||
public class Socket_rdr {
|
||||
private java.net.ServerSocket server;
|
||||
private java.net.Socket client;
|
||||
|
||||
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.primitives.*;
|
||||
import gplx.core.ios.*; import gplx.core.texts.*;
|
||||
import gplx.core.ios.*; import gplx.core.ios.streams.*; import gplx.core.texts.*;
|
||||
public class Xosrv_msg_rdr {
|
||||
public Xosrv_msg_rdr(byte[] default_body_bry, IoStream rdr) {this.default_body_bry = default_body_bry; default_body_bry_len = default_body_bry.length; this.rdr = rdr;} private byte[] header_bry = new byte[24], default_body_bry; int default_body_bry_len;
|
||||
public IoStream Rdr() {return rdr;} private IoStream rdr;
|
||||
@@ -34,7 +34,7 @@ public class Xosrv_msg_rdr {
|
||||
if (cksum != (body_len * 2) + 1) return Xosrv_msg.fail_("checksum failed; body_len:{0} chksum:{1}", body_len, cksum);
|
||||
byte[] body_bry = body_len > default_body_bry_len ? new byte[body_len] : default_body_bry;
|
||||
rdr.Read(body_bry, 0, body_len);
|
||||
Int_obj_ref fld_bgn = Int_obj_ref.zero_(); Bool_obj_ref fail_ref = Bool_obj_ref.n_(); String_obj_ref fld_ref = String_obj_ref.null_();
|
||||
Int_obj_ref fld_bgn = Int_obj_ref.New_zero(); Bool_obj_ref fail_ref = Bool_obj_ref.n_(); String_obj_ref fld_ref = String_obj_ref.null_();
|
||||
byte[] cmd_name = Read_fld(body_bry, body_len, fld_bgn, fail_ref, fld_ref.Val_("cmd_name")); if (fail_ref.Val()) return Read_fld_fail(fld_ref, body_bry);
|
||||
byte[] msg_id = Read_fld(body_bry, body_len, fld_bgn, fail_ref, fld_ref.Val_("msg_id")); if (fail_ref.Val()) return Read_fld_fail(fld_ref, body_bry);
|
||||
byte[] sender = Read_fld(body_bry, body_len, fld_bgn, fail_ref, fld_ref.Val_("sender")); if (fail_ref.Val()) return Read_fld_fail(fld_ref, body_bry);
|
||||
|
||||
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import org.junit.*;
|
||||
import gplx.core.ios.*;
|
||||
import gplx.core.ios.*; import gplx.core.ios.streams.*;
|
||||
public class Xosrv_msg_rdr_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xosrv_msg_rdr_fxt fxt = new Xosrv_msg_rdr_fxt();
|
||||
@Test public void Parse() {
|
||||
@@ -58,7 +58,7 @@ class Xosrv_msg_rdr_fxt {
|
||||
Tfds.Eq_true(String_.Has_at_bgn(msg_text, expd_err), msg_text);
|
||||
}
|
||||
public void Test_print(Xosrv_msg msg, String expd) {
|
||||
Bry_bfr bfr = Bry_bfr.new_();
|
||||
Bry_bfr bfr = Bry_bfr_.New();
|
||||
msg.Print(bfr);
|
||||
Tfds.Eq(expd, bfr.To_str_and_clear());
|
||||
}
|
||||
|
||||
@@ -17,8 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.primitives.*; import gplx.core.ios.*; import gplx.core.envs.*; import gplx.core.threads.*;
|
||||
import gplx.gfui.controls.standards.*;
|
||||
import gplx.langs.jsons.*;
|
||||
public class Xosrv_server implements GfoInvkAble {
|
||||
public class Xosrv_server implements Gfo_invk {
|
||||
private long last_cmd;
|
||||
public Xosrv_socket_rdr Rdr() {return rdr;} private Xosrv_socket_rdr rdr = new Xosrv_socket_rdr();
|
||||
public Xosrv_socket_wtr Wtr() {return wtr;} private Xosrv_socket_wtr wtr = new Xosrv_socket_wtr();
|
||||
@@ -34,7 +35,7 @@ public class Xosrv_server implements GfoInvkAble {
|
||||
rdr.Init(this, rdr_port);
|
||||
wtr.Init(wtr_host, wtr_port);
|
||||
Gxw_html_server.Init_gui_for_server(app, wtr);
|
||||
Thread_adp_.invk_(gplx.xowa.apps.Xoa_thread_.Key_http_server_main, rdr, Xosrv_socket_rdr.Invk_start).Start();
|
||||
Thread_adp_.Start_by_key(gplx.xowa.apps.Xoa_thread_.Key_http_server_main, rdr, Xosrv_socket_rdr.Invk_start);
|
||||
app.Usr_dlg().Note_many("", "", "server started: listening on ~{0}. Press Ctrl+C to exit", rdr_port);
|
||||
last_cmd = Env_.TickCount();
|
||||
Running_(true);
|
||||
@@ -76,7 +77,7 @@ public class Xosrv_server implements GfoInvkAble {
|
||||
trace.Val_("js_args");
|
||||
// xowa_exec_args = (Object[])Array_.Resize(xowa_exec_args, xowa_exec_args.length + 1);
|
||||
// xowa_exec_args[xowa_exec_args.length - 1] = sender;
|
||||
Object rv_obj = gplx.gfui.Gfui_html.Js_args_exec(app.Gui_mgr().Browser_win().Active_html_itm().Js_cbk(), xowa_exec_args);
|
||||
Object rv_obj = Gfui_html.Js_args_exec(app.Gui_mgr().Browser_win().Active_html_itm().Js_cbk(), xowa_exec_args);
|
||||
trace.Val_("json_write: " + Object_.Xto_str_strict_or_null_mark(rv_obj));
|
||||
return json_wtr.Write_root(Bry_xowa_js_result, rv_obj).Bld_as_str();
|
||||
} catch (Exception e) {throw Err_.new_exc(e, "http", "exec_js error", "trace", trace, "msg", msg_text);}
|
||||
@@ -91,7 +92,7 @@ public class Xosrv_server implements GfoInvkAble {
|
||||
else if (ctx.Match(k, Invk_shutdown_interval)) return shutdown_interval;
|
||||
else if (ctx.Match(k, Invk_shutdown_interval_)) shutdown_interval = m.ReadInt("v");
|
||||
else if (ctx.Match(k, Invk_stop)) running = false;
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_stop = "stop", Invk_rdr_port = "rdr_port", Invk_rdr_port_ = "rdr_port_", Invk_wtr_port = "wtr_port", Invk_wtr_port_ = "wtr_port_", Invk_wtr_host = "wtr_host", Invk_wtr_host_ = "wtr_host_"
|
||||
|
||||
@@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
||||
import gplx.core.ios.*;
|
||||
public class Xosrv_socket_rdr implements GfoInvkAble {
|
||||
import gplx.core.ios.*; import gplx.core.ios.streams.*;
|
||||
public class Xosrv_socket_rdr implements Gfo_invk {
|
||||
private Socket_rdr rdr = new Socket_rdr();
|
||||
public int Port() {return port;} private int port;
|
||||
public void Init(Xosrv_server server, int port) {this.server = server; this.port = port;} private Xosrv_server server;
|
||||
@@ -42,7 +42,7 @@ public class Xosrv_socket_rdr implements GfoInvkAble {
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_start)) this.Start();
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} public static final String Invk_start = "start";
|
||||
} public static final String Invk_start = "start";
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ package gplx.xowa.apps.servers.tcp; import gplx.*; import gplx.xowa.*; import gp
|
||||
public class Xosrv_socket_wtr {
|
||||
public String Host() {return host;} private String host = "localhost";
|
||||
public int Port() {return port;} private int port;
|
||||
private Socket_wtr wtr; private Bry_bfr msg_bfr = Bry_bfr.reset_(4 * Io_mgr.Len_kb);
|
||||
private Socket_wtr wtr; private Bry_bfr msg_bfr = Bry_bfr_.Reset(4 * Io_mgr.Len_kb);
|
||||
public void Init(String host, int port) {this.host = host; this.port = port; wtr = new Socket_wtr().Ctor(host, port);}
|
||||
public void Write(Xosrv_msg msg) {
|
||||
wtr.Open();
|
||||
|
||||
Reference in New Issue
Block a user