Added support for configurable regular expressions

This commit is contained in:
tastytea 2018-05-29 14:56:39 +02:00
parent a1ef65b71c
commit f3db10dc0a
Signed by: tastytea
GPG Key ID: 59346E0EA35C67E5
4 changed files with 42 additions and 15 deletions

View File

@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 3.7) cmake_minimum_required (VERSION 3.7)
project (expandurl-mastodon project (expandurl-mastodon
VERSION 0.8.2 VERSION 0.9.0
LANGUAGES CXX LANGUAGES CXX
) )

View File

@ -63,6 +63,15 @@ const string expand(const string &url);
*/ */
const string strip(const string &url); const string strip(const string &url);
/*!
* @brief Initialize replacements for URLs
*
* If no replacements are found in the config file, a default list is
* inserted.
*
*/
const void init_replacements();
class Listener class Listener
{ {

View File

@ -52,13 +52,15 @@ void signal_handler(int signum)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
if (!configfile.read()) if (!configfile.read())
{ {
syslog(LOG_WARNING, "Could not open %s.", configfile.get_filepath().c_str()); syslog(LOG_WARNING, "Could not open %s.", configfile.get_filepath().c_str());
} }
init_replacements();
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
curlpp::initialize(); curlpp::initialize();
openlog("expandurl-mastodon", LOG_CONS | LOG_NDELAY | LOG_PID, LOG_LOCAL1); openlog("expandurl-mastodon", LOG_CONS | LOG_NDELAY | LOG_PID, LOG_LOCAL1);
syslog(LOG_NOTICE, "Program started by user %d", getuid()); syslog(LOG_NOTICE, "Program started by user %d", getuid());

View File

@ -77,23 +77,39 @@ const string expand(const string &url)
const string strip(const string &url) const string strip(const string &url)
{ {
using replace_pair = std::pair<const std::regex, const std::string>;
using namespace std::regex_constants; using namespace std::regex_constants;
Json::Value &config = configfile.get_json();
string newurl = url; string newurl = url;
const std::array<const replace_pair, 5> replace_array = for (auto it = config["replace"].begin(); it != config["replace"].end();
{{ ++it)
{ std::regex("[\\?&]utm_[^&]+", icase), "" }, // Google
{ std::regex("[\\?&]wtmc=[^&]+", icase), "" }, // Twitter?
{ std::regex("[\\?&]__twitter_impression=[^&]+", icase), "" }, // Twitter?
{ std::regex("[\\?&]wt_zmc=[^&]+", icase), "" }, // Twitter?
{ std::regex("//amp\\.", icase), "//" } // AMP
}};
for (const replace_pair &pair : replace_array)
{ {
newurl = std::regex_replace(newurl, pair.first, pair.second); newurl = std::regex_replace(newurl,
std::regex(it.name(), icase),
(*it).asString());
} }
return newurl; return newurl;
} }
const void init_replacements()
{
using replace_pair = std::pair<const std::string, const std::string>;
Json::Value &config = configfile.get_json();
if (config["replace"].isNull())
{
const std::array<const replace_pair, 5> replace_array =
{{
{ "[\\?&]utm_[^&]+", "" }, // Google
{ "[\\?&]wtmc=[^&]+", "" }, // Twitter?
{ "[\\?&]__twitter_impression=[^&]+", "" }, // Twitter?
{ "[\\?&]wt_zmc=[^&]+", "" }, // Twitter?
{ "//amp\\.", "//" } // AMP
}};
for (const replace_pair &pair : replace_array)
{
config["replace"][pair.first] = pair.second;
}
}
}