Разрешить вывод IP-адресов с помощью call.cancel () из EventListener.dnsEnd () в OkHttp - PullRequest
4 голосов
/ 06 мая 2020

Я переопределяю функцию dnsEnd () в EventListener:

@Override
    public void dnsEnd(Call call, String domainName, List<InetAddress> inetAddressList) {
        inetAddressList.forEach(address -> {
            logger.debug("checking if url ({}) is in allowlist", address.toString());
            if (!allowlist.contains(address)) {
                call.cancel();
            }
        });
    }

я знаю, в документации сказано не изменять параметры вызова и т.д. c:

«Все методы событий должны выполняться быстро, без внешней блокировки, не могут генерировать исключения, пытаться изменить параметры события или повторно входить в клиент. Любая запись ввода-вывода в файлы или сеть должна выполняться асинхронно».

но, поскольку меня не волнует вызов, если он пытается получить адрес вне разрешенного списка, я не вижу проблемы с этой реализацией.

Я хочу знать, есть ли у кого-нибудь опыт с этим, и почему это может быть проблемой? Я проверил это, и, похоже, он работает нормально.

1 Ответ

4 голосов
/ 07 мая 2020

Это нормально и безопасно. Вероятно, самым странным последствием этого является то, что отмененное событие будет инициировано потоком, уже обрабатывающим событие DNS.

Но отмена - не лучший способ ограничить разрешенные IP-адреса списком. Вместо этого вы можете реализовать интерфейс DNS. Ваша реализация должна делегировать Dns.SYSTEM, и они отфильтровывают ее результаты в ваш список разрешений. Таким образом, вам не придется беспокоиться о гонках при отмене.

...