Я скачал Privoxy несколько недель назад, и мне было любопытно узнать, как сделать простую версию.
Я понимаю, что мне нужно настроить браузер (клиент) для отправки запроса на прокси. Прокси-сервер отправляет запрос в Интернет (скажем, это http-прокси). Прокси-сервер получит ответ ... но как прокси-сервер может отправить запрос обратно в браузер (клиент)?
Я ищу в Интернете прокси C # и http, но не нашел чего-то, что позволило бы мне понять, как это работает за кулисами правильно. (Я считаю, что я не хочу обратного прокси, но я не уверен).
Есть ли у вас какие-либо объяснения или информация, которая позволит мне продолжить этот небольшой проект?
Обновить
Это то, что я понимаю (см. Рисунок ниже).
Шаг 1 Я настраиваю клиент (браузер) для отправки всех запросов на 127.0.0.1 через порт, который прослушивает Прокси. Таким образом, запрос не будет отправлен напрямую в Интернет, а будет обработан прокси.
Шаг 2 Прокси видит новое соединение, читает заголовок HTTP и видит запрос, который он должен выполнить. Он выполняет запрос.
Шаг 3 Прокси-сервер получает ответ от запроса. Теперь он должен отправить ответ из Интернета клиенту, но как ???
Полезная ссылка
Mentalis Proxy : Я нашел этот проект, который является прокси (но больше, что я хотел бы). Я мог бы проверить источник, но я действительно хотел чего-то простого, чтобы лучше понять концепцию.
ASP Proxy : Я мог бы также получить некоторую информацию здесь.
Отражатель запроса : это простой пример.
Ответы:
Вы можете создать его с помощью
HttpListener
класса для прослушивания входящих запросов иHttpWebRequest
класса для ретрансляции запросов.источник
Я бы не использовал HttpListener или что-то в этом роде, таким образом, вы столкнетесь с таким количеством проблем.
Самое главное, это будет огромная боль для поддержки:
Что вам нужно сделать, это:
Я написал 2 разных HTTP прокси в .NET с разными требованиями и могу вам сказать, что это лучший способ сделать это.
Mentalis делают это, но их код "делегат спагетти", хуже, чем GoTo :)
источник
Недавно я написал облегченный прокси в c # .net, используя TcpListener и TcpClient .
https://github.com/titanium007/Titanium-Web-Proxy
Он поддерживает безопасный HTTP правильно, клиентский компьютер должен доверять корневому сертификату, используемому прокси. Также поддерживает ретрансляцию WebSockets. Поддерживаются все функции HTTP 1.1, кроме конвейерной. В любом случае конвейерная обработка не используется большинством современных браузеров. Также поддерживает проверку подлинности Windows (обычный, дайджест).
Вы можете подключить свое приложение, ссылаясь на проект, а затем просматривать и изменять весь трафик. (Запрос и ответ).
Что касается производительности, я проверил ее на своей машине и работает без каких-либо заметных задержек.
источник
Прокси может работать следующим образом.
Шаг 1, настройте клиент для использования proxyHost: proxyPort.
Прокси-сервер - это TCP-сервер, который прослушивает proxyHost: proxyPort. Браузер открывает соединение с прокси и отправляет Http-запрос. Прокси анализирует этот запрос и пытается определить заголовок «Host». Этот заголовок скажет Прокси, где открыть соединение.
Шаг 2: Прокси открывает соединение по адресу, указанному в заголовке «Хост». Затем он отправляет HTTP-запрос на этот удаленный сервер. Читает ответ.
Шаг 3. После считывания ответа с удаленного HTTP-сервера Proxy отправляет ответ через ранее открытое TCP-соединение с браузером.
Схематически это будет выглядеть так:
источник
Если вы просто хотите перехватить трафик, вы можете использовать ядро Fiddler для создания прокси ...
http://fiddler.wikidot.com/fiddlercore
Сначала запустите fiddler с пользовательским интерфейсом, чтобы увидеть, что он делает, это прокси, который позволяет отлаживать трафик http / https. Он написан на C # и имеет ядро, которое вы можете встроить в свои собственные приложения.
Имейте в виду, FiddlerCore не является бесплатным для коммерческих приложений.
источник
Согласитесь с dr evil, если вы будете использовать HTTPListener, у вас будет много проблем, вам придется анализировать запросы, и вы будете заняты заголовками и ...
вы видите, что вам даже не нужно знать, что находится в запросе браузера, и анализировать его, только получить адрес целевого сайта из первой строки, первой строке обычно нравится GET http://google.com HTTP1.1 или CONNECT facebook.com: 443 (это для запросов ssl)
источник
С OWIN и WebAPI все стало очень просто. В моем поиске прокси-сервера C # я также наткнулся на этот пост http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Это будет дорога, по которой я иду.
источник
Socks4 - очень простой для реализации протокол. Вы прослушиваете начальное соединение, подключаетесь к хосту / порту, запрошенному клиентом, отправляете клиенту код успеха, а затем пересылаете исходящий и входящий потоки через сокеты.
Если вы используете HTTP, вам придется читать и, возможно, устанавливать / удалять некоторые заголовки HTTP, так что это немного больше работы.
Если я правильно помню, SSL будет работать через HTTP и Socks прокси. Для HTTP-прокси вы реализуете глагол CONNECT, который работает так же, как socks4, как описано выше, затем клиент открывает SSL-соединение через прокси-поток tcp.
источник
Браузер подключен к прокси, поэтому данные, которые прокси получает с веб-сервера, просто отправляются через то же соединение, которое браузер инициировал для прокси.
источник
Для этого стоит пример асинхронной реализации C # на основе HttpListener и HttpClient (я использую его для подключения Chrome на устройствах Android к IIS Express, это единственный способ, который я нашел ...).
И если вам нужна поддержка HTTPS, для этого не нужно больше кода, просто настройка сертификата: Httplistener с поддержкой HTTPS
источник