namespace samples {
struct ConfigDataWithTimestamp {
std::chrono::system_clock::time_point updated_at;
std::unordered_map<std::string, formats::json::Value> key_values;
};
public:
static constexpr std::string_view kName = "handler-config";
using KeyValues = std::unordered_map<std::string, formats::json::Value>;
void SetNewValues(KeyValues&& key_values) {
config_values_.Assign(ConfigDataWithTimestamp{
std::move(key_values),
});
}
private:
};
ConfigDistributor::ConfigDistributor(
: HttpHandlerJsonBase(config, context) {
constexpr std::string_view kDynamicConfig = R"~({
"BAGGAGE_SETTINGS": {
"allowed_keys": []
},
"USERVER_BAGGAGE_ENABLED": false,
"USERVER_TASK_PROCESSOR_PROFILER_DEBUG": {},
"USERVER_LOG_REQUEST": true,
"USERVER_LOG_REQUEST_HEADERS": false,
"USERVER_CANCEL_HANDLE_REQUEST_BY_DEADLINE": false,
"USERVER_RPS_CCONTROL_CUSTOM_STATUS": {},
"USERVER_HTTP_PROXY": "",
"USERVER_TASK_PROCESSOR_QOS": {
"default-service": {
"default-task-processor": {
"wait_queue_overload": {
"action": "ignore",
"length_limit": 5000,
"time_limit_us": 3000
}
}
}
},
"USERVER_CACHES": {},
"USERVER_LRU_CACHES": {},
"USERVER_DUMPS": {}
})~";
KeyValues new_config;
for (auto [key, value] : Items(json)) {
new_config[std::move(key)] = value;
}
new_config["USERVER_LOG_REQUEST_HEADERS"] =
SetNewValues(std::move(new_config));
}
const auto config_values_ptr = config_values_.Read();
result["configs"] = MakeConfigs(config_values_ptr, json);
const auto updated_at = config_values_ptr->updated_at;
}
const auto updated_since = request[
"updated_since"].
As<std::string>({});
config_values_ptr->updated_at) {
return configs;
}
LOG_DEBUG() <<
"Sending dynamic config for service "
<< request[
"service"].
As<std::string>(
"<unknown>");
const auto& values = config_values_ptr->key_values;
if (request["ids"].IsMissing()) {
for (const auto& [key, value] : values) {
configs[key] = value;
}
return configs;
}
for (const auto& id : request["ids"]) {
const auto key = id.As<std::string>();
const auto it = values.find(key);
if (it != values.end()) {
configs[key] = it->second;
} else {
LOG_ERROR() <<
"Failed to find config with name '" << key <<
"'";
}
}
return configs;
}
}
int main(int argc, char* argv[]) {
.
Append<samples::ConfigDistributor>();
}