Thursday, 15 March 2012

python - MongoClient ConnectionFailure after httpretty.enable() -



python - MongoClient ConnectionFailure after httpretty.enable() -

whenever enable httpretty, i'm unable create connection pymongo. know httpretty alters core socket module; there way around this?

code example:

import pymongo import httpretty import time httpretty.enable() try: client = pymongo.mongoclient() except pymongo.errors.autoreconnect: print("autoreconnect") time.sleep(2)

raises exception:

traceback (most recent phone call last): file "c:\python33\lib\site-packages\pymongo\mongo_client.py", line 363, in __init__ self._ensure_connected(true) file "c:\python33\lib\site-packages\pymongo\mongo_client.py", line 924, in _ensure_connected self.__ensure_member() file "c:\python33\lib\site-packages\pymongo\mongo_client.py", line 797, in __ensure_member member, nodes = self.__find_node() file "c:\python33\lib\site-packages\pymongo\mongo_client.py", line 888, in __find_node raise autoreconnect(', '.join(errors)) pymongo.errors.autoreconnect: [winerror 10035] non-blocking socket operation not completed during handling of above exception, exception occurred: traceback (most recent phone call last): file "tmp.py", line 7, in client = pymongo.mongoclient() file "c:\python33\lib\site-packages\pymongo\mongo_client.py", line 366, in __init__ raise connectionfailure(str(e)) pymongo.errors.connectionfailure: [winerror 10035] non-blocking socket operation not completed

i on windows 8.1 using python 3.3.

can explain behavior , how resolve it? thanks!

it looks exception beingness raised has httpretty's monkey-patched socket, calls settimeout(0) on own socket whenever phone call sendall on isn't http request (see real_sendall). puts socket in non-blocking mode. timeout on socket never reset after real_sendall, subsequent calls recv fail wsaewouldblock (errno 10035). might bug in httpretty.

one workaround reset timeout on socket after real_sendall. can accomplished monkey-patching fakesocket.socket in httpretty:

from httpretty.core import fakesock class mysocket(fakesock.socket): def real_sendall(self, data, *args, **kw): super(mysocket, self).real_sendall(data, *args, **kw) # restore non-zero timeout self.truesock.settimeout(self.timeout) fakesock.socket = mysocket

python sockets pymongo httpretty

No comments:

Post a Comment