ValueError: check_hostname requires server_hostname using Fiddler 4

ValueError: check_hostname requires server_hostname using Fiddler 4

最近刚发布的 有一些有用的答案,但与我的不一样。我是来自 ArcGIS Pro Notebook 的 运行 urllib3 1.26.4 和 Python 3.7。我还打开了 Fiddler 4,因为我想在对脚本进行故障排除时跟踪网络流量。当我打开 Fiddler 时,我只会收到以下错误。如果我关闭 Fiddler,我会得到 <Response [200]>。在Fiddler打开的情况下不能使用requests模块吗?我是 Fiddler 新手。

截断的脚本:

import requests

#url
idph_data = 'https://idph.illinois.gov/DPHPublicInformation/api/covidVaccine/getVaccineAdministrationCurrent'
#headers
headers = {'user-agent': 'Mozilla/5.0'}

response = requests.get(idph_data, headers=headers, verify=True)

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
In  [35]:
Line 4:     response = requests.get(idph_data,verify=True)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py, in get:
Line 76:    return request('get', url, params=params, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\api.py, in request:
Line 61:    return session.request(method=method, url=url, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py, in request:
Line 542:   resp = self.send(prep, **send_kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\sessions.py, in send:
Line 655:   r = adapter.send(request, **kwargs)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\requests\adapters.py, in send:
Line 449:   timeout=timeout

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py, in urlopen:
Line 696:   self._prepare_proxy(conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connectionpool.py, in _prepare_proxy:
Line 964:   conn.connect()

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py, in connect:
Line 359:   conn = self._connect_tls_proxy(hostname, conn)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\connection.py, in _connect_tls_proxy:
Line 506:   ssl_context=ssl_context,

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py, in ssl_wrap_socket:
Line 432:   ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\urllib3\util\ssl_.py, in _ssl_wrap_socket_impl:
Line 474:   return ssl_context.wrap_socket(sock)

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py, in wrap_socket:
Line 423:   session=session

File C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\ssl.py, in _create:
Line 827:   raise ValueError("check_hostname requires server_hostname")

ValueError: check_hostname requires server_hostname
---------------------------------------------------------------------------

我运行正在解决这个问题以及当前版本的 ArcGIS Pro 提供的环境。根据您链接的问题中评分较低的答案,我 运行 pip install urllib3==1.25.11 在所需的环境中(在我的情况下是默认环境的克隆),问题似乎已解决。

这显然是由于 ArcGIS Pro 提供的 urllib3 版本中的一项新功能。上面的命令降级到相对较新但有效的版本。这不会在较新版本的 urllib3 中得到解决,但目前有一个 pull request 待解决,以修复 Python 本身的潜在问题。

顺便说一下,虽然可以配置 pip 以能够 运行 通过 fiddler 代理,但这并不容易,所以最好在 [=31] 时关闭 Fiddler =]使用任何 pip 命令。

已找到相关错误报告 here。问题似乎是 CPython / 内置 urllib 解析 Windows 系统代理设置的方式存在一个非常古老的错误,导致使用 https 的代理条目始终接收 HTTPS 前缀(而不是 HTTP)的 URL。 urllib3 的较新版本实际上支持通过 HTTPS 使用代理,这在以前是不支持的。所以之前,urllib3 会忽略前缀,但现在,它会尝试使用 HTTPS 与 HTTP url.

进行通信

我已经更新到最新的 requests v. 2.7.0,我不再收到错误消息。如果这是与 v.2.25.1 相关的版本特定问题,我不确定。我还没有找到任何证据。

在与我的 Python 可执行文件相同的目录中的 Windows 命令提示符中:

python -m pip install requests==2.7.0

现在,如果我 运行 使用 Fiddler 捕获的原始脚本,我会得到 200 的 HTTP 状态并且我的脚本不再给我错误。