Advertisement
Guest User

curl timeout issue

a guest
Apr 27th, 2012
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.99 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. LOGGING_CONFIG = {
  4.     'version' : 1,
  5.     'disable_existing_loggers': True,
  6.      'formatters': {
  7.         'simple': {
  8.             'format': '%(asctime)s %(levelname)s %(process)d %(message)s'
  9.         },
  10.     },
  11.     'handlers': {
  12.         'console':{
  13.                 'level': 'DEBUG',
  14.                 'class': 'logging.StreamHandler',
  15.             'formatter': 'simple',
  16.         },
  17.     },
  18.     'loggers': {
  19.         '': {
  20.             'handlers': ['console'],
  21.             'level': 'DEBUG',
  22.         },
  23.     },
  24. }
  25.  
  26. import logging.config
  27. logging.config.dictConfig(LOGGING_CONFIG)
  28. from logging import debug
  29.  
  30.  
  31. from cStringIO import StringIO
  32. import time
  33.  
  34. import pycurl
  35. from pyev import EV_READ, EV_WRITE, EV_IO
  36. import pyev
  37. import os
  38.  
  39. event_map = {
  40.     pycurl.POLL_NONE: 0,
  41.     pycurl.POLL_IN: EV_READ,
  42.     pycurl.POLL_OUT: EV_WRITE,
  43.     pycurl.POLL_INOUT: EV_IO,
  44. }
  45.  
  46. def process_curl_complete_handles():
  47.     global multi
  48.     while 1:
  49.         num_q, ok_list, err_list = multi.info_read()
  50.         debug("process_curl_complete_handles: %s, %s, %s" % (num_q, ok_list, err_list))
  51.         for c in ok_list:
  52.             multi.remove_handle(c)
  53.             debug("success c.fetcher: %s" % repr(c.fetcher))
  54.             # XXX
  55.             c.fetcher.success()
  56.         for c, errnum, errmsg in err_list:
  57.             debug("c.fetcher.fail")
  58.             multi.remove_handle(c)
  59.             # XXX
  60.             c.fetcher.fail(errnum, errmsg)
  61.             os._exit(1)
  62.         if num_q == 0:
  63.             break
  64.  
  65.  
  66. def ev_event_cb(watcher, events):
  67.     global multi
  68.     debug("libev_eventc_cb: fd:%s, ev_event:%s" % (watcher.fd, events))
  69.     curl_action = 0
  70.     if events & EV_READ:
  71.         curl_action |= pycurl.CSELECT_IN
  72.     if events & EV_WRITE:
  73.         curl_action |= pycurl.CSELECT_OUT
  74.     while 1:
  75.         debug("processing curl fd:%s" % watcher.fd)
  76.         try:
  77.             ret, num_handles = multi.socket_action(watcher.fd, curl_action)
  78.         except pycurl.error, e:
  79.             ret = e.args[0]
  80.         if ret != pycurl.E_CALL_MULTI_PERFORM:
  81.             break
  82.     process_curl_complete_handles()
  83.  
  84.  
  85. def curl_socket_cb(event, fd, multi, data):
  86.     global watchers, loop
  87.     debug("curl_socket_cb: event: %s, fd:%s, multi:%s data:%s" % (event, fd, multi, data))
  88.     debug("watchers: %s" % repr(watchers))
  89.     if event == pycurl.POLL_REMOVE:
  90.         # curl wants to stop poll on fd
  91.         debug("removing polling for fd:%s" % fd)
  92.         watchers[fd].stop()
  93.         del watchers[fd]
  94.         return
  95.     else:
  96.         ev_event = event_map[event]
  97.         if fd not in watchers:
  98.             # create new watcher for socket
  99.             debug("creating new watcher")
  100.             watcher = loop.io(fd, ev_event, ev_event_cb)
  101.             watcher.start()
  102.             watchers[fd] = watcher
  103.         else:
  104.             debug("updating watcher")
  105.             watcher = watchers[fd]
  106.             watcher.stop()
  107.             watcher.set(fd, ev_event)
  108.             watcher.start()
  109.  
  110.  
  111.  
  112. def fetch(addr, url, headers):
  113.     global multi
  114.     fetcher = Fetcher(addr, url, headers)
  115.     fetchers.add(fetcher)
  116.  
  117.     multi.socket_action(pycurl.SOCKET_TIMEOUT, 0)
  118.     process_curl_complete_handles()
  119.  
  120.  
  121. class Fetcher(object):
  122.  
  123.     def __init__(self, addr, url, extra_headers):
  124.         global multi
  125.         c = pycurl.Curl()
  126.         debug("just created curl: %s in fetcher: %s for %s" % (c, self, addr))
  127.  
  128.         self.addr = addr
  129.  
  130.         c.setopt(pycurl.VERBOSE, 1)
  131.         c.setopt(pycurl.DEBUGFUNCTION, self.debug)
  132.  
  133.         self.read_buf = StringIO()
  134.         self.headers_buf = StringIO()
  135.  
  136.         setopt = c.setopt
  137.         setopt(pycurl.CONNECTTIMEOUT, 1)
  138.         setopt(pycurl.TIMEOUT, 5)
  139.         setopt(pycurl.URL, url)
  140.         setopt(c.WRITEFUNCTION, self.read_buf.write)
  141.         setopt(c.HEADERFUNCTION, self.headers_buf.write)
  142.  
  143.         headers = {  "Connection" : "Keep-Alive",
  144.                      "Accept-Encoding" : "gzip",
  145.                      "X-Uniq" : "0001092D567400BF",
  146.                      "User" : "fooNova",
  147.                      "X-Real-Ip" : "127.0.0.1",
  148.                      'User-Agent' : '',
  149.                      'Accept' : '',
  150.                   }
  151.         headers.update(extra_headers)
  152.         c.setopt(pycurl.HTTPHEADER, ['%s: %s' % (k,v) for k,v in headers.iteritems()])
  153.         c.fetcher = self
  154.         self.c = c
  155.         multi.add_handle(c)
  156.  
  157.     def debug(self, debug_type, msg):
  158.         debug("%s debug: %s %s" % (self.addr, repr(debug_type), repr(msg)))
  159.  
  160.     def success(self):
  161.         debug("fetcher %s success"  % (self,))
  162.         fetchers.remove(self)
  163.  
  164.     def fail(self, *args):
  165.         debug("fetcher %s fail"  % (self,))
  166.         fetchers.remove(self)
  167.  
  168. #  main
  169. watchers = {}
  170. fetchers = set([])
  171. loop = pyev.default_loop()
  172.  
  173. multi = pycurl.CurlMulti()
  174. multi.setopt(pycurl.M_MAXCONNECTS, 30)
  175. multi.setopt(pycurl.M_SOCKETFUNCTION, curl_socket_cb)
  176.  
  177.  
  178. last_fetch = time.time()
  179. def my_fetch():
  180.     fetch('spellcheck', 'http://beta21.foo.ru/spellcheck/vxml?query=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C%20%D0%B0%D0%B2%D1%82%D0%BE', {})
  181.     fetch('xmlsearch', 'http://xmlsearch.bar.ru/bar_url', {"Cookie": "spravka=dD0xMzM0ODQ1MTc4O2k9MTI3LjAuMC4xO3U9MTMzNDg0NTE3ODUwMDYyMDM0MztoPWIzYzU1NmE5ZmJiYWYxNzkwZTc0NWUwZjhiMGFhMDI2"})
  182.     fetch('yabs','http://yabs.bar.ru/code/yabs.bar_url', {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Referer": "http://nova.foo.ru/serp?query=%D0%BA%D1%83%D0%BF%D0%B8%D1%82%D1%8C%20%D0%B0%D0%B2%D1%82%D0%BE"} )
  183.     fetch('r0', 'http://localhost/rl0/xml/search.xml?id=search', {})
  184.     fetch('baz', 'http://autocontext.baz.ru/baz_url', {"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Cookie": "ruid=0000001D4F7D452C7D2C470D00000201"})
  185.  
  186. my_fetch()
  187.  
  188. while 1:
  189.     loop.start(pyev.EVRUN_ONCE)
  190.     if time.time() - last_fetch > 130:
  191.         last_fetch = time.time()
  192.         my_fetch()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement