diff --git a/web/CXM_making_a_web_site.anubis b/web/CXM_making_a_web_site.anubis index 5f5dae5..3244e0d 100644 --- a/web/CXM_making_a_web_site.anubis +++ b/web/CXM_making_a_web_site.anubis @@ -554,8 +554,9 @@ define List(HTTP_header) define WEB_Session -> String // the function constructed returns the name of the state make_save_session_function ( - Int timeout, - String state_directory + Int timeout, + String state_directory, + (LogLevel, String) -> One logger ) = (WEB_Session s_var) |-> //Set the new timeout @@ -567,10 +568,10 @@ define WEB_Session -> String // the function constructed returns the name of session_name = s_var.session_id, //println("make_save_state_function " + state_directory+"/s"+state_name); if save(to_be_saved,state_directory+"/"+session_name) is ok then - println("----- session ["+session_name+"] saved"+dump_WEB_Session_Fields(*s_var.fields)); + logger(logInfo, "----- session ["+session_name+"] saved"+dump_WEB_Session_Fields(*s_var.fields)); session_name else - println("Cannot create session file in '"+state_directory+"'.\n"); + logger(logError, ("Cannot create session file in '"+state_directory+"'.\n")); "" . @@ -621,7 +622,8 @@ define Previous_Session define (List(String) file_names) -> One make_delete_out_of_date_sessions_function ( - String state_directory + String state_directory, + (LogLevel, String) -> One logger ) = (List(String) file_names) |-df-> if file_names is @@ -644,7 +646,7 @@ define (List(String) file_names) -> One df(t) ) else - println("Can't retreive session "+h+", hence will be deleted"); + logger(logError, "Can't retreive session "+h+", hence will be deleted"); (forget(remove(file_path)); df(t)) }. @@ -3064,19 +3066,23 @@ read CXM_web_arg_encode.anubis define ($State s) -> String // the function constructed returns the name of the state - make_save_state_function - ( - Int timeout, - String state_directory - ) = - ($State s) |-> + make_save_state_function + ( + Int timeout, + String state_directory, + (LogLevel, String) -> One logger + )= + ($State s) |-> with time_stamp = now+timeout, to_be_saved = (time_stamp,s), state_name = to_ascii(sha1(s)), //println("make_save_state_function " + state_directory+"/s"+state_name); - if save(to_be_saved,state_directory+"/s"+state_name) is ok - then state_name - else (print("Cannot create state file in '"+state_directory+"'.\n"); ""). + if save(to_be_saved,state_directory+"/s"+state_name) is ok then + state_name + else + logger(logError, "Cannot create state file in '"+state_directory+"'.\n"); + "" +. When a request arrives, we need to retrieve the previous state from the server's @@ -3414,43 +3420,47 @@ define ($State previous, HTTP_Info http_info, List(Web_arg) lwa, Bool is_https) -> $State - make_apply_action_function - ( - List(Web_Action($State)) actions_list - ) = - with f = - ($State previous, - String action_name, - HTTP_Info http_info, - List(Web_arg) lwa, - Bool is_https, - List(Web_Action($State)) actions) |-f-> + make_apply_action_function + ( + List(Web_Action($State)) actions_list, + (LogLevel, String) -> One logger //logger + )= + with f = + ($State previous, + String action_name, + HTTP_Info http_info, + List(Web_arg) lwa, + Bool is_https, + List(Web_Action($State)) actions) |-f-> //println("Looking for action ["+action_name+"]"); if actions is { - [ ] then print("action '"+action_name+ - "' not found.\n"); previous, - [ac1 . others] then if ac1 is + [ ] then + logger(logError, "action '"+action_name+"' not found.\n"); previous, + [ac1 . others] then if ac1 is { - http_action(an,allow,do_it) then - if an = action_name - then if is_https - then (print("HTTP action '"+an+ - "' called through HTTPS (denied).\n"); - previous) - else if allow(previous) - then do_it(http_info,lwa,previous) - else previous - else f(previous,action_name,http_info,lwa,is_https,others), - + //check for http action + http_action(an, allow, do_it) then + + //Action name found + if an = action_name then + if is_https then + (logger(logError, "HTTP action '"+an+"' called through HTTPS (denied).\n"); previous) + else + if allow(previous) then + do_it(http_info,lwa,previous) + else + previous + else + f(previous,action_name,http_info,lwa,is_https,others), + //check https action https_action(an,allow,do_it) then if an = action_name then if is_https then if allow(previous) then do_it(http_info,lwa,previous) else previous - else (print("HTTPS action '"+an+ - "' called through HTTP (denied).\n"); + else (logger(logError, "HTTPS action '"+an+"' called through HTTP (denied).\n"); previous) else f(previous,action_name,http_info,lwa,is_https,others), @@ -3548,40 +3558,41 @@ define List(HTTP_header) public define Web_Site - make_web_site_description - ( - String website_name, // site_UID - List(String) common_names, // for example: ["www.our-business.com"] - String site_directory, - String state_directory, - One -> One init, - (HTTP_Info, - List(Web_arg), - Bool is_https) -> $State initial_state, - ($State expired, - Maybe(String), - HTTP_Info, - List(Web_arg), - Bool is_https) -> $State ticket_expired_state, - (Maybe(String), - HTTP_Info, - List(Web_arg), - Bool is_https) -> $State ticket_lost_state, - List(Web_Action($State)) actions, - $State -> HTTP_Answer compute_page, - $State -> List(HTTP_header) additional_headers, - List(HTTP_header) constant_additional_headers, - Int timeout, - Redirections redirections, - String charset, - List(String) journal_extensions, - List(String) journal_headers, - String secret, - List(MIME) known_mime_types, - (String action_name, - List(Web_arg) args) -> One before_send_file - ) = - init(unique); + make_web_site_description + ( + String website_name, // site_UID + List(String) common_names, // for example: ["www.our-business.com"] + String site_directory, + String state_directory, + One -> One init, + (HTTP_Info, + List(Web_arg), + Bool is_https) -> $State initial_state, + ($State expired, + Maybe(String), + HTTP_Info, + List(Web_arg), + Bool is_https) -> $State ticket_expired_state, + (Maybe(String), + HTTP_Info, + List(Web_arg), + Bool is_https) -> $State ticket_lost_state, + List(Web_Action($State)) actions, + $State -> HTTP_Answer compute_page, + $State -> List(HTTP_header) additional_headers, + List(HTTP_header) constant_additional_headers, + Int timeout, + Redirections redirections, + String charset, + List(String) journal_extensions, + List(String) journal_headers, + (LogLevel, String) -> One logger, //logger + String secret, + List(MIME) known_mime_types, + (String action_name, + List(Web_arg) args) -> One before_send_file + )= + init(unique); // @@ -3594,10 +3605,10 @@ public define Web_Site // // construct tool functions // TODO 'make_separate_web_args_function' must retrieve state_cookies before parsing web_args if using_state_cookies is true - with save_state = make_save_state_function(timeout, state_directory), + with save_state = make_save_state_function(timeout, state_directory, logger), retrieve_state = make_retrieve_state_function(state_directory), separate_web_args = make_separate_web_args_function(state_directory, retrieve_state, website_name), - apply_action = make_apply_action_function(actions), + apply_action = make_apply_action_function(actions, logger), // // construct the site handler // @@ -3670,6 +3681,7 @@ public define Web_Site charset, journal_extensions, journal_headers, + logger, secret, known_mime_types, site_handler(http_port, https_port), @@ -3717,7 +3729,7 @@ define HTTP_Answer // content of page sequence([ - preformated([size(14)], "Anubis Web Server - Calexium Lib v1.00 - Anubis language v1.14"), + preformated([size(14)],"Anubis Web Server - Standard Lib v1.14.0.0 - Anubis language v1.14"), preformated([size(12)],"Error "+to_String(http_status)), preformated([size(12)],"Internal message :"+message), br, @@ -3816,38 +3828,40 @@ define Maybe(WEB_Controller) ( String controller_name, List(WEB_Controller) controllers, + (LogLevel, String) -> One logger //logger )= if controllers is { [] then - println("Can't find controller ["+controller_name+"]"); + logger(logWarning, "Can't find controller ["+controller_name+"]"); failure, [h . t] then if h.name = controller_name then //println("Controller ["+controller_name+"] found"); success(h) else - get_controller(controller_name, t) + get_controller(controller_name, t, logger) } . define WEB_Page_Renderer get_page_renderer ( - String renderer_name, - List(WEB_Page_Renderer) renderers, + String renderer_name, + List(WEB_Page_Renderer) renderers, + (LogLevel, String) -> One logger //logger )= if renderers is { [] then - println("Can't find page_renderer ["+renderer_name+"], use the default"); + logger(logWarning, "Can't find page_renderer ["+renderer_name+"], use the default"); default_page_renderer, [h . t] then if h.name = renderer_name then //println("Controller ["+controller_name+"] found"); h else - get_page_renderer(renderer_name, t) + get_page_renderer(renderer_name, t, logger) } . @@ -3857,18 +3871,19 @@ define WEB_Page_Renderer WEB_Session _session, WEB_Page_Renderer _current_page_renderer, List(WEB_Page_Renderer) renderers, + (LogLevel, String) -> One logger //logger )= //get the renderer page name to use from the session "AWS_PAGE_RENDERER" if get_String(_session.fields, "AWS_PAGE_RENDERER") is { - failure then println("No renderer defined, use the default"); default_page_renderer, + failure then logger(logWarning, "No renderer defined, use the default"); default_page_renderer, success(renderer_name) then //check if the renderer_page already in cache if renderer_name = _current_page_renderer.name then _current_page_renderer else //if not in cache, use the selector function - get_page_renderer(renderer_name, renderers) + get_page_renderer(renderer_name, renderers, logger) } . @@ -3887,7 +3902,8 @@ define (Maybe(WEB_Session), HTTP_Answer) Maybe(String) _mb_action_name, (HTTP_Info, Var(List(Web_arg)), - Bool is_https) -> WEB_Session initial_session, + Bool is_https) -> WEB_Session initial_session, + (LogLevel, String) -> One logger //logger )= //get the action name with mb_action_name = @@ -3902,47 +3918,47 @@ define (Maybe(WEB_Session), HTTP_Answer) failure then //(failure, error_page(http_not_found, "Action name failure", _session)), with new_session = initial_session(_session.web_request.http_info, _session.web_request.lwa, _session.web_request.is_https), - if get_controller(get_String(*new_session.web_request.lwa, "aws_controller", "root"), controllers) is + if get_controller(get_String(*new_session.web_request.lwa, "aws_controller", "root"), controllers, logger) is { failure then (failure, error_page(http_not_found, "Initial Session Controller not found", new_session)), - success(new_controller) then apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, failure, initial_session), + success(new_controller) then apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, failure, initial_session, logger), }, success(action_name) then - println("ACTION_NAME ["+action_name+"]"); + logger(logInfo, "ACTION_NAME ["+action_name+"]"); if apply_action(_session, action_name, *controller.controller_actions) is { http_answer(session, answer) then (success(session), answer), http_answer(answer) then (success(_session), answer), redirect(new_session) then - if get_controller(get_String(*new_session.web_request.lwa, "aws_controller", "root"), controllers) is + if get_controller(get_String(*new_session.web_request.lwa, "aws_controller", "root"), controllers, logger) is { failure then (failure, error_page(http_not_found, "Redirect Controller not found", new_session)), - success(new_controller) then apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, failure, initial_session), + success(new_controller) then apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, failure, initial_session, logger), }, redirect(new_session, r_controller_name, r_action_name) then - if get_controller(r_controller_name, controllers) is + if get_controller(r_controller_name, controllers, logger) is { failure then (failure, error_page(http_not_found, "Redirect Controller "+r_controller_name+" not found", new_session)), success(new_controller) then - apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, success(r_action_name), initial_session), + apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, new_session, success(r_action_name), initial_session, logger), }, redirect_to_previous then - if get_controller(get_String(*_session.previous_web_request.lwa, "aws_controller", "root"), controllers) is + if get_controller(get_String(*_session.previous_web_request.lwa, "aws_controller", "root"), controllers, logger) is { failure then (failure, error_page(http_not_found, "Redirect to previous Controller not found", _session)), success(new_controller) then since _session is web_session(id, lang, entries, _, previous), - apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, web_session(id, lang, entries, previous, previous), failure, initial_session), + apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, web_session(id, lang, entries, previous, previous), failure, initial_session, logger), }, redirect_to_previous(entries) then - if get_controller(get_String(*_session.previous_web_request.lwa, "aws_controller", "root"), controllers) is + if get_controller(get_String(*_session.previous_web_request.lwa, "aws_controller", "root"), controllers, logger) is { failure then (failure, error_page(http_not_found, "Redirect to previous Controller not found", _session)), success(new_controller) then since _session is web_session(id, lang, _, _, previous), - apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, web_session(id, lang, entries, previous, previous), failure, initial_session), + apply_controller_action(new_controller, controllers, _current_page_renderer, page_renderers, cinfo, web_session(id, lang, entries, previous, previous), failure, initial_session, logger), }, //ajax(answer) then (failure, answer), //ajax with modified session that must be saved @@ -3955,7 +3971,7 @@ define (Maybe(WEB_Session), HTTP_Answer) send_file(file_path, c_disposition) then (failure, send_file(file_path, c_disposition)), renderer_content(session, title, content) then with the_session = if session is {failure then _session, success(__session) then __session}, - with page_renderer = get_page_renderer(the_session, _current_page_renderer, page_renderers), + with page_renderer = get_page_renderer(the_session, _current_page_renderer, page_renderers, logger), (session, page_renderer.page_layout(the_session, title, content)) } } @@ -3986,7 +4002,8 @@ public define Web_Site Redirections redirections, String charset, List(String) journal_extensions, - List(String) journal_headers, + List(String) journal_headers, + (LogLevel, String) -> One logger, //logger String secret, List(MIME) known_mime_types, (String action_name, @@ -4007,7 +4024,7 @@ public define Web_Site // // construct tool functions // TODO 'make_separate_web_args_function' must retrieve state_cookies before parsing web_args if using_state_cookies is true - with save_session = make_save_session_function(timeout, state_directory), + with save_session = make_save_session_function(timeout, state_directory, logger), with current_page_renderer = var((WEB_Page_Renderer)default_page_renderer), // retrieve_session = make_retrieve_session_function(state_directory, website_name), //separate_web_args = make_separate_web_args_function(state_directory, retrieve_state), @@ -4022,20 +4039,20 @@ public define Web_Site List(Web_arg) _lwa, Bool is_https) |-> //(Printable_tree) - //println("host_name "+host_name); - //println(dump_http_info(http_info)); - println(dump_web_arg_values(_lwa)); + logger(logTrace,"host_name "+host_name); + logger(logTrace,dump_http_info(http_info)); + logger(logTrace, dump_web_arg_values(_lwa)); with cinfo = info(host_name, http_port, https_port, site_directory, secret), //retrieve the previous session and determine the new one with current_session = if retrieve_session(http_info, state_directory, website_name) is { not_found then - println("previous state not found"); + logger(logInfo, "previous state not found"); initial_session(http_info, var(_lwa), is_https), out_of_date(previous_session) then - println("previous out_of_date"); + logger(logInfo, "previous out_of_date"); //expired_session(previous_session, http_info, var(_lwa), is_https), since previous_session is web_session(id, lang, entries, previous, _), web_session(id, lang, entries, web_request(http_info, var(_lwa), is_https), previous) @@ -4048,13 +4065,13 @@ public define Web_Site //apply the action according to current session //since apply_controller_action(get_controller(get_String(lwa, "aws_controller", "root"), *web_controllers), *web_controllers, current_session) - since if get_controller(get_String(*current_session.web_request.lwa, "aws_controller", "root"), *web_controllers) is + since if get_controller(get_String(*current_session.web_request.lwa, "aws_controller", "root"), *web_controllers, logger) is { failure then (failure, error_page(http_not_found, "Controller not found", current_session)), success(new_controller) then - apply_controller_action(new_controller, *web_controllers, *current_page_renderer, *web_page_renderers, cinfo, current_session, failure, initial_session), + apply_controller_action(new_controller, *web_controllers, *current_page_renderer, *web_page_renderers, cinfo, current_session, failure, initial_session, logger), } is (mb_new_session, http_answer), @@ -4080,7 +4097,7 @@ public define Web_Site // make the delete_out_of_date function // delete_out_of_date = - make_delete_out_of_date_sessions_function(site_directory+"/states"), + make_delete_out_of_date_sessions_function(site_directory+"/states", logger), // // construct the web site description // @@ -4091,6 +4108,7 @@ public define Web_Site charset, journal_extensions, journal_headers, + logger, secret, known_mime_types, site_handler(http_port,https_port), @@ -4111,22 +4129,23 @@ public define Web_Site define String get_site_uid ( - String site_path + String site_path, + (LogLevel, String) -> One logger //logger )= with file_name = site_path+"/site_UID", if read_from_file(file_name) is { cannot_find_file then - println("site UID doesn't exists. Generating it now"); + logger(logInfo,"site UID doesn't exists. Generating one now"); with uid = generate_random_string(9), if write_to_file(file_name, to_byte_array(uid)) is { - cannot_open_file then println("Can't create site UID here "+file_name);"", - write_error(_) then println("Can't write site UID here "+file_name);"", + cannot_open_file then logger(logError, "Can't create site UID here "+file_name);"", + write_error(_) then logger(logError, "Can't write site UID here "+file_name);"", ok then uid } read_error(_) then - println("cannot read site UID from "+file_name);"" + logger(logError, "cannot read site UID from "+file_name);"" ok(ba) then to_string(ba) } . @@ -4159,7 +4178,8 @@ public define Web_Site Redirections redirections, String charset, List(String) journal_extensions, - List(String) journal_headers, + List(String) journal_headers, + (LogLevel, String) -> One logger, //logger String secret, List(MIME) known_mime_types, (String action_name, @@ -4168,8 +4188,8 @@ public define Web_Site ) = //generate an unique ID if doesn't exist in root of site_directory - with site_UID = get_site_uid(site_directory), - make_web_site_description(site_UID, common_names, site_directory, state_directory, init, initial_state, ticket_expired_state, ticket_lost_state, actions, compute_page, additional_headers, constant_additional_headers, timeout, redirections, charset, journal_extensions, journal_headers, secret, known_mime_types, before_send_file) + with site_UID = get_site_uid(site_directory, logger), + make_web_site_description(site_UID, common_names, site_directory, state_directory, init, initial_state, ticket_expired_state, ticket_lost_state, actions, compute_page, additional_headers, constant_additional_headers, timeout, redirections, charset, journal_extensions, journal_headers, logger, secret, known_mime_types, before_send_file) . diff --git a/web/CXM_multihost_http_server.anubis b/web/CXM_multihost_http_server.anubis index 4085171..294e4a2 100644 --- a/web/CXM_multihost_http_server.anubis +++ b/web/CXM_multihost_http_server.anubis @@ -4,6 +4,8 @@ *Title* A Multi Host HTTP/HTTPS Server *Copyright* Copyright (c) Anubis Team 2003-2007. + (c) Calexium 2007-2013 + (c) David René 2014-2019 *Authors* Alain Prouté @@ -12,9 +14,9 @@ *Revised* - June 2015 : Optimization of the file upload - July 2007 : Initial version in calexium_lib - + June 2015 : Optimization of the file upload + July 2007 : Initial version in calexium_lib + March 2019 : move as standard lib *Overviews* In this file a HTTP/HTTPS server is defined, which is able to handle multiple hosts @@ -171,10 +173,9 @@ read system/string.anubis read system/files.anubis read system/lists.anubis read system/data_io.anubis +read system/logger.anubis read web/mime.anubis - - *** (4) Site descriptions. The type HTTP_Info gathers informations comming along with the client's request. These @@ -227,6 +228,7 @@ public type Web_Site_Description: String charset, List(String) journal_extensions, List(String) journal_headers, + (LogLevel, String) -> One logger, //logger String authorization_secret, List(MIME) known_mime_types, (String host_name, @@ -1282,11 +1284,11 @@ define One ( if file(site_directory(desc)+"/journal/"+make_current_journal_file_name,append) is { - failure then unique, - success(journal_file) then + failure then unique, + success(journal_file) then forget(reliable_write(file(journal_file),ba_msg)) - }; - forget(reliable_write(file(stdout),ba_msg)) + } + //forget(reliable_write(file(stdout),ba_msg)) ). @@ -3231,20 +3233,21 @@ define Maybe(String) }. define Maybe((String,Web_Site_Description)) - get_site - ( - String requested_host, - List(Web_Site_Description) sites - ) = - if sites is - { - [ ] then print("Requested host '"+requested_host+"' does not exist.\n"); failure, - [site1 . others] then - if site1 is web_site_description(common_names,_,_,_,_,_,_,_,_,_,_) then - if member(common_names,requested_host) - then success((requested_host,site1)) - else get_site(requested_host,others) - }. + get_site + ( + String requested_host, + List(Web_Site_Description) sites + )= + if sites is + { + [ ] then print("Requested host '"+requested_host+"' does not exist.\n"); failure, + [site1 . others] then + if site1 is web_site_description(common_names,_,_,_,_,_,_,_,_,_,_,_) then + if member(common_names,requested_host) + then success((requested_host,site1)) + else get_site(requested_host,others) + } +. define Maybe((String,Web_Site_Description)) -- libgit2 0.21.4