Этот пример демонстрирует использование пользовательского текстового файла для определения стратегий службы имен. Формат файла совместим с системным файлом hosts и также поддерживает указание доменных имён. Например:
127.0.0.1 www.myhost.com
192.168.10.10 host1
www.sogou.com sogou # Расширенная функциональность, 'sogou' указывает на 'www.sogou.com'
Пользователи могут вводить захваченный URL и файл службы имен для получения целевой страницы. Если имя домена входящего URL отсутствует в файле, используется обычный DNS.
Все стратегии службы имен производят от WFNSPolicy. Единственный метод, который требуется реализовать — это create_router_task.
class MyNSPolicy : public WFNSPolicy
{
public:
WFRouterTask *create_router_task(const struct WFNSParams *params, router_callback_t callback) override;
..
};
В этом примере нам не требуется сложная стратегия выбора; мы просто преобразуем доменные имена из текстового файла. Поэтому мы можем передать результат преобразования глобальному DNS-решителю, чтобы он создал реальный маршрут.
WFRouterTask *MyNSPolicy::create_router_task(const struct WFNSParams *params, router_callback_t callback)
{
WFDnsResolver *dns_resolver = WFGlobal::get_dns_resolver();
if (params->uri.host)
{
FILE *fp = fopen(this->path.c_str(), "r");
if (fp)
{
std::string dest = this->read_from_fp(fp, params->uri.host);
if (dest.size() > 0)
{
/* Обновляем поле 'host' структуры uri напрямую.
Также можно обновить поле 'port', если это необходимо. */
free(params->uri.host);
params->uri.host = strdup(dest.c_str());
}
fclose(fp);
}
}
/* Просто используем глобальный DNS-решитель для создания маршрута. */
return dns_resolver->create_router_task(params, std::move(callback));
}
Функция read_from_fp читает информацию из текстового файла и выполняет преобразование. Реализация этой функции доступна в исходном коде. Получив результат преобразования, заменим исходное значение поля host новым значением. В конце концов, вызываем DNS-решитель для создания маршрута.
В Workflow можно назначить отдельную стратегию службы имен для каждого уникального имени домена. Если стратегия для конкретного имени домена не найдена, используется дефолтная. Обычно дефолтной стратегией службы имен является DNS-решитель. В данном примере мы регистрируем нашу стратегию для имени домена входящего URL:
int main()
{
...
/* Создаем стратегию службы имен. */
MyNSPolicy *policy = new MyNSPolicy(filename);
/* Получаем объект глобальной службы имен. */
WFNameService *ns = WFGlobal::get_name_service();
/* Добавляем наше имя со стратегией в глобальную службу имен.
Можно добавить несколько имен с одним объектом стратегии. */
ns->add_policy(name, policy);
...
}
Здесь name представляет собой имя домена входящего URL. Таким образом, все URL этого домена будут использовать нашу пользовательскую стратегию службы имен. Перед завершением программы также следует удалить эту стратегию из глобальной службы имен, чтобы избежать утечки памяти:
int main()
{
...
/* Чистка */
ns->del_policy(name);
delete policy;
return 0;
}
В этом примере мы не меняем дефолтную стратегию службы имен. Однако в некоторых случаях может потребоваться применять данную стратегию ко всем хостам. Для этого достаточно установить дефолтную стратегию с помощью функции set_default_policy глобальной службы имен:
int main()
{
MyNSPolicy *policy = new MyNSPolicy(filename);
WFNameService *ns = WFGlobal::get_name_service();
ns->set_default_policy(policy);
...
/* Возвращаем дефолтную стратегию к DNS-решителю и очищаем */
ns->set_default_policy(WFGlobal::get_dns_resolver());
delete policy;
return 0;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )