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 状态并且我的脚本不再给我错误。
最近刚发布的 <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 状态并且我的脚本不再给我错误。