xmlrpclib2.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # by Greg Hazel
  2. import xml
  3. import xmlrpclib
  4. from connection_cache import PyCURL_Cache, cache_set
  5. import pycurllib
  6. pycurllib.set_use_compression(True)
  7. class PyCurlTransport(xmlrpclib.Transport):
  8. def __init__(self, cache):
  9. self.host = None
  10. self.cache = cache
  11. def request(self, host, handler, request_body, verbose=0):
  12. for i in xrange(0):
  13. try:
  14. return self._request(host, handler, request_body, verbose)
  15. except:
  16. pass
  17. return self._request(host, handler, request_body, verbose)
  18. def set_connection_params(self, h):
  19. h.add_header('User-Agent', "xmlrpclib2.py/2.0")
  20. h.add_header('Connection', "Keep-Alive")
  21. h.add_header('Content-Type', "application/octet-stream")
  22. # this timeout is intended to save us from tomcat not responding
  23. # and locking the site
  24. h.set_timeout(20)
  25. def _request(self, host, handler, request_body, verbose=0):
  26. # issue XML-RPC request
  27. h = self.cache.get_connection()
  28. try:
  29. self.set_connection_params(h)
  30. h.add_data(request_body)
  31. response = pycurllib.urlopen(h, close=False)
  32. #errcode, errmsg, headers = h.getreply()
  33. errcode = response.code
  34. errmsg = response.msg
  35. headers = "N/A"
  36. if errcode != 200:
  37. raise xmlrpclib.ProtocolError(
  38. host + handler,
  39. errcode, errmsg,
  40. headers
  41. )
  42. self.verbose = verbose
  43. r = self._parse_response(response)
  44. finally:
  45. self.cache.put_connection(h)
  46. return r
  47. def _parse_response(self, response):
  48. # read response from input file/socket, and parse it
  49. p, u = self.getparser()
  50. d = response.getvalue()
  51. try:
  52. p.feed(d)
  53. except xml.parsers.expat.ExpatError, e:
  54. n = xml.parsers.expat.ExpatError("%s : %s" % (e, d))
  55. try:
  56. n.code = e.code
  57. n.lineno = e.lineno
  58. n.offset = e.offset
  59. except:
  60. pass
  61. raise n
  62. p.close()
  63. return u.close()
  64. def new_server_proxy(url):
  65. c = cache_set.get_cache(PyCURL_Cache, url)
  66. t = PyCurlTransport(c)
  67. return xmlrpclib.ServerProxy(url, transport=t)
  68. ServerProxy = new_server_proxy
  69. if __name__ == '__main__':
  70. s = ServerProxy('http://search.bittorrent.com/xmlrpc.jsp')
  71. r = s.search("potato", 0, 1, 1)
  72. print r
  73. r = s.search("anime", 0, 1, 1)
  74. print r
  75. r = s.search("phish", 0, 1, 1)
  76. print r
  77. r = s.search("games", 0, 1, 1)
  78. print r