在_ssl.sslwrap函数参数上执行类型

时间:2010-08-08 04:48:55

标签: python sockets ssl

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

它生气,因为我的套接字不是子类。这是我应该解决的问题,或者这是我应该从python-dev家伙那里询问的事情?

这是来自ssl.SSLSocket。 init 的代码让我感到悲伤:

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

就我而言,self._sock是我的自定义套接字类的一个实例。

更新:

我将研究这些东西是如何扭曲的。我的假插座太复杂了。但是,我仍然很好奇为什么_ssl模块按照它的方式强制执行套接字类型。

1 个答案:

答案 0 :(得分:1)

我同意明确强制执行类型层次结构似乎不是Pythonic,并且您可能想要询问开发人员。

OTOH,我想知道它是否与_ssl和_socket是ssl和socket的实现模块有关。我没有使用过ssl,而且我几乎没有使用套接字,但在使用它们直接使用_ssl或_socket时,它是否经常是必需的?

无论如何,在此期间,一个解决方法可能是代理对象:

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

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

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

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, ... )

其他Python主义者的想法是什么?这是个好主意吗?