Ich habe Privoxy vor einigen Wochen heruntergeladen und war zum Spaß neugierig, wie eine einfache Version davon gemacht werden kann.
Ich verstehe, dass ich den Browser (Client) konfigurieren muss, um eine Anfrage an den Proxy zu senden. Der Proxy sendet die Anfrage an das Web (beispielsweise ein http-Proxy). Der Proxy erhält die Antwort ... aber wie kann der Proxy die Anfrage an den Browser (Client) zurücksenden?
Ich habe im Web nach C # und http-Proxy gesucht, aber nichts gefunden, was mich verstehen lässt, wie es hinter den Kulissen richtig funktioniert. (Ich glaube, ich möchte keinen Reverse-Proxy, bin mir aber nicht sicher).
Hat jemand von euch Erklärungen oder Informationen, mit denen ich dieses kleine Projekt fortsetzen kann?
Aktualisieren
Das verstehe ich (siehe Grafik unten).
Schritt 1 Ich konfiguriere den Client (Browser) so, dass alle Anforderungen an 127.0.0.1 an dem Port gesendet werden, den der Proxy abhört. Auf diese Weise wird die Anfrage nicht direkt an das Internet gesendet, sondern vom Proxy verarbeitet.
Schritt 2 Der Proxy sieht eine neue Verbindung, liest den HTTP-Header und sieht die Anforderung, die er ausführen muss. Er führt die Anfrage aus.
Schritt 3 Der Proxy erhält eine Antwort von der Anfrage. Jetzt muss er die Antwort aus dem Web an den Kunden senden, aber wie ???
Nützlicher Link
Mentalis Proxy : Ich habe dieses Projekt gefunden, das ein Proxy ist (aber mehr, als ich möchte). Ich könnte die Quelle überprüfen, aber ich wollte wirklich etwas Grundlegendes, um das Konzept besser zu verstehen.
ASP-Proxy : Möglicherweise kann ich auch hier einige Informationen abrufen.
Reflektor anfordern : Dies ist ein einfaches Beispiel.
Hier ist ein Git Hub Repository mit einem einfachen HTTP-Proxy .
Antworten:
Sie können eine mit der
HttpListener
Klasse erstellen , um auf eingehende Anforderungen zu warten, und dieHttpWebRequest
Klasse, um die Anforderungen weiterzuleiten.quelle
Ich würde HttpListener oder ähnliches nicht verwenden, auf diese Weise werden Sie auf so viele Probleme stoßen.
Vor allem wird es ein großer Schmerz sein, dies zu unterstützen:
Was Sie tun müssen, ist:
Ich habe 2 verschiedene HTTP-Proxys in .NET mit unterschiedlichen Anforderungen geschrieben und kann Ihnen sagen, dass dies der beste Weg ist, dies zu tun.
Mentalis macht das, aber ihr Code ist "Delegate Spaghetti", schlimmer als GoTo :)
quelle
Ich habe kürzlich einen leichten Proxy in c # .net mit TcpListener und TcpClient geschrieben .
https://github.com/titanium007/Titanium-Web-Proxy
Es unterstützt sicheres HTTP auf die richtige Weise. Der Client-Computer muss dem vom Proxy verwendeten Stammzertifikat vertrauen. Unterstützt auch WebSockets Relay. Alle Funktionen von HTTP 1.1 werden mit Ausnahme von Pipelining unterstützt. Pipelining wird von den meisten modernen Browsern sowieso nicht verwendet. Unterstützt auch die Windows-Authentifizierung (Plain, Digest).
Sie können Ihre Anwendung verbinden, indem Sie auf das Projekt verweisen und dann den gesamten Datenverkehr anzeigen und ändern. (Anfrage und Antwort).
Was die Leistung angeht, habe ich es auf meinem Computer getestet und arbeite ohne merkliche Verzögerung.
quelle
Proxy kann folgendermaßen funktionieren.
Schritt 1: Konfigurieren Sie den Client für die Verwendung von proxyHost: proxyPort.
Proxy ist ein TCP-Server, der proxyHost: proxyPort überwacht. Der Browser öffnet die Verbindung mit dem Proxy und sendet eine HTTP-Anfrage. Der Proxy analysiert diese Anforderung und versucht, den "Host" -Header zu erkennen. Dieser Header teilt Proxy mit, wo die Verbindung geöffnet werden soll.
Schritt 2: Proxy öffnet die Verbindung zu der im "Host" -Header angegebenen Adresse. Anschließend wird eine HTTP-Anforderung an diesen Remote-Server gesendet. Liest die Antwort.
Schritt 3: Nachdem die Antwort vom Remote-HTTP-Server gelesen wurde, sendet der Proxy die Antwort über eine zuvor geöffnete TCP-Verbindung mit dem Browser.
Schematisch sieht es so aus:
quelle
Wenn Sie nur den Datenverkehr abfangen möchten, können Sie den Fiddler-Kern verwenden, um einen Proxy zu erstellen ...
http://fiddler.wikidot.com/fiddlercore
Führen Sie Fiddler zuerst mit der Benutzeroberfläche aus, um zu sehen, was es tut. Es ist ein Proxy, mit dem Sie den http / https-Verkehr debuggen können. Es ist in c # geschrieben und hat einen Kern, den Sie in Ihre eigenen Anwendungen einbauen können.
Beachten Sie, dass FiddlerCore für kommerzielle Anwendungen nicht kostenlos ist.
quelle
Mit OWIN und WebAPI ist es wirklich einfach geworden. Bei meiner Suche nach einem C # Proxy-Server bin ich auch auf diesen Beitrag gestoßen : http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Dies wird der Weg sein, den ich gehe.
quelle
Stimmen Sie dr böse zu, wenn Sie HTTPListener verwenden, werden Sie viele Probleme haben, Sie müssen Anfragen analysieren und werden mit Headern und ...
Sie sehen, dass Sie nicht einmal wissen müssen, was in der Browseranforderung enthalten ist, und sie analysieren müssen. Holen Sie sich nur die Adresse der Zielwebsite aus der ersten Zeile. Die erste Zeile gefällt normalerweise. GET http://google.com HTTP1.1 oder CONNECT facebook.com: 443 (dies ist für SSL-Anfragen)
quelle
Socks4 ist ein sehr einfach zu implementierendes Protokoll. Sie warten auf die erste Verbindung, stellen eine Verbindung zu dem vom Client angeforderten Host / Port her, senden den Erfolgscode an den Client und leiten die ausgehenden und eingehenden Streams über Sockets weiter.
Wenn Sie sich für HTTP entscheiden, müssen Sie einige HTTP-Header lesen und möglicherweise festlegen / entfernen, damit dies etwas mehr Arbeit bedeutet.
Wenn ich mich richtig erinnere, funktioniert SSL über HTTP- und Socks-Proxys hinweg. Für einen HTTP-Proxy implementieren Sie das Verb CONNECT, das ähnlich wie die oben beschriebenen socks4 funktioniert. Anschließend öffnet der Client die SSL-Verbindung über den Proxy-TCP-Stream.
quelle
Der Browser ist mit dem Proxy verbunden, sodass die Daten, die der Proxy vom Webserver erhält, nur über dieselbe Verbindung gesendet werden, die der Browser an den Proxy initiiert hat.
quelle
Hier ist eine asynchrone C # -Beispielimplementierung, die auf HttpListener und HttpClient basiert (ich verwende sie, um Chrome auf Android-Geräten mit IIS Express zu verbinden, das ist der einzige Weg, den ich gefunden habe ...).
Und wenn Sie HTTPS-Unterstützung benötigen, sollte nicht mehr Code erforderlich sein, sondern nur die Zertifikatskonfiguration: Httplistener mit HTTPS-Unterstützung
quelle