И вот, сегодня, прокси готов. Написал я его на Java, как консольное приложение.
Почему на Java? Потому что kalyaka java-программист, и в случае чего, всегда сможет поправить мои кривые руки.
Почему консольное? Потому что… потому что так во-первых проще, во-вторых его можно будет поюзать под Линухом без GUI, ну и на мой взгляд консоль — это все таки более универсальный интерфейс, доступный практически всегда.
Ну и чего же может этот прокси?
А может он… да ничего особенного он и не может.
Некоторые возможности:
- Многопоточность
- Поддержка GET и POST запросов
- Перенаправление запросов на указанный адрес
- Мегапримитивный шаблон запросов
И так. По порядку.
Многопоточность
На каждый запрос создается отдельный поток. Ограничений на количество потоков нет.
ServerSocket s = new ServerSocket(reqTemplate.listenPort);<br>Socket clientSocket = null;<br>while(true) {<br> clientSocket = s.accept();<br> SocketWorker worker = new SocketWorker(clientSocket);<br> Thread t = new Thread(worker);<br> t.start();<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Поддержка GET и POST запросов
Ну собственно, виды запросов могут быть и другими, HEAD например… но гарантируется только GET и POST. Другие не проверял.
Перенаправление запросов на указанный адрес
Это производится путем настройки шаблона, о котором речь пойдет ниже.
Мегапримитивный шаблон запросов
Пример шаблона:
LISTEN: 8080
SENDTO: anonymouse.org/cgi-bin/anon-www.cgi{address}
REQUEST:
{method} {d_relativeAddress} {protocol}
{headers}
{data}
Итак, что тут есть.
LISTEN: это не часть шаблона, а настройка для прокси. Указывает порт, на котором нужно установить прокси.
SENDTO: указывает Url, на который будет перенаправляться запрос. Как видите, в конце есть {address}. Это одна из переменных, которые могут использоваться в этом блоке.
Набор переменных:
{address} — полный адрес, на который браузер пытается послать запрос.
{relativeAddress} — относительная часть адреса.
{host} — собственно, хост.
{port} — порт.
{method} — метод запроса (GET, POST, HEAD, OPTIONS и т.д.)
{protocol} — http-протокол (HTTP/1.0, HTTP/1.1 и т.д.)
REQUEST: это собственно сам шаблон запроса. Сейчас в REQUEST находится запрос по умолчанию, т.е. запрос будет таким, каким его отослал браузер. Если захотим, например, добавить дополнительный хедер, то просто дописываем его после {headers}.
Тут снова видим что появились дополнительные переменные. Итак, что можно использовать дополнительно в REQUEST:
{d_address} — полный адрес, на который мы, а не браузер пытаемся послать запрос. (d — destination)
{d_relativeAddress} — относительная часть этого адреса.
{d_host} — собственно, хост-часть адреса.
{d_port} — ну и порт.
Для Посмотреть:
Тут исходники для NetBeans.
Тут сам jar-файл.
_________
Текст подготовлен в ХабраРедакторе