103 lines
2.6 KiB
Python
103 lines
2.6 KiB
Python
"""http client that uses pycurl
|
|
"""
|
|
|
|
from eventlet import api
|
|
|
|
import pycurl
|
|
|
|
|
|
CURL_POLL_NONE = 0
|
|
CURL_POLL_IN = 1
|
|
CURL_POLL_OUT = 2
|
|
CURL_POLL_INOUT = 3
|
|
CURL_POLL_REMOVE = 4
|
|
|
|
|
|
|
|
SUSPENDED_COROS = {}
|
|
LAST_SOCKET = None
|
|
LAST_SOCKET_DONE = False
|
|
|
|
|
|
def hub_callback(fileno):
|
|
print "HUB_CALLBACK", fileno
|
|
SUSPENDED_COROS[fileno].switch()
|
|
|
|
|
|
def socket_callback(action, socket, user_data, socket_data):
|
|
global LAST_SOCKET
|
|
global LAST_SOCKET_DONE
|
|
LAST_SOCKET = socket
|
|
LAST_SOCKET_DONE = False
|
|
print "SOCKET_CALLBACK", action, socket, user_data, socket_data
|
|
hub = api.get_hub()
|
|
if action == CURL_POLL_NONE:
|
|
# nothing to do
|
|
return
|
|
elif action == CURL_POLL_IN:
|
|
print "POLLIN"
|
|
hub.add_descriptor(socket, read=hub_callback)
|
|
elif action == CURL_POLL_OUT:
|
|
print "POLLOUT"
|
|
hub.add_descriptor(socket, write=hub_callback)
|
|
elif action == CURL_POLL_INOUT:
|
|
print "POLLINOUT"
|
|
hub.add_descriptor(socket, read=hub_callback, write=hub_callback)
|
|
elif action == CURL_POLL_REMOVE:
|
|
print "POLLREMOVE"
|
|
hub.remove_descriptor(socket)
|
|
LAST_SOCKET_DONE = True
|
|
|
|
|
|
THE_MULTI = pycurl.CurlMulti()
|
|
THE_MULTI.setopt(pycurl.M_SOCKETFUNCTION, socket_callback)
|
|
|
|
|
|
def read(*data):
|
|
print "READ", data
|
|
|
|
|
|
def write(*data):
|
|
print "WRITE", data
|
|
|
|
|
|
def runloop_observer(*_):
|
|
result, numhandles = THE_MULTI.socket_all()
|
|
print "PERFORM RESULT", result
|
|
while result == pycurl.E_CALL_MULTI_PERFORM:
|
|
result, numhandles = THE_MULTI.socket_all()
|
|
print "PERFORM RESULT2", result
|
|
|
|
|
|
def get(url):
|
|
hub = api.get_hub()
|
|
c = pycurl.Curl()
|
|
c.setopt(pycurl.URL, url)
|
|
#c.setopt(pycurl.M_SOCKETFUNCTION, socket_callback)
|
|
c.setopt(pycurl.WRITEFUNCTION, write)
|
|
c.setopt(pycurl.READFUNCTION, read)
|
|
c.setopt(pycurl.NOSIGNAL, 1)
|
|
THE_MULTI.add_handle(c)
|
|
hub.add_observer(runloop_observer, 'before_waiting')
|
|
while True:
|
|
print "TOP"
|
|
result, numhandles = THE_MULTI.socket_all()
|
|
print "PERFORM RESULT", result
|
|
while result == pycurl.E_CALL_MULTI_PERFORM:
|
|
result, numhandles = THE_MULTI.socket_all()
|
|
print "PERFORM RESULT2", result
|
|
|
|
if LAST_SOCKET_DONE:
|
|
break
|
|
|
|
SUSPENDED_COROS[LAST_SOCKET] = api.getcurrent()
|
|
print "SUSPENDED", SUSPENDED_COROS
|
|
api.get_hub().switch()
|
|
print "BOTTOM"
|
|
|
|
if not SUSPENDED_COROS:
|
|
hub.remove_observer(runloop_observer)
|
|
|
|
|
|
#from eventlet.support import pycurls
|
|
#reload(pycurls); from eventlet.support import pycurls; pycurls.get('http://localhost/') |