Modify drogon_ctl

This commit is contained in:
antao 2018-10-15 13:34:38 +08:00
parent af8a1ef15a
commit b539b5231c
8 changed files with 130 additions and 82 deletions

View File

@ -86,6 +86,9 @@
//use sendfile() system-call to send static file to client;
"use_sendfile": true,
//use_gzip:true by default,use gzip to compress the response body's content;
"use_gzip": true
"use_gzip": true,
//static_files_cache_time:5 by default,the time in which static file response is cached,
//0 means cache forever,the negative value means no cache
"static_files_cache_time":5
}
}

View File

@ -1,5 +1,22 @@
link_libraries(drogon)
link_libraries(drogon trantor uuid pthread jsoncpp dl z)
if(OpenSSL_FOUND)
link_libraries(ssl crypto)
endif()
AUX_SOURCE_DIRECTORY(. SRC_DIR)
add_executable(drogon_ctl ${SRC_DIR})
add_dependencies(drogon_ctl trantor makeVersion)
add_executable(_drogon_ctl ${SRC_DIR})
FILE(GLOB SCP_LIST ${CMAKE_CURRENT_SOURCE_DIR}/templates/*.csp)
foreach(cspFile ${SCP_LIST})
message(STATUS "cspFile:" ${cspFile})
EXEC_PROGRAM(basename ARGS "-s .csp ${cspFile}" OUTPUT_VARIABLE classname)
message(STATUS "view classname:" ${classname})
add_custom_command(OUTPUT ${classname}.h ${classname}.cc
COMMAND _drogon_ctl
ARGS create view ${cspFile}
DEPENDS ${cspFile}
VERBATIM )
set(TEMPL_SRC ${TEMPL_SRC} ${classname}.cc)
endforeach()
add_executable(drogon_ctl ${SRC_DIR} ${TEMPL_SRC})
add_dependencies(drogon_ctl trantor makeVersion _drogon_ctl)
install(TARGETS drogon_ctl DESTINATION bin)

View File

@ -1,4 +1,5 @@
#include "create_project.h"
#include <drogon/HttpResponse.h>
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
@ -201,81 +202,8 @@ static void newJsonFindFile(std::ofstream &jsonFile)
static void newConfigFile(std::ofstream &configFile)
{
configFile << "/* This is a JSON format configuration file\n"
"*/\n"
"{\n"
" //ssl:the global ssl files setting\n"
" /*\"ssl\": {\n"
" \"cert\": \"../../trantor/trantor/tests/server.pem\",\n"
" \"key\": \"../../trantor/trantor/tests/server.pem\"\n"
" },\n"
" \"listeners\": [\n"
" {\n"
" //address:ip address,0.0.0.0 by default\n"
" \"address\": \"0.0.0.0\",\n"
" //port:port number\n"
" \"port\": 80,\n"
" //https:if use https for security,false by default\n"
" \"https\": false\n"
" },\n"
" {\n"
" \"address\": \"0.0.0.0\",\n"
" \"port\": 443,\n"
" \"https\": true,\n"
" //cert,key:cert file path and key file path,empty by default,\n"
" //if empty,use global setting\n"
" \"cert\": \"\",\n"
" \"key\": \"\"\n"
" }\n"
" ],*/\n"
" \"app\": {\n"
" //threads_num:num of threads,1 by default\n"
" \"threads_num\": 16,\n"
" //enable_session:false by default\n"
" \"enable_session\": false,\n"
" \"session_timeout\": 0,\n"
" //document_root:Root path of HTTP document,defaut path is ./\n"
" \"document_root\": \"./\",\n"
" /* file_types:\n"
" * HTTP download file types,The file types supported by drogon\n"
" * by default are \"html\", \"js\", \"css\", \"xml\", \"xsl\", \"txt\", \"svg\",\n"
" * \"ttf\", \"otf\", \"woff2\", \"woff\" , \"eot\", \"png\", \"jpg\", \"jpeg\",\n"
" * \"gif\", \"bmp\", \"ico\", \"icns\", etc. */\n"
" \"file_types\": [\"gif\",\"png\",\"jpg\",\"js\",\"css\",\"html\",\"ico\",\"swf\",\"xap\",\"apk\",\"cur\",\"xml\"],\n"
" //max_connections:max connections number,100000 by default\n"
" \"max_connections\": 100000,\n"
" //Load_dynamic_views: false by default, when set to true, drogon will\n"
" //compile and load dynamically \"CSP View Files\" in directories defined\n"
" //by \"dynamic_views_path\"\n"
" \"load_dynamic_views\": true,\n"
" //dynamic_views_path: if the path isn't prefixed with / or ./,\n"
" //it will be relative path of document_root path\n"
" \"dynamic_views_path\": [\"./views\"],\n"
" //log:set log output,drogon output logs to stdout by default\n"
" \"log\": {\n"
" //log_path:log file path,empty by default,in which case,log will output to the stdout\n"
" \"log_path\": \"./\",\n"
" //logfile_base_name:log file base name,empty by default which means 'drogon' will name logfile as\n"
" //drogon.log ...\n"
" \"logfile_base_name\": \"\",\n"
" //log_size_limit:100000000 bytes by default,\n"
" //When the log file size reaches \"log_size_limit\", the log file is switched.\n"
" \"log_size_limit\": 100000000,\n"
" //log_level:\"DEBUG\" by default,options:\"TRACE\",\"DEBUG\",\"INFO\",\"WARN\"\n"
" //The TRACE level is only valid when built in DEBUG mode.\n"
" \"log_level\": \"DEBUG\"\n"
" },\n"
" //run_as_daemon:false by default\n"
" \"run_as_daemon\": false,\n"
" //relaunch_on_error:false by default,if true,the program will be restart by parent after exit;\n"
" \"relaunch_on_error\": false,\n"
" //use_sendfile:true by default,if ture,the program will\n"
" //use sendfile() system-call to send static file to client;\n"
" \"use_sendfile\": true,\n"
" //use_gzip:true by default,use gzip to compress the response body's content;\n"
" \"use_gzip\": true\n"
" }\n"
"}\n";
auto resp=HttpResponse::newHttpViewResponse("config",drogon::HttpViewData());
configFile << resp->getBody();
}
void create_project::createProject(const std::string &projectName)
{

View File

@ -0,0 +1,94 @@
/* This is a JSON format configuration file
*/
{
//ssl:the global ssl files setting
/*
"ssl": {
"cert": "../../trantor/trantor/tests/server.pem",
"key": "../../trantor/trantor/tests/server.pem"
},
"listeners": [
{
//address:ip address,0.0.0.0 by default
"address": "0.0.0.0",
//port:port number
"port": 80,
//https:if 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 global setting
"cert": "",
"key": ""
}
],*/
"app": {
//threads_num:num of threads,1 by default
"threads_num": 16,
//enable_session:false by default
"enable_session": false,
"session_timeout": 0,
//document_root:Root path of HTTP document,defaut path is ./
"document_root": "./",
/* 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"
],
//max_connections:max connections number,100000 by default
"max_connections": 100000,
//max_connections_per_ip:max connections number per clinet,0 by default which means no limit
"max_connections_per_ip": 0,
//Load_dynamic_views: false by default, when set to true, drogon will
//compile and load dynamically "CSP View Files" in directories defined
//by "dynamic_views_path"
//"load_dynamic_views":true,
//dynamic_views_path: if the path isn't prefixed with / or ./,
//it will be relative path of document_root path
//"dynamic_views_path":["./views"],
//log:set log output,drogon output logs to stdout by default
"log": {
//log_path:log file path,empty by default,in which case,log will output to the stdout
"log_path": "./",
//logfile_base_name:log file base name,empty by default which means drogon will name 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 will be switched.
"log_size_limit": 100000000,
//log_level:"DEBUG" by default,options:"TRACE","DEBUG","INFO","WARN"
//The TRACE level is only valid when built in DEBUG mode.
"log_level": "DEBUG"
},
//run_as_daemon:false by default
"run_as_daemon": false,
//relaunch_on_error:false by default,if true,the program will be restart by parent after exit;
"relaunch_on_error": false,
//use_sendfile:true by default,if ture,the program will
//use sendfile() system-call to send static file to client;
"use_sendfile": true,
//use_gzip:true by default,use gzip to compress the response body's content;
"use_gzip": true,
//static_files_cache_time:5 by default,the time in which static file response is cached,
//0 means cache forever,the negative value means no cache
"static_files_cache_time":5
}
}

View File

@ -109,6 +109,8 @@ class HttpAppFramework : public trantor::NonCopyable
virtual void enableSendfile(bool sendFile) = 0;
virtual void enableGzip(bool useGzip) = 0;
virtual bool useGzip() const = 0;
virtual void setStaticFilesCacheTime(int cacheTime) = 0;
virtual int staticFilesCacheTime() const = 0;
private:
virtual void registerHttpApiController(const std::string &pathPattern,

View File

@ -160,6 +160,8 @@ static void loadApp(const Json::Value &app)
HttpAppFramework::instance().enableSendfile(useSendfile);
auto useGzip = app.get("use_gzip", true).asBool();
HttpAppFramework::instance().enableGzip(useGzip);
auto staticFilesCacheTime=app.get("static_files_cache_time",5).asInt();
HttpAppFramework::instance().setStaticFilesCacheTime(staticFilesCacheTime);
}
static void loadListeners(const Json::Value &listeners)
{

View File

@ -1059,8 +1059,8 @@ void HttpAppFrameworkImpl::readSendFile(const std::string &filePath, const HttpR
resp->setStatusCode(HttpResponse::k200OK);
//cache the response for 5 seconds
resp->setExpiredTime(5);
//cache the response for 5 seconds by default
resp->setExpiredTime(_staticFilesCacheTime);
_responseCacheMap->insert(filePath, resp, resp->expiredTime(), [=]() {
std::lock_guard<std::mutex> guard(_staticFilesCacheMutex);
_staticFilesCache.erase(filePath);

View File

@ -74,6 +74,8 @@ class HttpAppFrameworkImpl : public HttpAppFramework
virtual void enableSendfile(bool sendFile) override { _useSendfile = sendFile; }
virtual void enableGzip(bool useGzip) override { _useGzip = useGzip; }
virtual bool useGzip() const override { return _useGzip; }
virtual void setStaticFilesCacheTime(int cacheTime) override { _staticFilesCacheTime = cacheTime; }
virtual int staticFilesCacheTime() const override { return _staticFilesCacheTime; }
virtual ~HttpAppFrameworkImpl()
{
//Destroy the following objects before _loop destruction
@ -191,7 +193,7 @@ class HttpAppFrameworkImpl : public HttpAppFramework
size_t _logfileSize = 100000000;
bool _useSendfile = true;
bool _useGzip = true;
int _staticFilesCacheTime = 5;
std::unordered_map<std::string, std::weak_ptr<HttpResponse>> _staticFilesCache;
std::mutex _staticFilesCacheMutex;
};