Pobrałem Privoxy kilka tygodni temu i dla zabawy byłem ciekaw, jak można zrobić prostą wersję.
Rozumiem, że muszę skonfigurować przeglądarkę (klienta), aby wysyłała żądanie do proxy. Serwer proxy wysyła żądanie do sieci (powiedzmy, że jest to serwer proxy http). Proxy otrzyma odpowiedź ... ale w jaki sposób proxy może odesłać żądanie do przeglądarki (klienta)?
Wyszukałem w Internecie C # i proxy HTTP, ale nie znalazłem czegoś, co pozwoliłoby mi zrozumieć, jak to działa poprawnie za kulisami. (Uważam, że nie chcę odwrotnego serwera proxy, ale nie jestem pewien).
Czy ktoś z was ma jakieś wyjaśnienia lub informacje, które pozwolą mi kontynuować ten mały projekt?
Aktualizacja
To właśnie rozumiem (patrz grafika poniżej).
Krok 1 Konfiguruję klienta (przeglądarkę) tak, aby wszystkie żądania były wysyłane do 127.0.0.1 na porcie nasłuchiwanym przez Proxy. W ten sposób żądanie nie zostanie wysłane bezpośrednio do Internetu, ale będzie przetwarzane przez proxy.
Krok 2 Proxy widzi nowe połączenie, czyta nagłówek HTTP i widzi żądanie, które musi wykonać. Wykonuje żądanie.
Krok 3 Proxy otrzymuje odpowiedź z żądania. Teraz musi wysłać odpowiedź z sieci do klienta, ale jak ???
Przydatny link
Mentalis Proxy : Znalazłem ten projekt, który jest proxy (ale bardziej niż bym chciał). Mogę sprawdzić źródło, ale naprawdę chciałem czegoś podstawowego, aby lepiej zrozumieć koncepcję.
ASP Proxy : Mogę tu również uzyskać informacje.
Poproś o odbłyśnik : to jest prosty przykład.
Odpowiedzi:
Możesz zbudować
HttpListener
klasę, która nasłuchuje żądań przychodzących iHttpWebRequest
klasę, która będzie przekazywać żądania.źródło
Nie użyłbym HttpListener lub czegoś podobnego, w ten sposób napotkasz tak wiele problemów.
A co najważniejsze, wspieranie:
Musisz:
Napisałem 2 różne proxy HTTP w .NET z różnymi wymaganiami i mogę powiedzieć, że jest to najlepszy sposób na zrobienie tego.
Mentalis to robi, ale ich kod brzmi „deleguj spaghetti”, gorzej niż GoTo :)
źródło
Niedawno napisałem lekki serwer proxy w c # .net przy użyciu TcpListener i TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Obsługuje bezpieczny HTTP we właściwy sposób, komputer kliencki musi ufać certyfikatowi głównemu używanemu przez proxy. Obsługuje również przekaźnik WebSockets. Obsługiwane są wszystkie funkcje protokołu HTTP 1.1 z wyjątkiem potokowania. W większości nowoczesnych przeglądarek i tak nie używa potoków. Obsługuje również uwierzytelnianie systemu Windows (zwykłe, skrót).
Możesz podłączyć swoją aplikację, odwołując się do projektu, a następnie przeglądać i modyfikować cały ruch. (Wniosek i odpowiedź).
Jeśli chodzi o wydajność, przetestowałem go na moim komputerze i działa bez zauważalnego opóźnienia.
źródło
Proxy może działać w następujący sposób.
Krok 1, skonfiguruj klienta do korzystania z proxyHost: proxyPort.
Proxy to serwer TCP, który nasłuchuje na proxyHost: proxyPort. Przeglądarka otwiera połączenie z Proxy i wysyła żądanie HTTP. Proxy analizuje to żądanie i próbuje wykryć nagłówek „Host”. Ten nagłówek powie Proxy, gdzie otworzyć połączenie.
Krok 2: Proxy otwiera połączenie z adresem podanym w nagłówku „Host”. Następnie wysyła żądanie HTTP do tego zdalnego serwera. Czyta odpowiedź.
Krok 3: Po odczytaniu odpowiedzi ze zdalnego serwera HTTP, Proxy wysyła odpowiedź przez wcześniej otwarte połączenie TCP z przeglądarką.
Schematycznie będzie wyglądać następująco:
źródło
Jeśli chcesz tylko przechwycić ruch, możesz użyć rdzenia skrzypka do utworzenia serwera proxy ...
http://fiddler.wikidot.com/fiddlercore
najpierw uruchom program Fiddler z interfejsem użytkownika, aby zobaczyć, co robi, jest to proxy, które umożliwia debugowanie ruchu http / https. Jest napisany w języku C # i ma rdzeń, który można wbudować we własne aplikacje.
Należy pamiętać, że FiddlerCore nie jest darmowy do zastosowań komercyjnych.
źródło
Z OWIN i WebAPI sprawy stały się naprawdę proste. Szukając serwera C # Proxy, natknąłem się również na ten post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . To będzie droga, którą wybieram.
źródło
Zgadzam się dr evil jeśli używasz HTTPListener, będziesz miał wiele problemów, będziesz musiał analizować żądania i będziesz zaangażowany w nagłówki i ...
widzisz, że nie musisz nawet wiedzieć, co jest w żądaniu przeglądarki i analizować go, tylko pobierz adres witryny docelowej z pierwszego wiersza, pierwszy wiersz zwykle lubi to GET http://google.com HTTP1.1 lub CONNECT facebook.com: 443 (dotyczy żądań SSL)
źródło
Socks4 to bardzo prosty w implementacji protokół. Nasłuchujesz początkowego połączenia, łączysz się z hostem / portem, którego zażądał klient, wysyłasz kod sukcesu do klienta, a następnie przesyłasz dalej wychodzące i przychodzące strumienie przez gniazda.
Jeśli korzystasz z protokołu HTTP, będziesz musiał przeczytać i prawdopodobnie ustawić / usunąć niektóre nagłówki HTTP, więc to trochę więcej pracy.
Jeśli dobrze pamiętam, SSL będzie działał na serwerach proxy HTTP i Socks. W przypadku proxy HTTP zaimplementujesz czasownik CONNECT, który działa podobnie do socks4, jak opisano powyżej, a następnie klient otwiera połączenie SSL przez proxowany strumień tcp.
źródło
Przeglądarka jest połączona z serwerem proxy, więc dane, które otrzymuje proxy z serwera WWW, są po prostu wysyłane za pośrednictwem tego samego połączenia, które przeglądarka zainicjowała do serwera proxy.
źródło
Warto, oto przykładowa implementacja asynchroniczna w C # oparta na HttpListener i HttpClient (używam jej do łączenia Chrome na urządzeniach z Androidem z IIS Express, to jedyny sposób, jaki znalazłem ...).
A jeśli potrzebujesz obsługi HTTPS, nie powinno wymagać więcej kodu, wystarczy konfiguracja certyfikatu: Httplistener z obsługą HTTPS
źródło