- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题很简单 - 在调用 self._sslobj.read(len, buffer)< 后,负责在 cpython3 上引发
在 ConnectionResetError
的代码在哪里ssl.py
上?
我有时会收到 ConnectionResetError
尝试使用 ssl 连接到 S3 时。此错误很少发生,因此很难重现。
# trimmed stacktrace
File "/MYPROJECT/MY_FUNC.py", line 123, in <genexpr>
rows = (row for row in reader)
File "/XXX/lib/python3.6/csv.py", line 112, in _next_
row = next(self.reader)
File "/XXX/lib/python3.6/tarfile.py", line 706, in readinto
buf = self.read(len(b))
File "/XXX/lib/python3.6/tarfile.py", line 695, in read
b = self.fileobj.read(length)
File "/XXX/lib/python3.6/gzip.py", line 276, in read
return self._buffer.read(size)
File "/XXX/lib/python3.6/_compression.py", line 68, in readinto
data = self.read(len(byte_view))
File "/XXX/lib/python3.6/gzip.py", line 469, in read
buf = self._fp.read(io.DEFAULT_BUFFER_SIZE)
File "/XXX/lib/python3.6/gzip.py", line 91, in read
self.file.read(size-self._length+read)
File "/XXX/lib/python3.6/site-packages/s3fs/core.py", line 1311, in read
self._fetch(self.loc, self.loc + length)
File "/XXX/lib/python3.6/site-packages/s3fs/core.py", line 1292, in _fetch
req_kw=self.s3.req_kw)
File "/XXX/lib/python3.6/site-packages/s3fs/core.py", line 1496, in _fetch_range
return resp['Body'].read()
File "/XXX/lib/python3.6/site-packages/botocore/response.py", line 74, in read
chunk = self._raw_stream.read(amt)
File "/XXX/lib/python3.6/site-packages/botocore/vendored/requests/packages/urllib3/response.py", line 239, in read
data = self._fp.read()
File "/XXX/lib/python3.6/http/client.py", line 462, in read
s = self._safe_read(self.length)
File "/XXX/lib/python3.6/http/client.py", line 612, in _safe_read
chunk = self.fp.read(min(amt, MAXAMOUNT))
File "/XXX/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
File "/XXX/lib/python3.6/ssl.py", line 1009, in recv_into
return self.read(nbytes, buffer)
File "/XXX/lib/python3.6/ssl.py", line 871, in read
return self._sslobj.read(len, buffer)
File "/XXX/lib/python3.6/ssl.py", line 631, in read
v = self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 104] Connection reset by peer
查看 ssl.py:631
没有给我更多线索 - 我们必须更深入!
def read(self, len=1024, buffer=None):
"""Read up to 'len' bytes from the SSL object and return them.
If 'buffer' is provided, read into this buffer and return the number of
bytes read.
"""
if buffer is not None:
v = self._sslobj.read(len, buffer) # <--- exception here
else:
v = self._sslobj.read(len)
return v
我试过搜索它 on CPython repo但是 AFAICS 似乎没有什么可以引发它,我怀疑它隐藏在 SSL 实现中或 OSError
到 ConnectionError
子类之间的某些映射中。
我的最终目标是通过比较引发此错误的模块的 py2 和 py3 版本来编写 py2 和 py3 兼容代码来处理此异常(ConnectionError
是 py3 上的新功能)。
ConnectionError
子类我的问题起源是找到一种方法来捕获 ConnectionError
及其在 python2 和 python3 上的子类,所以这里是:
import errno
# ref: https://docs.python.org/3/library/exceptions.html#ConnectionError
_CONNECTION_ERRORS = frozenset({
errno.ECONNRESET, # ConnectionResetError
errno.EPIPE, errno.ESHUTDOWN, # BrokenPipeError
errno.ECONNABORTED, # ConnectionAbortedError
errno.ECONNREFUSED, # ConnectionRefusedError
})
try:
...
except OSError as e:
if e.errno not in _CONNECTION_ERRORS:
raise
print('got ConnectionError - %e' % e)
最佳答案
ConnectionResetError
在 errno
时引发是 ECONNRESET
。 errno
是 libc 指示系统调用是否发生错误的方式。
您可以在 Objects/exceptions.c
中搜索 ConnectionResetError
以了解此异常类型是如何初始化并添加到 errnomap
字典中的。
在self._sslobj.read
引发ConnectionResetError
的情况下,_sslobj.read
是用_ssl__SSLSocket_read_impl
实现的,实际的 ssl 读取是用 openssl 的 SSL_read
完成的:
count = SSL_read(self->ssl, mem, len);
_PySSL_UPDATE_ERRNO_IF(count <= 0, self, count);
当错误发生时,_PySSL_UPDATE_ERRNO_IF
将设置 (sock)->ssl_errno = SSL_ERROR_SYSCALL
和 (sock)->c_errno = ECONNRESET
。
稍后,在 PySSL_SetError
中:
err = obj->ssl_errno;
switch (err) {
...
case SSL_ERROR_SYSCALL:
if (obj->c_errno) {
errno = obj->c_errno;
return PyErr_SetFromErrno(PyExc_OSError);
}
PyErr_SetFromErrno(PyExc_OSError)
等于:
OSError(errno.ECONNRESET, 'Connection reset by peer', ...)
当 OSError
使用 errno
构造时,it will lookup a more specified subclass ,通过在上述errnomap
dict中查找errno
值:
newtype = PyDict_GetItem(errnomap, myerrno);
if (newtype) {
assert(PyType_Check(newtype));
type = (PyTypeObject *) newtype;
}
它实际上返回并引发了一个 ConnectionResetError
异常。
关于python - SSL ConnectionResetError 从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52312606/
我有一个关于在 Python3 中处理 ConnectionResetError 的问题。这通常发生在我使用 urllib.request.Request 函数时。我想知道如果我们遇到这样的错误是否可
我是 python 的新手。下面的函数给出了 imdb 中的电影和导演名称。它适用于单个链接。但是,当我为大量链接运行它时,它会出现 ConnectionResetError: [WinError 1
# -*- coding: UTF-8 -*- import urllib.request import re import os os.system("cls") url=input("Url Li
我是 Python 3 的新手,正在使用 asyncio。因此,我在以下服务器端代码中遇到了奇怪的行为: import asyncio @asyncio.coroutine def handle_cl
我正在尝试使用以下问题中的代码将文件上传到 S3 存储桶:https://stackoverflow.com/a/15087468/291372 。我正在使用 boto2 (boto3 有太多依赖项)
长话短说 我的问题很简单 - 在调用 self._sslobj.read(len, buffer) rows = (row for row in reader) File "/XXX/lib/pyth
使我的程序崩溃的异常如下: Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versio
当使用 selenium 和 chromedriver 在 django 站点上运行测试时,我收到很多 ConnectionResetErrors。完整的错误输出包含在底部。请注意,即使如此,测试也能
我尝试使用 PUT REST Api 上传文件,但收到 ConnectionResetError 。我尝试过使用 urllib.request.Request()与 urllib.request.ur
我正在构建一个 Python 脚本,该脚本在我的数据库中搜索所有 URL,然后按照 URL 查找损坏的链接。该脚本在打开链接时遇到错误时需要使用异常处理来记录,但是它开始遇到错误,我完全无法为以下内容
编辑:澄清一下:它确实可以编译,但在流加载后几乎立即崩溃。 它确实连接正确。 所以,我已经尝试了很长时间来完成我的这个项目。我想做的是使用 cv2 通过套接字发送视频源。它通过 LAN 运行,而不是通
我有一个 Flask Rest api 应用程序,具有以下设置。 已安装的软件包 alembic==1.3.0 aniso8601==8.0.0 astroid==2.3.3 attrs==19.3.
客户端: data = b'\xff' * 1000000 ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) #context
我和你们中的许多人有类似的问题,但无法解决。我正在生成一个在我的 VirtualBox Linux 7.3 和 7.9 上运行良好的自执行文件,但是当我尝试在其他地方(在其他 Linux 服务器上)运
这个问题在这里已经有了答案: Selenium headless browser webdriver [Errno 104] Connection reset by peer (3 个答案) 关闭
我正在使用 python 3.6 并使用最新版本的 chromedriver,我尝试使用旧版本的 chromedriver,我遇到了同样的问题,重新启动了我的电脑,同样的问题。这是我运行以重现错误的代
通过stackoverflow搜索并发布这个问题,因为没有解决方案对我有用,我的问题可能与其他问题不同。 我正在编写一个脚本,它从rabbitMQ 队列中获取一篇文章并处理该文章以计算单词并从中提取关
我有这个讨厌的错误: Traceback (most recent call last): File "/home/ubuntu/.local/lib/python3.5/site-package
我正在使用 selenium 模块,但突然出现此错误 ConnectionResetError: [WinError 10054] An existing connection was forcibl
我有 socket 问题 import socket serverName = "herk-PC" serverPort = 12000 clientSocket = socket.socket(so
我是一名优秀的程序员,十分优秀!