1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sogou-workflow

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
tutorial-15-name_service.md 6.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 01.03.2025 10:20 552780a

Определение стратегии службы имен: name_service

Пример кода

tutorial-15-name_service.cc

Обзор name_service

Этот пример демонстрирует использование пользовательского текстового файла для определения стратегий службы имен. Формат файла совместим с системным файлом 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sogou-workflow.git
git@api.gitlife.ru:oschina-mirror/sogou-workflow.git
oschina-mirror
sogou-workflow
sogou-workflow
master