diff --git a/conf/config.ini b/conf/config.ini index edd648ba..ab5a6a1e 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -193,6 +193,10 @@ dirMenu=1 #访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b #访问其他http路径,对应的文件路径还是在rootPath内 virtualPath= +#禁止后缀的文件缓存,使用“,”隔开 +#例如赋值为 .mp4,.flv +#那么访问后缀为.mp4与.flv 的文件不缓存 +forbidCacheSuffix= [multicast] #rtp组播截止组播ip地址 diff --git a/src/Common/config.cpp b/src/Common/config.cpp index 106dd9c0..c8b675c0 100644 --- a/src/Common/config.cpp +++ b/src/Common/config.cpp @@ -127,6 +127,8 @@ const string kNotFound = HTTP_FIELD"notFound"; //是否显示文件夹菜单 const string kDirMenu = HTTP_FIELD"dirMenu"; +const string kForbidCacheSuffix = HTTP_FIELD"forbidCacheSuffix"; + onceToken token([](){ mINI::Instance()[kSendBufSize] = 64 * 1024; mINI::Instance()[kMaxReqSize] = 4 * 10240; @@ -151,6 +153,7 @@ onceToken token([](){ "" "" << endl; + mINI::Instance()[kForbidCacheSuffix] = ""; },nullptr); }//namespace Http diff --git a/src/Common/config.h b/src/Common/config.h index 5540d213..d86c6979 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -214,6 +214,8 @@ extern const std::string kVirtualPath; extern const std::string kNotFound; //是否显示文件夹菜单 extern const std::string kDirMenu; +//禁止缓存文件的后缀 +extern const std::string kForbidCacheSuffix; }//namespace Http ////////////SHELL配置/////////// diff --git a/src/Http/HttpFileManager.cpp b/src/Http/HttpFileManager.cpp index 47301a2b..e4dacc88 100644 --- a/src/Http/HttpFileManager.cpp +++ b/src/Http/HttpFileManager.cpp @@ -357,6 +357,7 @@ static string pathCat(const string &a, const string &b){ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo &media_info, const string &file_path, const HttpFileManager::invoker &cb) { bool is_hls = end_with(file_path, kHlsSuffix); bool file_exist = File::is_file(file_path.data()); + bool is_forbid_cache = false; if (!is_hls && !file_exist) { //文件不存在且不是hls,那么直接返回404 sendNotFound(cb); @@ -369,9 +370,18 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo replace(const_cast(media_info._streamid), kHlsSuffix, ""); } + GET_CONFIG_FUNC(vector, forbidCacheSuffix, Http::kForbidCacheSuffix, [](const string &str) { + return split(str,","); + }); + for (auto &suffix : forbidCacheSuffix) { + if(suffix != "" && end_with(file_path, suffix)){ + is_forbid_cache = true; + break; + } + } weak_ptr weakSession = sender.shared_from_this(); //判断是否有权限访问该文件 - canAccessPath(sender, parser, media_info, false, [cb, file_path, parser, is_hls, media_info, weakSession , file_exist](const string &err_msg, const HttpServerCookie::Ptr &cookie) { + canAccessPath(sender, parser, media_info, false, [cb, file_path, parser, is_hls,is_forbid_cache, media_info, weakSession , file_exist](const string &err_msg, const HttpServerCookie::Ptr &cookie) { auto strongSession = weakSession.lock(); if (!strongSession) { //http客户端已经断开,不需要回复 @@ -387,7 +397,7 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo return; } - auto response_file = [file_exist, is_hls](const HttpServerCookie::Ptr &cookie, const HttpFileManager::invoker &cb, + auto response_file = [file_exist, is_hls, is_forbid_cache](const HttpServerCookie::Ptr &cookie, const HttpFileManager::invoker &cb, const string &file_path, const Parser &parser, const string &file_content = "") { StrCaseMap httpHeader; if (cookie) { @@ -402,7 +412,7 @@ static void accessFile(TcpSession &sender, const Parser &parser, const MediaInfo } cb(code, HttpFileManager::getContentType(file_path.data()), headerOut, body); }; - invoker.responseFile(parser.getHeader(), httpHeader, file_content.empty() ? file_path : file_content, !is_hls, file_content.empty()); + invoker.responseFile(parser.getHeader(), httpHeader, file_content.empty() ? file_path : file_content, !is_hls && !is_forbid_cache, file_content.empty()); }; if (!is_hls || !cookie) {