首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用cherrypy和https时,在加载大型文件时抛出异常的原因是什么?

当使用cherrypy和https时,在加载大型文件时抛出异常的原因是什么?
EN

Stack Overflow用户
提问于 2022-02-03 16:33:40
回答 1查看 41关注 0票数 0

系统信息

代码语言:javascript
复制
$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

$ uname -a
Linux lb-cam-11 3.10.0-1160.36.2.el7.x86_64 #1 SMP Wed Jul 21 11:57:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ python --version
Python 3.7.1

$ openssl version
OpenSSL 1.0.1h 5 Jun 2014

>>> cherrypy.__version__
'18.1.0'

>>> import ssl
>>> [(ele, sys.modules[ele]) for ele in sys.modules if 'ssl' in ele]
[('ssl',
  <module 'ssl' from '/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/ssl.py'>),
 ('_ssl',
  <module '_ssl' from '/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/lib-dynload/_ssl.cpython-37m-x86_64-linux-gnu.so'>)]
>>>

>>> cheroot.__version__
'6.5.4'

我正在尝试设置一个使用https的cherrypy服务器。

我使用的与ssl相关的cherrypy配置如下所示:

代码语言:javascript
复制
server_config={
    'server.socket_host': chrysocketserver,
    'server.socket_port':int(chrysocketport),
    'server.ssl_module':'pyopenssl',
    'server.ssl_certificate':sslcertificate,
    'server.ssl_private_key':privatekey,
    'server.ssl_certificate_chain':certificatechain,
}
cherrypy.config.update(server_config)

对于小页面,这看起来很好,但是当我尝试加载一个大页面时(我还没有弄清楚问题在什么时候开始发生),cheroot后端(我对此一无所知)抛出了一个异常,看起来如下:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/server.py", line 1252, in communicate
    req.respond()
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/server.py", line 1056, in respond
    self.server.gateway(self).respond()
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/wsgi.py", line 147, in respond
    self.write(chunk)
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/wsgi.py", line 228, in write
    self.req.write(chunk)
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/server.py", line 1112, in write
    self.conn.wfile.write(chunk)
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/makefile.py", line 36, in write
    self._flush_unlocked()
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/cheroot/makefile.py", line 45, in _flush_unlocked
    n = self.raw.write(bytes(self._write_buf))
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/socket.py", line 607, in write
    return self._sock.send(b)
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/OpenSSL/SSL.py", line 1729, in send
    self._raise_ssl_error(self._ssl, result)
  File "/tools/oss/packages/x86_64-centos7/python/3.7.1/lib/python3.7/site-packages/OpenSSL/SSL.py", line 1616, in _raise_ssl_error
    raise WantWriteError()
OpenSSL.SSL.WantWriteError

(部分页面已加载,但并非全部加载)

有人见过这个问题吗?知道是什么引起的吗?表面上看,被写入的套接字看起来是不可写的(因为缓冲区已经满了?)当它遇到SSL.WantWriteError时,它只会引发一个异常(而不是等待和再次尝试)。但我在读这本书的时候可能太天真了。

有人知道我该如何解决这个问题吗?

您错误地假设stdlib ssl

是的,在发帖后,我注意到了这一点,并回复为一个答案(重复如下),它被删除了(可能是因为它实际上不是一个答案)--实际使用的版本是120万:

抱歉-我发布的ssl版本只是openssl的输出,但是python使用的是更高版本(1.0.2m):

代码语言:javascript
复制
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2m  2 Nov 2017'

这也太老了吗?(我相信它支持TLS 1.2,但我不知道它支持什么密码器或其他)

我确实认为这不太可能是ssl问题,因为很好地加载了小页面。

无论哪种情况,在这种环境中,对于所使用的ssl版本,我都束手无策。为了进行测试,我需要在本地机器上构建python + openssl (以及任何其他依赖项),所以可能还需要一段时间才能找到时间来测试它。

EN

回答 1

Stack Overflow用户

发布于 2022-02-08 16:04:35

最后回答我的问题。

在pyopenssl ssl_module中似乎存在一个与OpenSSL.SSL.WantReadError和OpenSSL.SSL.WantWriteError的处理方式有关的bug,如这里所记录的:https://github.com/cherrypy/cheroot/issues/245

如果我使用“内置”模块配置cherrypy,如下所示:

代码语言:javascript
复制
server_config={
    'server.socket_host': chrysocketserver,
    'server.socket_port':int(chrysocketport),
    'server.ssl_module':'builtin',
    'server.ssl_certificate':sslcertificate,
    'server.ssl_private_key':privatekey,
    'server.ssl_certificate_chain':certificatechain,
}
cherrypy.config.update(server_config)

它工作得很好(至少在我的环境中)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70974970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档