Last active
December 10, 2015 17:58
-
-
Save lehrblogger/4471424 to your computer and use it in GitHub Desktop.
httplib error with gevent, and xmlrpclib (update: no longer requires sleekxmpp to repro)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# from geventhttpclient import httplib | |
# httplib.patch() | |
from gevent import monkey; monkey.patch_all() | |
import gevent | |
from time import sleep | |
import logging | |
import xmlrpclib | |
server = 'dev.vine.im' | |
logging.basicConfig(level=logging.DEBUG, format='%(asctime)-15s %(levelname)-7s - %(message)s') | |
xmlrpc_server = xmlrpclib.ServerProxy('http://%s:4560' % server) | |
def add_rosteritem(user, other_user): | |
gevent.spawn(_xmlrpc_command, 'add_rosteritem', { | |
'localuser': user, | |
'localserver': server, | |
'user': other_user, | |
'server': server, | |
'group': 'argh', | |
'nick': other_user, | |
'subs': 'both' | |
}) | |
def _xmlrpc_command(command, data): | |
logging.debug('XMLRPC ejabberdctl: %s %s' % (command, str(data))) | |
fn = getattr(xmlrpc_server, command) | |
return fn({ | |
'user': '_leaves', | |
'server': server, | |
'password': 'somepassword' | |
}, data) | |
if __name__ == '__main__': | |
for i in range(1,20): | |
add_rosteritem('jabberwocky', 'user%d' % i) | |
sleep(2) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from time import sleep | |
import logging | |
import xmlrpclib | |
import httplib | |
import io | |
server = 'dev.vine.im' | |
logging.basicConfig(level=logging.DEBUG, format='%(asctime)-15s %(levelname)-7s - %(message)s') | |
class FireAndForget(xmlrpclib.Transport): | |
mock_xml_response = u'<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>res</name><value><int>0</int></value></member></struct></value></param></params></methodResponse>' | |
def single_request(self, host, handler, request_body, verbose=0): | |
logging.warn(self._connection) | |
h = self.make_connection(host) | |
if verbose: | |
h.set_debuglevel(1) | |
try: | |
self.send_request(h, handler, request_body) | |
self.send_host(h, host) | |
self.send_user_agent(h) | |
self.send_content(h, request_body) | |
self.verbose = verbose | |
h.close() # h is closed by the standard transport anyway, so it's fine to ignore the response by doing this. | |
response = io.StringIO(self.mock_xml_response) | |
return self.parse_response(response) | |
except xmlrpclib.Fault: | |
raise | |
except Exception: | |
# All unexpected errors leave connection in a strange state, so we clear it. | |
self.close() | |
raise | |
xmlrpc_server = xmlrpclib.ServerProxy('http://%s:4560' % server, transport=FireAndForget()) | |
def add_rosteritem(user, other_user): | |
_xmlrpc_command('add_rosteritem', { | |
'localuser': user, | |
'localserver': server, | |
'user': other_user, | |
'server': server, | |
'group': 'argh', | |
'nick': other_user, | |
'subs': 'both' | |
}) | |
def _xmlrpc_command(command, data): | |
logging.debug('XMLRPC ejabberdctl: %s %s' % (command, str(data))) | |
fn = getattr(xmlrpc_server, command) | |
return fn({ | |
'user': '_leaves', | |
'server': server, | |
'password': 'somepassword' | |
}, data) | |
if __name__ == '__main__': | |
for i in range(3): | |
add_rosteritem('jabberwocky', 'user%d' % i) | |
sleep(2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think this is the relevant bit of httplib.py that's failing (full source here):
Also, I think this: