Как я могу увидеть в журналах отладки, какой IP-адрес используется для соединения по запросу Python? - PullRequest
3 голосов
/ 12 января 2020

Допустим, я отправляю запрос GET на URL-адрес, DNS-запись которого содержит несколько IP-адресов (DNS Round-Robin). Например, до https://www.twitter.com. Если мы сделаем dig этого, мы увидим:

;; ANSWER SECTION:
twitter.com.        60  IN  A   104.244.42.193
twitter.com.        60  IN  A   104.244.42.129

Я попытался использовать ведение журнала DEBUG, как описано здесь: { ссылка }, однако он не показывает, какой IP-адрес у него использует.

Кроме того, я посмотрел также на этот ответ: { ссылка } о том, как увидеть IP-адрес назначения, но это не то, что я на самом деле хочу видеть - этот показывает я, наконец, использовал IP-адрес.

Я хочу посмотреть, какие IP-адреса используются во всех попытках, пока библиотека выполняет отработку отказа DNS. Что-то вроде:

Trying to connect to 104.244.42.193... failed, trying to connect using another IP address

Можно ли как-то увидеть?

1 Ответ

2 голосов
/ 12 января 2020

За это отвечает библиотека urllib3, в функции urllib3.util.connection.create_connection() . Там есть al oop, который проверяет каждый результат из socket.getaddrinfo():

for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
    #  ....
    try:
        sock = socket.socket(af, socktype, proto)
        # ...
        sock.connect(sa)
        return sock

    except socket.error as e:
        # ...

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

Единственное место, где используется эта функция, использует это в качестве атрибута в импортированном модуле , поэтому, по крайней мере, создание обезьяньих патчей так же просто, как присвоение его исходному расположению функции:

import urllib3.util.connection

def create_connection_with_logging(
    address,
    timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
    source_address=None,
    socket_options=None,
):
    # ....

urllib3.util.connection.create_connection = create_connection_with_logging
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...