import tornado.httpserver import tornado.httpclient import tornado.ioloop import tornado.options import tornado.web import logging import time from functools import partial class MainHandler(tornado.web.RequestHandler): @tornado.web.asynchronous def get(self, url, retry = 0): http = tornado.httpclient.AsyncHTTPClient() request = tornado.httpclient.HTTPRequest(url=url, connect_timeout=1.0, request_timeout=1.0) http.fetch(request, callback=self.async_callback( partial(self.on_response, retry=2, url = url) ) ) def on_response(self, response, retry= 0, url= None): if response.error: #import pdb; pdb.set_trace() if isinstance(response.error, tornado.httpclient.HTTPError): raise tornado.web.HTTPError(status_code = response.error.code) if (retry > 0) and (url is not None) : self.get(url, retry - 1) else: raise tornado.web.HTTPError(500) else: self.write(response.body) self.finish() def main(): tornado.options.parse_command_line() application = tornado.web.Application([ (r"/(.*)", MainHandler), ]) http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start() if __name__ == "__main__": main()