2010-08-08 81 views
0

_ssl.sslwrap函数似乎检查传入的sock是否是_socket.socket的子类。我传入一个实现_socket.socket接口的类。_ssl.sslwrap函数params上的类型强制执行

它变得疯狂,因为我的套接字不是子类。这是我应该在我身边修理的东西,还是我应该从python-dev家伙那里得到的东西?

这里是来自ssl.SSLSocket的代码。 初始化这是给我的悲伤:

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

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

UPDATE:

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

回答

1

我同意明确强制执行类型层次似乎是非Pythonic,你可能想问问开发人员。

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

不管怎样,在此期间,一个解决方法可能是一个代理对象是:

(a)由_socket.socket继承(并因此不要求它的_socket.socketisinstance),但

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

什么其他Pythonists觉得呢?这是一个好主意吗?