#ifndef DWEB_APPLICATION_H #define WEB_APPLICATION_H #include "core/object.h" #include #include #include #include #include #include "handler_instance.h" #include #include #include #include "http/HttpRequestImpl.h" #include "http/HttpResponse.h" #include "./drogon/lib/src/ListenerManager.h" #include "./drogon/lib/src/impl_forwards.h" #include "http/SessionManager.h" using namespace drogon; class DRequest; class DWebApplication { public: static std::string default_error_404_body; static std::string default_generic_error_body; void handle_request(DRequest *request); void send_error(int error_code, DRequest *request); void send_file(const std::string &path, DRequest *request); static void default_fallback_error_handler(int error_code, DRequest *request); static void default_404_error_handler(int error_code, DRequest *request); virtual void load_settings(); virtual void setup_routes(); virtual void setup_middleware(); void default_routing_middleware(Object *instance, DRequest *request); virtual void migrate(); void register_request_update(DRequest *request); void unregister_request_update(DRequest *request); void update(); //------- void add_listener(const std::string &ip, uint16_t port, bool useSSL = false, const std::string &certFile = "", const std::string &keyFile = "", bool useOldTLS = false, const std::vector > &sslConfCmds = {}); void set_thread_num(size_t thread_num); size_t get_thread_num() const; void set_ssl_config_commands(const std::vector > &sslConfCmds); void set_ssl_files(const std::string &certPath, const std::string &keyPath); void run(); void stop(); void enable_session(const size_t timeout); void disable_session(); //todo think about it const std::string &get_document_root() const; void set_document_root(const std::string &rootPath); void set_static_file_headers(const std::vector > &headers); const std::string &get_upload_path() const; const std::shared_ptr &get_resolver() const; void set_upload_path(const std::string &uploadPath); void set_file_types(const std::vector &types); void set_max_connection_num(size_t maxConnections); void set_max_connection_num_per_ip(size_t maxConnectionsPerIP); void set_log_path(const std::string &logPath, const std::string &logfileBaseName, size_t logfileSize); void set_log_level(trantor::Logger::LogLevel level); void enable_sendfile(bool sendFile); void enable_gzip(bool useGzip); bool is_gzip_enabled() const; void enable_brotli(bool useBrotli); bool is_brotli_enabled() const; void set_static_files_cache_time(int cacheTime); int static_files_cache_time() const; void set_idle_connection_timeout(size_t timeout); void set_keepalive_requests_number(const size_t number); void set_pipelining_requests_number(const size_t number); void set_gzip_static(bool useGzipStatic); void set_br_static(bool useGzipStatic); void set_client_max_body_size(size_t maxSize); void set_client_max_memory_body_size(size_t maxSize); void set_client_max_web_socket_message_size(size_t maxSize); void set_home_page(const std::string &homePageFile); const std::string &get_home_page() const; void set_implicit_page_enable(bool useImplicitPage); bool is_implicit_page_enabled() const; void set_implicit_page(const std::string &implicitPageFile); const std::string &get_implicit_page() const; size_t get_client_max_body_size() const; size_t get_client_max_memory_body_size() const; size_t get_client_max_web_socket_message_size() const; size_t keepalive_requests_number() const; size_t pipelining_requests_number() const; bool is_running(); void set_unicode_escaping_in_json(bool enable); bool is_unicode_escaping_used_in_json() const; void set_float_precision_in_json(unsigned int precision, const std::string &precisionType); const std::pair &get_float_precision_in_json() const; trantor::EventLoop *get_loop() const; trantor::EventLoop *get_io_loop(size_t id) const; void set_server_header_field(const std::string &server); void enable_server_header(bool flag); void enable_date_header(bool flag); bool send_server_header() const; bool send_date_header() const; const std::string &get_server_header_string() const; std::vector get_listeners() const; bool use_sendfile() const; bool support_ssl() const; size_t get_current_thread_index() const; void enable_reuse_port(bool enable); bool reuse_port() const; void on_async_request(const HttpRequestImplPtr &req, std::function &&callback); void on_new_websock_request(const HttpRequestImplPtr &req, std::function &&callback, const WebSocketConnectionImplPtr &wsConnPtr); void on_connection(const trantor::TcpConnectionPtr &conn); void find_session_for_request(const HttpRequestImplPtr &req); //to request //void forward(const HttpRequestPtr &req, std::function &&callback,const std::string &hostString,double timeout); //void forward(const HttpRequestImplPtr &req,std::function &&callback,const std::string &hostString,double timeout = 0); DWebApplication(); virtual ~DWebApplication(); public: DHandlerInstance index_func; std::map main_route_map; std::vector middlewares; std::map > error_handler_map; std::function default_error_handler_func; protected: std::mutex _update_registered_requests_mutex; std::vector _update_registered_requests; // We use a uuid string as session id; // set sessionTimeout_=0 to make location session valid forever based on // cookies; size_t _session_timeout{ 0 }; size_t _idle_connection_timeout{ 60 }; bool _use_session{ false }; std::string _server_header{ "server: rcpp_framework\r\n" }; std::string _root_path{ "./" }; std::string _upload_path; std::atomic_bool _running{ false }; size_t _thread_num{ 1 }; std::vector > _ssl_conf_cmds; std::string _ssl_cert_path; std::string _ssl_key_path; size_t _max_connection_num_per_ip{ 0 }; std::unordered_map _connections_num_map; int64_t _max_connection_num{ 100000 }; std::atomic _connection_num{ 0 }; std::string _log_path; std::string _logfile_base_name; size_t _logfile_size{ 100000000 }; size_t _keepalive_requests_number{ 0 }; size_t _pipelining_requests_number{ 0 }; bool _use_sendfile{ true }; bool _use_gzip{ true }; bool _use_brotli{ false }; bool _using_unicode_escaping{ true }; std::pair _float_precision_in_json{ 0, "significant" }; size_t _client_max_body_size{ 1024 * 1024 }; size_t _client_max_memory_body_size{ 64 * 1024 }; size_t _client_max_web_socket_message_size{ 128 * 1024 }; std::string _home_page_file{ "index.html" }; const std::unique_ptr _listener_manager; std::unique_ptr _session_manager; bool _enable_server_header{ true }; bool _enable_date_header{ true }; bool _reuse_port{ false }; trantor::EventLoop *_loop; std::vector > _beginning_advices; std::vector > _new_connection_advices; std::vector > _sync_advices; std::vector > _pre_sending_advices; }; #endif