Wie schreibt man einen web-proxy in Python

Ich versuche zu schreiben, ein web-proxy in python. Das Ziel ist der Besuch einer url wie: http://proxyurl/http://anothersite.com/ und sehen, dass er Inhalt http://anothersite.com wie Sie normalerweise würde. Ich habe mich anständig weit durch den Missbrauch der Anfragen, die Bibliothek, aber das ist nicht wirklich die beabsichtigte Verwendung des Anfragen-framework. Ich habe geschrieben proxies mit twisted vor, aber ich bin mir nicht sicher, wie Sie dieses in das, was ich versuche zu tun. Hier ist, wo ich bin so weit...

import os
import urlparse

import requests

import tornado.ioloop
import tornado.web
from tornado import template

ROOT = os.path.dirname(os.path.abspath(__file__))
path = lambda *a: os.path.join(ROOT, *a)

loader = template.Loader(path(ROOT, 'templates'))


class ProxyHandler(tornado.web.RequestHandler):
    def get(self, slug):
        if slug.startswith("http://") or slug.startswith("https://"):
            if self.get_argument("start", None) == "true":
                parsed = urlparse.urlparse(slug)
                self.set_cookie("scheme", value=parsed.scheme)
                self.set_cookie("netloc", value=parsed.netloc)
                self.set_cookie("urlpath", value=parsed.path)
            #external resource
            else:
                response = requests.get(slug)
                headers = response.headers
                if 'content-type' in headers:
                    self.set_header('Content-type', headers['content-type'])
                if 'length' in headers:
                    self.set_header('length', headers['length'])
                for block in response.iter_content(1024):
                    self.write(block)
                self.finish()
                return
        else:
            #absolute
            if slug.startswith('/'):
                slug = "{scheme}://{netloc}{original_slug}".format(
                    scheme=self.get_cookie('scheme'),
                    netloc=self.get_cookie('netloc'),
                    original_slug=slug,
                )
            #relative
            else:
                slug = "{scheme}://{netloc}{path}{original_slug}".format(
                    scheme=self.get_cookie('scheme'),
                    netloc=self.get_cookie('netloc'),
                    path=self.get_cookie('urlpath'),
                    original_slug=slug,
                )
        response = requests.get(slug)
        #get the headers
        headers = response.headers
        #get doctype
        doctype = None
        if '<!doctype' in response.content.lower()[:9]:
            doctype = response.content[:response.content.find('>')+1]
        if 'content-type' in headers:
           self.set_header('Content-type', headers['content-type'])
        if 'length' in headers:
            self.set_header('length', headers['length'])
        self.write(response.content)


application = tornado.web.Application([
    (r"/(.+)", ProxyHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Nur ein Hinweis, ich ein cookie gesetzt, um die Erhaltung der Regelung, netloc und urlpath, wenn die dort anfangen=true in den querystring. Auf diese Weise wird jeder relativen oder einen absoluten link, dann hat der proxy verwendet die Cookies aus, beheben Sie die vollständige url.

Mit diesem code, wenn Sie gehen, um http://localhost:8888/http://espn.com/?start=true Sie werden sehen, die Inhalte von ESPN. Jedoch, auf der folgenden Website, es funktioniert überhaupt nicht: http://www.bottegaveneta.com/us/shop/. Meine Frage ist, was ist der beste Weg, dies zu tun? Ist der Strom Weg, ich bin Umsetzung dieses robuste oder gibt es einige große Fallstricke, die es zu tun auf diese Weise? Wenn es richtig ist, warum sind gewisse Seiten wie die, die ich darauf hingewiesen, nicht zu arbeiten?

Danke für jede Hilfe.

  • Bottega Veneta lässt Sie nicht auf Ressourcen zugreifen, direkt. E. g, versuchen Sie zu schlagen, bottegaveneta.com/us/shop/css/bottegaveneta/form.css — bekomme ich eine HTML-Seite 404.
  • Ich vermute, es ist zu tun mit der HTTP-Referrer. Sie können versuchen, dass als gut.
  • Oh, du meinst den referer? (en.wikipedia.org/wiki/HTTP_referer#Origin_of_the_term_referer)
  • Anstatt herauszufinden, was die fehlenden header müssen Sie gehen durch eine defekte Seite zu einem Zeitpunkt, warum nicht einfach Durchlaufen alle Header außer eine Liste der diejenigen, die Sie nicht weitergeben wollen? Für HTTP/1.1, die Designer haben sich halb gewonnen die Schlacht für Sie: tools.ietf.org/html/rfc2616#section-13.5.1
  • genial, ich hatte keine Ahnung, es fehlte ein r.
  • Roodle kann ich diese nutzen, um proxy-server läuft auf einem anderen port?

InformationsquelleAutor Kang Roodle | 2013-05-13
Schreibe einen Kommentar