python - _ssl.sslwrap 函数参数的类型强制

标签 python sockets ssl

_ssl.sslwrap 函数似乎检查传入的 sock 是否是 _socket.socket 的子类。我正在传递一个实现 _socket.socket 接口(interface)的类。

它很生气,因为我的套接字不是子类。这是我应该解决的问题,还是我应该向 python 开发人员询问的问题?

这是 ssl.SSLSocket.init 中的代码,这让我很伤心:

self._sslobj = _ssl.sslwrap(self._sock, server_side,
                                    keyfile, certfile,
                                    cert_reqs, ssl_version, ca_certs,
                                    ciphers)

在我的例子中,self._sock 是我的自定义套接字类的一个实例。

更新:

我将研究其中一些东西的扭曲程度。我的假套接字变得太复杂了。但是,我仍然很好奇为什么 _ssl 模块会按原样强制执行套接字类型。

最佳答案

我同意明确强制执行类型层次结构似乎不符合 Python 风格,您可能想问问开发人员。

OTOH,我想知道它是否与 _ssl 和 _socket 是 ssl 和 socket 的实现模块有关。我没有用过ssl,也几乎没有用过socket,但是在使用的时候直接用_ssl或者_socket是不是真的日常有必要?

无论如何,与此同时,一个解决方法可能是一个代理对象:

(a) 继承自 _socket.socket(因此声称它是 _socket.socket实例),但是

(b) 将其所有消息传递给您实际的“套接字接口(interface)”兼容对象。

我还没有测试过这段代码,所以我希望这不是一个卑鄙的贡献:

def socketify( socket_protocol_compliant_object ):
    import _socket
    class proxy( _socket.socket ):
        def __init__( self ): pass
        def __getattribute__( self, attr_name ):
            return getattr( socket_protocol_compliant_object, attr_name )
        def __setattribute__( self, attr_name, new_value ):
            setattr( socket_protocol_compliant_object, attr_name, new_value )
    return proxy()

self._sslobj = _ssl.sslwrap( socketify(self._sock), server_side, keyfile, ... )

其他 Pythonist 怎么看?这是个好主意吗?

关于python - _ssl.sslwrap 函数参数的类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3433115/

相关文章:

ios - 使用 Microsoft Azure SDK 在 iOS 中固定 SSL 证书

python - 应该定义 undefined variable ,但我把它弄得太复杂了

python - Python Pandas 中的困难 Dataframe Reshape

c - 如何获取服务器程序的 IP 地址?

java - 将对象流与 SSL 套接字一起使用时出错

encryption - SSL如何使用对称和非对称加密?以及如何管理一台主机上多个站点的认证?

Python 抛出奇怪的 NameError : name <function_name> is not defined

Python 代码 - SVD 与 numpy

python - 在 Python 套接字中接收自定义 Scapy 数据包

configuration - 在 PHP fsockopen() 中启用 SSL