2010-08-08 80 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覺得呢?這是一個好主意嗎?