Как создать простой прокси на C #?
Вопрос
Я скачал Privoxy несколько недель назад, и ради развлечения мне было любопытно узнать, как можно сделать простую версию этого приложения.
Я понимаю, что мне нужно настроить браузер (клиент) для отправки запроса на прокси.Прокси-сервер отправляет запрос в Интернет (допустим, это http-прокси).Прокси-сервер получит ответ...но как прокси-сервер может отправить запрос обратно браузеру (клиенту)?
Я провел поиск в Интернете по C # и http-прокси, но не нашел ничего, что позволило бы мне понять, как это правильно работает за сценой.(Я полагаю, что мне не нужен обратный прокси, но я не уверен).
Есть ли у кого-нибудь из вас какое-нибудь объяснение или информация, которая позволит мне продолжить этот небольшой проект?
Обновить
Это то, что я понимаю (см. Рисунок ниже).
Шаг 1 Я настраиваю клиент (браузер) так, чтобы все запросы отправлялись на 127.0.0.1 через порт, который прослушивает прокси.Таким образом, запрос не будет отправлен в Интернет напрямую, а будет обработан прокси-сервером.
Шаг 2 Прокси-сервер видит новое соединение, читает HTTP-заголовок и видит запрос, который он должен выполнить.Он выполняет просьбу.
Шаг 3 Прокси-сервер получает ответ на запрос.Теперь он должен отправить ответ из Интернета клиенту, но как???
Полезная ссылка
Прокси - сервер Mentalis :Я нашел этот проект, который является прокси-сервером (но больше того, что я хотел бы).Я мог бы проверить источник, но мне действительно хотелось чего-то базового, чтобы лучше понять концепцию.
Прокси - сервер ASP :Возможно, я и здесь смогу получить кое-какую информацию.
Запросите отражатель :Это простой пример.
Вот такой Репозиторий Git Hub с простым Http-прокси.
Решение
Вы можете создать его с помощью HttpListener
класс для прослушивания входящих запросов и < code> HttpWebRequest класс для ретрансляции запросов.
Другие советы
Я бы не стал использовать HttpListener или что-то в этом роде, таким образом, вы столкнетесь с таким количеством проблем.
Самое главное, что поддерживать его будет огромной болью:
- Сохранение прокси-сервера-Alives
- SSL не будет работать (при правильном использовании вы будете получать всплывающие окна)
- Библиотеки .NET строго следуют RFC, что приводит к сбою некоторых запросов (хотя IE, FF и любой другой браузер в мире будут работать).
Что вам нужно сделать, это:
- Прослушивание TCP-порта
- Проанализируйте запрос браузера
- Извлеките хост, подключитесь к этому хосту на уровне TCP
- Пересылайте все вперед и назад, если вы не хотите добавлять пользовательские заголовки и т.д.
Я написал 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-запрос. Прокси-сервер анализирует этот запрос и пытается обнаружить " хост " заголовок. Этот заголовок скажет Прокси, где открыть соединение. Р>
Шаг 2. Прокси-сервер открывает соединение с адресом, указанным в " Хосте " заголовок. Затем он отправляет HTTP-запрос на этот удаленный сервер. Читает ответ.
Шаг 3. После считывания ответа с удаленного HTTP-сервера Прокси-сервер отправляет ответ через ранее открытое TCP-соединение с браузером.
Схематически это будет выглядеть так:
Browser Proxy HTTP server
Open TCP connection
Send HTTP request ----------->
Read HTTP header
detect Host header
Send request to HTTP ----------->
Server
<-----------
Read response and send
<----------- it back to the browser
Render content
Если вы просто хотите перехватить трафик, вы могли бы использовать ядро fiddler core для создания прокси-сервера...
http://fiddler.wikidot.com/fiddlercore
сначала запустите fiddler с пользовательским интерфейсом, чтобы посмотреть, что он делает, это прокси, который позволяет вам отлаживать трафик http / https.Он написан на c # и имеет ядро, которое вы можете встроить в свои собственные приложения.
Имейте в виду, что FiddlerCore не является бесплатным для коммерческих приложений.
С OWIN и WebAPI все стало очень просто. В моем поиске прокси-сервера C # я также наткнулся на этот пост http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Это будет дорога, по которой я иду.
Согласись с доктором злом если вы используете HTTPListener, у вас будет много проблем, вам придется анализировать запросы, и вы будете заняты заголовками и ...
<Ол>вы видите, что вам даже не нужно знать, что находится в запросе браузера, и анализировать его, только получить адрес целевого сайта из первой строки первая строка обычно любит это ПОЛУЧИТЕ http://google.com HTTP1.1 или же ПОДКЛЮЧИТЕ facebook.com:443 (это для запросов ssl)
Socks4 - очень простой для реализации протокол. Вы прослушиваете начальное соединение, подключаетесь к хосту / порту, запрошенному клиентом, отправляете клиенту код успеха, а затем пересылаете исходящий и входящий потоки через сокеты.
Если вы используете HTTP, вам придется прочитать и, возможно, установить / удалить некоторые заголовки HTTP, так что это немного больше работы.
Если я правильно помню, SSL будет работать через HTTP и Socks прокси. Для HTTP-прокси вы реализуете глагол CONNECT, который работает так же, как socks4, как описано выше, затем клиент открывает SSL-соединение через прокси-поток tcp.
Браузер подключен к прокси, поэтому данные, которые прокси получает с веб-сервера, просто отправляются через то же соединение, которое браузер инициировал для прокси.