/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #ifndef CPPCMS_IMPL_CACHED_SETTINGS #define CPPCMS_IMPL_CACHED_SETTINGS #include #include #include #include namespace cppcms { namespace impl { struct cached_settings { struct cached_security { long long multipart_form_data_limit; long long content_length_limit; int file_in_memory_limit; std::string uploads_path; bool display_error_message; std::string email_error_message; struct cached_csrf { bool enable; bool automatic; bool exposed; cached_csrf(json::value const &v) { enable = v.get("security.csrf.enable",false); automatic = v.get("security.csrf.automatic",true); exposed = v.get("security.csrf.exposed",false); } } csrf; cached_security(json::value const &v) : csrf(v) { multipart_form_data_limit = v.get("security.multipart_form_data_limit",64*1024); content_length_limit = v.get("security.content_length_limit",1024); file_in_memory_limit = v.get("security.file_in_memory_limit",128*1024); uploads_path = v.get("security.uploads_path",""); display_error_message = v.get("security.display_error_message",false); email_error_message = v.get("security.email_error_message",""); } } security; struct cached_fastcgi { int cuncurrency_hint; cached_fastcgi(json::value const &v) { cuncurrency_hint = v.get("fastcgi.cuncurrency_hint",-1); } } fastcgi; struct cached_service { std::string ip; int port; int output_buffer_size; int input_buffer_size; int async_output_buffer_size; bool disable_xpowered_by; bool disable_xpowered_by_version; bool generate_http_headers; int worker_threads; int worker_processes; cached_service(json::value const &v) { ip = v.get("service.ip","127.0.0.1"); port = v.get("service.port",8080); output_buffer_size = v.get("service.output_buffer_size",16384); input_buffer_size = v.get("service.input_buffer_size",65536); async_output_buffer_size = v.get("service.async_output_buffer_size",1024); disable_xpowered_by = v.get("service.disable_xpowered_by",false); disable_xpowered_by_version = v.get("service.disable_xpowered_by_version",false); unsigned cpus = booster::thread::hardware_concurrency(); if(cpus == 0) cpus = 1; worker_threads = v.get("service.worker_threads",5 * cpus); worker_processes = v.get("service.worker_processes",0); generate_http_headers = v.get("service.generate_http_headers",false); } } service; struct cached_localization { bool disable_charset_in_content_type; cached_localization(json::value const &v) : disable_charset_in_content_type(v.get("localization.disable_charset_in_content_type",false)) { } } localization; struct cached_gzip { bool enable; int level; int buffer; cached_gzip(json::value const &v) { enable=v.get("gzip.enable",true); level=v.get("gzip.level",-1); buffer=v.get("gzip.buffer",-1); } } gzip; struct cached_http { struct cached_proxy { bool behind; std::vector remote_addr_cgi_variables; } proxy; std::vector script_names; int timeout; cached_http(json::value const &v) { proxy.behind=v.get("http.proxy.behind",false); std::vector default_headers; default_headers.push_back("X-Forwarded-For"); std::vector remote_addr_headers = v.get("http.proxy.remote_addr_headers",default_headers); for(size_t i=0;i()); std::string script = v.get("http.script",""); /* TODO: need to detect "" vs. missing (nullish) */ //if(!script.empty()) script_names.push_back(script); timeout = v.get("http.timeout",30); } } http; struct cached_session { int timeout; std::string expire; bool disable_automatic_load; struct cached_cookies { std::string prefix; std::string domain; std::string path; int time_shift; bool use_age; bool use_exp; bool secure; bool remove_unknown_cookies; } cookies; cached_session(json::value const &v) { timeout = v.get("session.timeout",24*3600); expire = v.get("session.expire","browser"); disable_automatic_load = v.get("session.disable_automatic_load",false); cookies.prefix = v.get("session.cookies.prefix","cppcms_session"); cookies.domain = v.get("session.cookies.domain",""); cookies.path = v.get("session.cookies.path","/"); cookies.time_shift = v.get("session.cookies.time_shift",0); std::string method = v.get("session.cookies.expiration_method","both"); cookies.remove_unknown_cookies = v.get("session.cookies.remove_unknown_cookies",true); if(method == "both") { cookies.use_age = cookies.use_exp = true; } else if (method == "expires") { cookies.use_age = false; cookies.use_exp = true; } else if(method == "max-age") { cookies.use_age = true; cookies.use_exp = false; } else { BOOSTER_WARNING("cppcms") << "Invalid session.cookies.expiration_method " "should be one of 'max-age', 'expires' or 'both' assuming default 'both'"; cookies.use_age = cookies.use_exp = true; } cookies.secure = v.get("session.cookies.secure",false); } } session; struct cached_misc { bool invalid_url_throws; cached_misc(json::value const &v) { invalid_url_throws = v.get("misc.invalid_url_throws",false); } } misc; cached_settings(json::value const &v) : security(v), fastcgi(v), service(v), localization(v), gzip(v), http(v), session(v), misc(v) { } }; } // impl } // cppcms #endif