gpt4 book ai didi

python - 如何在调试日志中查看 Python 请求使用哪个 IP 地址进行连接?

转载 作者:行者123 更新时间:2023-12-02 01:44:00 25 4
gpt4 key购买 nike

假设我正在向一个 URL 发送 GET 请求,该 URL 的 DNS 记录包含多个 IP 地址(DNS 循环)。例如,访问 https://www.twitter.com。如果我们挖掘它,我们会看到:

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

我尝试使用调试日志记录,如下所述:https://stackoverflow.com/a/16630836/1479414但它不显示它使用哪个 IP 地址。

此外,我还查看了这个答案:https://stackoverflow.com/a/22513161/1479414关于如何查看目标IP地址,但这不是我真正想看到的——这个显示了我最终使用的IP地址。

我想看看在库执行 DNS 故障转移时,在所有尝试中都尝试了哪些 IP 地址。像这样的东西:

尝试连接到 104.244.42.193...失败,尝试使用其他 IP 地址进行连接

有可能以某种方式看到吗?

最佳答案

urllib3 库负责此操作,位于 urllib3.util.connection.create_connection() function 中。那里有一个循环检查 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 代码进行 Monkeypatch 以使用您的版本。

使用该函数的唯一位置使用它 as an attribute on the imported module ,所以至少猴子补丁就像将其分配回原始函数位置一样简单:

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

关于python - 如何在调试日志中查看 Python 请求使用哪个 IP 地址进行连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59702539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com