Enhancements

Fix rule generation in Surge configs.
Refactor log output for curl verbose logs.
Optimize codes.
This commit is contained in:
Tindy X committed 2023-12-06 15:25:53 +08:00
1 parent a0e25158f5
commit 043c1fdcb9
37 files changed
+317 -260

No files matched your search

+21 -21
View File
@@ -6,27 +6,27 @@
#include <inja.hpp>
#include <yaml-cpp/yaml.h>
#include "../config/binding.h"
#include "../generator/config/nodemanip.h"
#include "../generator/config/ruleconvert.h"
#include "../generator/config/subexport.h"
#include "../generator/template/templates.h"
#include "../script/cron.h"
#include "../script/script_quickjs.h"
#include "../server/webserver.h"
#include "../utils/base64/base64.h"
#include "../utils/file_extra.h"
#include "../utils/ini_reader/ini_reader.h"
#include "../utils/logger.h"
#include "../utils/network.h"
#include "../utils/regexp.h"
#include "../utils/stl_extra.h"
#include "../utils/string.h"
#include "../utils/string_hash.h"
#include "../utils/system.h"
#include "../utils/system.h"
#include "../utils/urlencode.h"
#include "../utils/yamlcpp_extra.h"
#include "config/binding.h"
#include "generator/config/nodemanip.h"
#include "generator/config/ruleconvert.h"
#include "generator/config/subexport.h"
#include "generator/template/templates.h"
#include "script/cron.h"
#include "script/script_quickjs.h"
#include "server/webserver.h"
#include "utils/base64/base64.h"
#include "utils/file_extra.h"
#include "utils/ini_reader/ini_reader.h"
#include "utils/logger.h"
#include "utils/network.h"
#include "utils/regexp.h"
#include "utils/stl_extra.h"
#include "utils/string.h"
#include "utils/string_hash.h"
#include "utils/system.h"
#include "utils/system.h"
#include "utils/urlencode.h"
#include "utils/yamlcpp_extra.h"
#include "interfaces.h"
#include "multithread.h"
#include "settings.h"
+3 -3
View File
@@ -5,9 +5,9 @@
#include <map>
#include <inja.hpp>
#include "../config/ruleset.h"
#include "../generator/config/subexport.h"
#include "../server/webserver.h"
#include "config/ruleset.h"
#include "generator/config/subexport.h"
#include "server/webserver.h"
std::string parseProxy(const std::string &source);
+2 -2
View File
@@ -1,8 +1,8 @@
#include <future>
#include <thread>
#include "../handler/settings.h"
#include "../utils/network.h"
#include "handler/settings.h"
#include "utils/network.h"
#include "webget.h"
#include "multithread.h"
//#include "vfs.h"
+3 -3
View File
@@ -6,9 +6,9 @@
#include <yaml-cpp/yaml.h>
#include "../config/regmatch.h"
#include "../utils/ini_reader/ini_reader.h"
#include "../utils/string.h"
#include "config/regmatch.h"
#include "utils/ini_reader/ini_reader.h"
#include "utils/string.h"
using guarded_mutex = std::lock_guard<std::mutex>;
+6 -6
View File
@@ -2,12 +2,12 @@
#include <mutex>
#include <toml.hpp>
#include "../config/binding.h"
#include "../handler/webget.h"
#include "../script/cron.h"
#include "../server/webserver.h"
#include "../utils/logger.h"
#include "../utils/network.h"
#include "config/binding.h"
#include "handler/webget.h"
#include "script/cron.h"
#include "server/webserver.h"
#include "utils/logger.h"
#include "utils/network.h"
#include "interfaces.h"
#include "multithread.h"
#include "settings.h"
+10 -10
View File
@@ -3,16 +3,16 @@
#include <string>
#include "../config/crontask.h"
#include "../config/regmatch.h"
#include "../config/proxygroup.h"
#include "../config/ruleset.h"
#include "../generator/config/ruleconvert.h"
#include "../generator/template/templates.h"
#include "../utils/logger.h"
#include "../utils/string.h"
#include "../utils/stl_extra.h"
#include "../utils/tribool.h"
#include "config/crontask.h"
#include "config/regmatch.h"
#include "config/proxygroup.h"
#include "config/ruleset.h"
#include "generator/config/ruleconvert.h"
#include "generator/template/templates.h"
#include "utils/logger.h"
#include "utils/string.h"
#include "utils/stl_extra.h"
#include "utils/tribool.h"
struct Settings
{
+4 -4
View File
@@ -1,9 +1,9 @@
#include <string>
#include "../utils/ini_reader/ini_reader.h"
#include "../utils/logger.h"
#include "../utils/rapidjson_extra.h"
#include "../utils/system.h"
#include "utils/ini_reader/ini_reader.h"
#include "utils/logger.h"
#include "utils/rapidjson_extra.h"
#include "utils/system.h"
#include "webget.h"
std::string buildGistData(std::string name, std::string content)
+34 -83
View File
@@ -7,13 +7,14 @@
#include <curl/curl.h>
#include "../handler/settings.h"
#include "../utils/base64/base64.h"
#include "../utils/defer.h"
#include "../utils/file_extra.h"
#include "../utils/logger.h"
#include "../utils/urlencode.h"
#include "../version.h"
#include "handler/settings.h"
#include "utils/base64/base64.h"
#include "utils/defer.h"
#include "utils/file_extra.h"
#include "utils/lock.h"
#include "utils/logger.h"
#include "utils/urlencode.h"
#include "version.h"
#include "webget.h"
#ifdef _WIN32
@@ -27,70 +28,6 @@ using guarded_mutex = std::lock_guard<std::mutex>;
std::mutex cache_rw_lock;
*/
class RWLock
{
#define WRITE_LOCK_STATUS (-1)
#define FREE_STATUS 0
private:
const std::thread::id NULL_THREAD;
const bool WRITE_FIRST;
std::thread::id m_write_thread_id;
std::atomic_int m_lockCount;
std::atomic_uint m_writeWaitCount;
public:
RWLock(const RWLock&) = delete;
RWLock& operator=(const RWLock&) = delete;
RWLock(bool writeFirst = true): WRITE_FIRST(writeFirst), m_write_thread_id(), m_lockCount(0), m_writeWaitCount(0) {}
virtual ~RWLock() = default;
int readLock()
{
if (std::this_thread::get_id() != m_write_thread_id)
{
int count;
if (WRITE_FIRST)
do {
while ((count = m_lockCount) == WRITE_LOCK_STATUS || m_writeWaitCount > 0);
} while (!m_lockCount.compare_exchange_weak(count, count + 1));
else
do {
while ((count = m_lockCount) == WRITE_LOCK_STATUS);
} while (!m_lockCount.compare_exchange_weak(count, count + 1));
}
return m_lockCount;
}
int readUnlock()
{
if (std::this_thread::get_id() != m_write_thread_id)
--m_lockCount;
return m_lockCount;
}
int writeLock()
{
if (std::this_thread::get_id() != m_write_thread_id)
{
++m_writeWaitCount;
for (int zero = FREE_STATUS; !m_lockCount.compare_exchange_weak(zero, WRITE_LOCK_STATUS); zero = FREE_STATUS);
--m_writeWaitCount;
m_write_thread_id = std::this_thread::get_id();
}
return m_lockCount;
}
int writeUnlock()
{
if (std::this_thread::get_id() != m_write_thread_id)
{
throw std::runtime_error("writeLock/Unlock mismatch");
}
if (WRITE_LOCK_STATUS != m_lockCount)
{
throw std::runtime_error("RWLock internal error");
}
m_write_thread_id = NULL_THREAD;
m_lockCount.store(FREE_STATUS);
return m_lockCount;
}
};
RWLock cache_rw_lock;
//std::string user_agent_str = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36";
@@ -118,18 +55,17 @@ static int writer(char *data, size_t size, size_t nmemb, std::string *writerData
writerData->append(data, size*nmemb);
return size * nmemb;
return static_cast<int>(size * nmemb);
}
static int dummy_writer(char *data, size_t size, size_t nmemb, void *writerData)
static int dummy_writer(char *, size_t size, size_t nmemb, void *)
{
/// dummy writer, do not save anything
(void)data;
(void)writerData;
return size * nmemb;
return static_cast<int>(size * nmemb);
}
static int size_checker(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
//static int size_checker(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
static int size_checker(void *clientp, curl_off_t, curl_off_t dlnow, curl_off_t, curl_off_t)
{
if(clientp)
{
@@ -163,9 +99,24 @@ static int logger(CURL *handle, curl_infotype type, char *data, size_t size, voi
return 0;
}
std::string content(data, size);
if(content.back() == '\n')
content.pop_back();
writeLog(0, prefix + ": " + content, LOG_LEVEL_VERBOSE);
if(content.find("\r\n") != std::string::npos)
{
string_array lines = split(content, "\r\n");
for(auto &x : lines)
{
std::string log_content = prefix;
log_content += ": ";
log_content += x;
writeLog(0, log_content, LOG_LEVEL_VERBOSE);
}
}
else
{
std::string log_content = prefix;
log_content += ": ";
log_content += trimWhitespace(content);
writeLog(0, log_content, LOG_LEVEL_VERBOSE);
}
return 0;
}
@@ -198,7 +149,7 @@ static int curlGet(const FetchArgument &argument, FetchResult &result)
std::string *data = result.content, new_url = argument.url;
curl_slist *header_list = nullptr;
defer(curl_slist_free_all(header_list);)
long retVal = 0;
long retVal;
curl_init();
@@ -361,10 +312,10 @@ std::string webGet(const std::string &url, const std::string &proxy, unsigned in
md("cache");
const std::string url_md5 = getMD5(url);
const std::string path = "cache/" + url_md5, path_header = path + "_header";
struct stat result;
struct stat result {};
if(stat(path.data(), &result) == 0) // cache exist
{
time_t mtime = result.st_mtime, now = time(NULL); // get cache modified time and current time
time_t mtime = result.st_mtime, now = time(nullptr); // get cache modified time and current time
if(difftime(now, mtime) <= cache_ttl) // within TTL
{
writeLog(0, "CACHE HIT: '" + url + "', using local cache.");
+2 -2
View File
@@ -4,8 +4,8 @@
#include <string>
#include <map>
#include "../utils/map_extra.h"
#include "../utils/string.h"
#include "utils/map_extra.h"
#include "utils/string.h"
enum http_method
{