/* This is a JSON format configuration file
 */
{
    /*
    //ssl:The global SSL settings. "key" and "cert" are the path to the SSL key and certificate. While
    //    "conf" is an array of 1 or 2-element tuples that supplies file style options for `SSL_CONF_cmd`.
    "ssl": {
        "cert": "../../trantor/trantor/tests/server.crt",
        "key": "../../trantor/trantor/tests/server.key",
        "conf": [
            //["Options", "-SessionTicket"], 
            //["Options", "Compression"]
        ]
    },
    "listeners": [
        {
            //address: Ip address,0.0.0.0 by default
            "address": "0.0.0.0",
            //port: Port number
            "port": 80,
            //https: If true, use https for security,false by default
            "https": false
        },
        {
            "address": "0.0.0.0",
            "port": 443,
            "https": true,
            //cert,key: Cert file path and key file path, empty by default,
            //if empty, use the global setting
            "cert": "",
            "key": "",
            //use_old_tls: enable the TLS1.0/1.1, false by default
            "use_old_tls": false,
            "ssl_conf": [
                //["MinProtocol", "TLSv1.3"]
            ]
        }
    ],
    "db_clients": [
        {
            //name: Name of the client,'default' by default
            "name": "default",
            //rdbms: Server type, postgresql,mysql or sqlite3, "postgresql" by default
            "rdbms": "postgresql",
            //filename: Sqlite3 db file name
            //"filename":"",
            //host: Server address,localhost by default
            "host": "127.0.0.1",
            //port: Server port, 5432 by default
            "port": 5432,
            //dbname: Database name
            "dbname": "test",
            //user: 'postgres' by default
            "user": "",
            //passwd: '' by default
            "passwd": "",
            //is_fast: false by default, if it is true, the client is faster but user can't call
            //any synchronous interface of it.
            "is_fast": false,
            //client_encoding: The character set used by the client. it is empty string by default which 
            //means use the default character set.
            //"client_encoding": "",
            //number_of_connections: 1 by default, if the 'is_fast' is true, the number is the number of  
            //connections per IO thread, otherwise it is the total number of all connections.  
            "number_of_connections": 1,
            //timeout: -1.0 by default, in seconds, the timeout for executing a SQL query.
            //zero or negative value means no timeout.
            "timeout": -1.0,
            //auto_batch: this feature is only available for the PostgreSQL driver(version >= 14.0), see
            //the wiki for more details.
            "auto_batch": false
            //connect_options: extra options for the connection. Only works for PostgreSQL now.
            //For more information, see https://www.postgresql.org/docs/16/libpq-connect.html#LIBPQ-CONNECT-OPTIONS
            //"connect_options": { "statement_timeout": "1s" }
        }
    ],
    "redis_clients": [
        {
            //name: Name of the client,'default' by default
            "name": "default",
            //host: Server IP, 127.0.0.1 by default
            "host": "127.0.0.1",
            //port: Server port, 6379 by default
            "port": 6379,
            //username: '' by default which means 'default' in redis ACL
            "username": "",
            //passwd: '' by default
            "passwd": "",
            //db index: 0 by default
            "db": 0,
            //is_fast: false by default, if it is true, the client is faster but user can't call
            //any synchronous interface of it.
            "is_fast": false,
            //number_of_connections: 1 by default, if the 'is_fast' is true, the number is the number of  
            //connections per IO thread, otherwise it is the total number of all connections.  
            "number_of_connections": 1,
            //timeout: -1.0 by default, in seconds, the timeout for executing a command.
            //zero or negative value means no timeout.
            "timeout": -1.0
        }
    ],*/
    "app": {
        //number_of_threads: The number of IO threads, 1 by default, if the value is set to 0, the number of threads
        //is the number of CPU cores
        "number_of_threads": 1,
        //enable_session: False by default
        "enable_session": true,
        "session_timeout": 0,
        //string value of SameSite attribute of the Set-Cookie HTTP response header
        //valid value is either 'Null' (default), 'Lax', 'Strict' or 'None'
        "session_same_site": "Null",
        //session_cookie_key: The cookie key of the session, "JSESSIONID" by default
        "session_cookie_key": "JSESSIONID",
        //session_max_age: The max age of the session cookie, -1 by default
        "session_max_age": -1,
        //document_root: Root path of HTTP document, default path is ./
        "document_root": "./",
        //home_page: Set the HTML file of the home page, the default value is "index.html"
        //If there isn't any handler registered to the path "/", the home page file in the "document_root" is send to clients as a response
        //to the request for "/".
        "home_page": "index.html",
        //use_implicit_page: enable implicit pages if true, true by default
        "use_implicit_page": true,
        //implicit_page: Set the file which would the server access in a directory that a user accessed.
        //For example, by default, http://localhost/a-directory resolves to http://localhost/a-directory/index.html.
        "implicit_page": "index.html",
        //static_file_headers: Headers for static files
        /*"static_file_headers": [
            {
                "name": "field-name",
                "value": "field-value"
            }
        ],*/
        //upload_path: The path to save the uploaded file. "uploads" by default. 
        //If the path isn't prefixed with /, ./ or ../,
        //it is relative path of document_root path
        "upload_path": "uploads",
        /* file_types:
         * HTTP download file types,The file types supported by drogon
         * by default are "html", "js", "css", "xml", "xsl", "txt", "svg",
         * "ttf", "otf", "woff2", "woff" , "eot", "png", "jpg", "jpeg",
         * "gif", "bmp", "ico", "icns", etc. */
        "file_types": [
            "gif",
            "png",
            "jpg",
            "js",
            "css",
            "html",
            "ico",
            "swf",
            "xap",
            "apk",
            "cur",
            "xml",
            "webp",
            "svg"
        ],
        // mime: A dictionary that extends the internal MIME type support. Maps extensions into new MIME types
        // note: This option only adds MIME to the sever. `file_types` above have to be set for the server to serve them.
        "mime": {
            // "text/markdown": "md",
            // "text/gemini": ["gmi", "gemini"]
        },
        //locations: An array of locations of static files for GET requests.
        "locations": [
            {
                //uri_prefix: The URI prefix of the location prefixed with "/", the default value is "" that disables the location.
                //"uri_prefix": "/.well-known/acme-challenge/",
                //default_content_type: The default content type of the static files without
                //an extension. empty string by default.
                "default_content_type": "text/plain",
                //alias: The location in file system, if it is prefixed with "/", it 
                //presents an absolute path, otherwise it presents a relative path to 
                //the document_root path. 
                //The default value is "" which means use the document root path as the location base path.
                "alias": "",
                //is_case_sensitive: indicates whether the URI prefix is case sensitive.
                "is_case_sensitive": false,
                //allow_all: true by default. If it is set to false, only static files with a valid extension can be accessed.
                "allow_all": true,
                //is_recursive: true by default. If it is set to false, files in sub directories can't be accessed.
                "is_recursive": true,
                //filters: string array, the filters applied to the location.
                "filters": []
            }
        ],
        //max_connections: maximum number of connections, 100000 by default
        "max_connections": 100000,
        //max_connections_per_ip: maximum number of connections per client, 0 by default which means no limit
        "max_connections_per_ip": 0,
        //Load_dynamic_views: False by default, when set to true, drogon
        //compiles and loads dynamically "CSP View Files" in directories defined
        //by "dynamic_views_path"
        "load_dynamic_views": false,
        //dynamic_views_path: If the path isn't prefixed with /, ./ or ../,
        //it is relative path of document_root path
        "dynamic_views_path": [
            "./views"
        ],
        //dynamic_views_output_path: Default by an empty string which means the output path of source 
        //files is the path where the csp files locate. If the path isn't prefixed with /, it is relative 
        //path of the current working directory.
        "dynamic_views_output_path": "",
        //json_parser_stack_limit: 1000 by default, the maximum number of stack depth when reading a json string by the jsoncpp library.
        "json_parser_stack_limit": 1000,
        //enable_unicode_escaping_in_json: true by default, enable unicode escaping in json.
        "enable_unicode_escaping_in_json": true,
        //float_precision_in_json: set precision of float number in json. 
        "float_precision_in_json": {
            //precision: 0 by default, 0 means use the default precision of the jsoncpp lib. 
            "precision": 0,
            //precision_type: must be "significant" or "decimal", defaults to "significant" that means 
            //setting max number of significant digits in string, "decimal" means setting max number of 
            //digits after "." in string
            "precision_type": "significant"
        },
        //log: Set log output, drogon output logs to stdout by default
        "log": {
            //use_spdlog: Use spdlog library to log
            "use_spdlog": false,
            //log_path: Log file path,empty by default,in which case,logs are output to the stdout
            //"log_path": "./",
            //logfile_base_name: Log file base name,empty by default which means drogon names logfile as
            //drogon.log ...
            "logfile_base_name": "",
            //log_size_limit: 100000000 bytes by default,
            //When the log file size reaches "log_size_limit", the log file is switched.
            "log_size_limit": 100000000,
            //max_files: 0 by default,
            //When the number of old log files exceeds "max_files", the oldest file will be deleted. 0 means never delete.
            "max_files": 0,
            //log_level: "DEBUG" by default,options:"TRACE","DEBUG","INFO","WARN"
            //The TRACE level is only valid when built in DEBUG mode.
            "log_level": "DEBUG",
            //display_local_time: false by default, if true, the log time is displayed in local time
            "display_local_time": false
        },
        //run_as_daemon: False by default
        "run_as_daemon": false,
        //handle_sig_term: True by default
        "handle_sig_term": true,
        //relaunch_on_error: False by default, if true, the program will be restart by the parent after exiting;
        "relaunch_on_error": false,
        //use_sendfile: True by default, if true, the program 
        //uses sendfile() system-call to send static files to clients;
        "use_sendfile": true,
        //use_gzip: True by default, use gzip to compress the response body's content;
        "use_gzip": true,
        //use_brotli: False by default, use brotli to compress the response body's content;
        "use_brotli": false,
        //static_files_cache_time: 5 (seconds) by default, the time in which the static file response is cached,
        //0 means cache forever, the negative value means no cache
        "static_files_cache_time": 5,
        //simple_controllers_map: Used to configure mapping from path to simple controller
        //"simple_controllers_map": [
        //    {
        //        "path": "/path/name",
        //        "controller": "controllerClassName",
        //        "http_methods": [
        //            "get",
        //            "post"
        //        ],
        //        "filters": [
        //            "FilterClassName"
        //        ]
        //    }
        //],
        //idle_connection_timeout: Defaults to 60 seconds, the lifetime 
        //of the connection without read or write
        "idle_connection_timeout": 60,
        //server_header_field: Set the 'Server' header field in each response sent by drogon,
        //empty string by default with which the 'Server' header field is set to "Server: drogon/version string\r\n"
        "server_header_field": "",
        //enable_server_header: Set true to force drogon to add a 'Server' header to each HTTP response. The default 
        //value is true.
        "enable_server_header": true,
        //enable_date_header: Set true to force drogon to add a 'Date' header to each HTTP response. The default 
        //value is true.
        "enable_date_header": true,
        //keepalive_requests: Set the maximum number of requests that can be served through one keep-alive connection. 
        //After the maximum number of requests are made, the connection is closed.
        //The default value of 0 means no limit.
        "keepalive_requests": 0,
        //pipelining_requests: Set the maximum number of unhandled requests that can be cached in pipelining buffer. 
        //After the maximum number of requests are made, the connection is closed.
        //The default value of 0 means no limit.
        "pipelining_requests": 0,
        //gzip_static: If it is set to true, when the client requests a static file, drogon first finds the compressed 
        //file with the extension ".gz" in the same path and send the compressed file to the client.
        //The default value of gzip_static is true.
        "gzip_static": true,
        //br_static: If it is set to true, when the client requests a static file, drogon first finds the compressed 
        //file with the extension ".br" in the same path and send the compressed file to the client.
        //The default value of br_static is true.
        "br_static": true,
        //client_max_body_size: Set the maximum body size of HTTP requests received by drogon. The default value is "1M".
        //One can set it to "1024", "1k", "10M", "1G", etc. Setting it to "" means no limit.
        "client_max_body_size": "1M",
        //max_memory_body_size: Set the maximum body size in memory of HTTP requests received by drogon. The default value is "64K" bytes.
        //If the body size of a HTTP request exceeds this limit, the body is stored to a temporary file for processing.
        //Setting it to "" means no limit.
        "client_max_memory_body_size": "64K",
        //client_max_websocket_message_size: Set the maximum size of messages sent by WebSocket client. The default value is "128K".
        //One can set it to "1024", "1k", "10M", "1G", etc. Setting it to "" means no limit.
        "client_max_websocket_message_size": "128K",
        //reuse_port: Defaults to false, users can run multiple processes listening on the same port at the same time.
        "reuse_port": false,
        // enabled_compressed_request: Defaults to false. If true the server will automatically decompress compressed request bodies.
        // Currently only gzip and br are supported. Note: max_memory_body_size and max_body_size applies twice for compressed requests.
        // Once when receiving and once when decompressing. i.e. if the decompressed body is larger than max_body_size, the request
        // will be rejected.
        "enabled_compressed_request": false,
        // enable_request_stream: Defaults to false. If true the server will enable stream mode for http requests.
        // See the wiki for more details.
        "enable_request_stream": false,
    },
    //plugins: Define all plugins running in the application
    "plugins": [
        {
            //name: The class name of the plugin
            "name": "drogon::plugin::PromExporter",
            //dependencies: Plugins that the plugin depends on. It can be commented out
            "dependencies": [],
            //config: The configuration of the plugin. This json object is the parameter to initialize the plugin.
            //It can be commented out
            "config": {
                "path": "/metrics"
            }
        },
        {
            "name": "drogon::plugin::AccessLogger",
            "dependencies": [],
            "config": {
                "use_spdlog": false,
                "log_path": "",
                "log_format": "",
                "log_file": "access.log",
                "log_size_limit": 0,
                "use_local_time": true,
                "log_index": 0,
                // "show_microseconds": true,
                // "custom_time_format": "",
                // "use_real_ip": false
            }
        }
    ],
    //custom_config: custom configuration for users. This object can be get by the app().getCustomConfig() method. 
    "custom_config": {
        "realm": "drogonRealm",
        "opaque": "drogonOpaque",
        "credentials": [
            {
                "user": "drogon",
                "password": "dr0g0n"
            }
        ]
    }
}
