Skip to content

Instantly share code, notes, and snippets.

@mr1azl
Created April 27, 2016 13:13
Show Gist options
  • Select an option

  • Save mr1azl/0a6f7bd1f6b9878abde36550080dcf88 to your computer and use it in GitHub Desktop.

Select an option

Save mr1azl/0a6f7bd1f6b9878abde36550080dcf88 to your computer and use it in GitHub Desktop.
class ForwardingRequestHandler (tornado.web.RequestHandler):
def handle_response(self, response):
if response.error and not isinstance(response.error,
tornado.httpclient.HTTPError):
note("response has error %s", response.error)
self.set_status(500)
self.write("Internal server error:\n" +
str(response.error))
self.finish()
else:
self.set_status(response.code)
for header in ("Date", "Cache-Control", "Server", "Content-
Type", "Location"):
v = response.headers.get(header)
if v:
self.set_header(header, v)
if response.body:
self.write(response.body)
self.finish()
def forward(self, port=None, host=None):
try:
tornado.httpclient.AsyncHTTPClient().fetch(
tornado.httpclient.HTTPRequest(
url="%s://%s:%s%s" % (
self.request.protocol, host or "127.0.0.1",
port or 80, self.request.uri),
method=self.request.method,
body=self.request.body,
headers=self.request.headers,
follow_redirects=False),
self.handle_response)
except tornado.httpclient.HTTPError, x:
note("tornado signalled HTTPError %s", x)
if hasattr(x, response) and x.response:
self.handle_response(x.response)
except tornado.httpclient.CurlError, x:
note("tornado signalled CurlError %s", x)
self.set_status(500)
self.write("Internal server error:\n" +
''.join(traceback.format_exception(*sys.exc_info())))
self.finish()
except:
self.set_status(500)
self.write("Internal server error:\n" +
''.join(traceback.format_exception(*sys.exc_info())))
self.finish()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment