首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python实现真正无阻塞的HTTPS服务器

用Python实现真正无阻塞的HTTPS服务器
EN

Stack Overflow用户
提问于 2014-10-23 15:02:56
回答 1查看 2.5K关注 0票数 7

我正在用Python构建一个真正非阻塞的HTTPS服务器。如果每个人都玩得很好,下面的最小代码就能正常工作:

代码语言:javascript
复制
import BaseHTTPServer
import SimpleHTTPServer
import SocketServer
import ssl 

class ThreadedHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
    pass

httpd = ThreadedHTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile="localhost.key", certfile="localhost.pem", server_side=True)
httpd.serve_forever()

但是,问题是,至少在TLS握手期间,此服务器会阻塞。

试验用:

代码语言:javascript
复制
$ nc localhost 4443  # leave this open

然后(在另一个航站楼):

代码语言:javascript
复制
$ wget --no-check-certificate https://localhost:4443/
--2014-10-23 16:55:54--  https://localhost:4443/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:4443... connected.

wget进程块,表示服务器中的某些内容被阻塞。一旦我关闭nc进程,wget将继续。这显然是不切实际的。

如何在Python中获得真正的非阻塞HTTPS服务器,最好不用额外的第三方软件?

我应该指出,没有TLS (即没有wrap_socket行),相同的代码可以正常工作。

Steffen指出了如何做到这一点:将do_handshake_on_connect=False传递给wrap_socket,然后自己握手。在本例中,子类BaseHTTPServer.HTTPServer,重写handle,然后进行握手,如Python (套接字称为self.request)所示,然后调用超级方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-23 17:27:25

您必须通过使用ssl.wrap_socket调用do_handshake_on_connect=False来实现非阻塞SSL接受,然后自己调用do_handshake,直到它成功为止。见https://docs.python.org/3/library/ssl.html#notes-on-non-blocking-sockets

您也可以简单地使用Tornado,它是一个用python编写的web服务器,它还可以进行完全非阻塞的SSL处理。即使您不想自己使用它,您也可以查看源代码,看看它是如何完成的(搜索do_handshake)。

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

https://stackoverflow.com/questions/26531146

复制
相关文章

相似问题

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