美文网首页python热爱者
python 实现API代理服务

python 实现API代理服务

作者: 3a3259864266 | 来源:发表于2018-06-07 21:26 被阅读15次

    !/usr/bin/env python

    -- coding: utf-8 --

    Author: Dily

    Email:312797697@qq.com

    """实现API代理服务"""

    import logging

    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    import tornado.httpclient
    from tornado.web import HTTPError, asynchronous
    from tornado.httpclient import HTTPRequest
    from tornado.options import define, options
    try:
    from tornado.curl_httpclient import CurlAsyncHTTPClient as AsyncHTTPClient
    except ImportError:
    from tornado.simple_httpclient import SimpleAsyncHTTPClient as AsyncHTTPClient

    define("port", default=38888, help="run on the given port", type=int)
    define("api_protocol", default="https")
    define("api_host", default="DOMAIN")
    define("api_port", default="443")
    define("api_url", default="URI")
    define("debug", default=True, type=bool)

    class ProxyHandler(tornado.web.RequestHandler):
    @asynchronous
    def get(self):
    # enable API GET request when debugging
    if options.debug:
    return self.post()
    else:
    raise HTTPError(405)

    @asynchronous
    def post(self):
    protocol = options.api_protocol
    host = options.api_host
    port = options.api_port
    murl = options.api_url

    # port suffix
    port = "" if port == "443" else ":%s" % port
    
    uri = self.request.uri
    url = "%s://%s%s%s%s" % (protocol, host, port, uri, murl)
    
    # update host to destination host
    headers = dict(self.request.headers)
    headers["Host"] = host
    
    try:
      AsyncHTTPClient().fetch(
        HTTPRequest(url=url,
              method="POST",
              body=self.request.body,
              headers=headers,
              follow_redirects=False),
        self._on_proxy)
    except tornado.httpclient.HTTPError, x:
      if hasattr(x, "response") and x.response:
        self._on_proxy(x.response)
      else:
        logging.error("Tornado signalled HTTPError %s", x)
    

    def _on_proxy(self, response):
    if response.error and not isinstance(response.error,
    tornado.httpclient.HTTPError):
    raise HTTPError(500)
    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 main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
    (r"/.*", ProxyHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

    if name == "main":
    main()

    相关文章

      网友评论

        本文标题:python 实现API代理服务

        本文链接:https://www.haomeiwen.com/subject/agunsftx.html