@ -29,11 +29,10 @@ GPLv3 License: LICENSE-GPLv3.txt
Apache License : LICENSE - APACHE2 . txt
* /
package gplx.xowa.apps.servers.http ; import gplx.* ; import gplx.xowa.* ; import gplx.xowa.apps.* ; import gplx.xowa.apps.servers.* ;
import gplx.core.threads.* ; import gplx.core.net.* ; import gplx.core.primitives.* ; import gplx.core.envs.* ;
import gplx.core.threads.* ; import gplx.core.net.* ; import gplx.core.primitives.* ;
import gplx.langs.jsons.* ; import gplx.langs.htmls.encoders.* ;
import gplx.xowa.wikis.pages.* ;
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.* ;
import gplx.xowa.specials.* ; import gplx.xowa.specials.xowa.errors.* ;
public class Http_server_mgr implements Gfo_invk {
private final Object thread_lock = new Object ( ) ;
private final Gfo_usr_dlg usr_dlg ;
@ -96,73 +95,9 @@ public class Http_server_mgr implements Gfo_invk {
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 [ ] ttl_bry , byte [ ] qarg , byte mode , boolean popup_enabled , String popup_mode , String popup_id ) {
public Http_server_page Parse_page_to_html ( Http_data__client data__client , byte [ ] wiki_domain , byte [ ] ttl_bry , byte [ ] qarg , byte mode , boolean popup_enabled , String popup_mode , String popup_id ) {
synchronized ( thread_lock ) {
// 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 ( Runtime_ . 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
// empty title returns main page; EX: "" -> "Main_Page"
if ( Bry_ . Len_eq_0 ( ttl_bry ) )
ttl_bry = wiki . Props ( ) . Main_page ( ) ;
// generate ttl of domain/wiki/page; needed for pages with leading slash; EX: "/abcd" -> "en.wikipedia.org/wiki//abcd"; ISSUE#:301; DATE:2018-12-16
else {
Bry_bfr tmp_bfr = wiki . Utl__bfr_mkr ( ) . Get_m001 ( ) ;
try {
tmp_bfr . Add ( wiki . Domain_bry ( ) ) . Add ( gplx . xowa . htmls . hrefs . Xoh_href_ . Bry__wiki ) . Add ( ttl_bry ) . Add_safe ( qarg ) ;
ttl_bry = tmp_bfr . To_bry_and_clear ( ) ;
} finally { tmp_bfr . Mkr_rls ( ) ; }
}
Xoa_url url = wiki . Utl__url_parser ( ) . Parse ( ttl_bry ) ;
Xoa_ttl ttl = wiki . Ttl_parse ( url . To_bry_page_w_anch ( ) ) ; // changed from ttl_bry to page_w_anch; DATE:2017-07-24
// handle invalid titles like "Earth]"; ISSUE#:480; DATE:2019-06-02
if ( ttl = = null ) {
ttl = wiki . Ttl_parse ( Xow_special_meta_ . Itm__error . Ttl_bry ( ) ) ;
url = wiki . Utl__url_parser ( ) . Parse ( Xoerror_special . Make_url__invalidTitle ( 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 . Db ( ) . Page ( ) . Exists_n ( ) ) { // if page does not exist, replace with message; else null_ref error; DATE:2014-03-08
page . Db ( ) . Text ( ) . Text_bry_ ( 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_ ( ) ;
// generate html
String rv = null ;
if ( popup_enabled ) {
if ( String_ . Eq ( popup_mode , "more" ) )
rv = wiki . Html_mgr ( ) . Head_mgr ( ) . Popup_mgr ( ) . Show_more ( popup_id ) ;
else
rv = wiki . Html_mgr ( ) . Head_mgr ( ) . Popup_mgr ( ) . Show_init ( popup_id , ttl_bry , ttl_bry ) ;
}
else {
byte [ ] page_html = wiki . Html_mgr ( ) . Page_wtr_mgr ( ) . Gen ( page , mode ) ;
page_html = Bry_ . Replace_many ( page_html , app . Fsys_mgr ( ) . Root_dir ( ) . To_http_file_bry ( ) , Http_server_wkr . Url__fsys ) ;
rv = String_ . new_u8 ( page_html ) ; // NOTE: must generate HTML now in order for "wait" and "async_server" to work with text_dbs; DATE:2016-07-10
boolean rebuild_html = false ;
switch ( retrieve_mode ) {
case File_retrieve_mode . Mode_skip : // noop
break ;
case File_retrieve_mode . Mode_async_server :
rebuild_html = true ;
app . Gui_mgr ( ) . Browser_win ( ) . Page__async__bgn ( tab ) ;
break ;
case File_retrieve_mode . Mode_wait :
rebuild_html = true ;
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 ;
}
if ( rebuild_html ) rv = String_ . new_u8 ( wiki . Html_mgr ( ) . Page_wtr_mgr ( ) . Gen ( page , mode ) ) ;
}
return rv ;
return Http_server_page . Make ( app , data__client , wiki_domain , ttl_bry , qarg , retrieve_mode , mode , popup_enabled , popup_mode , popup_id ) ;
}
}
private void Note ( String s ) {