Search
Write a publication
Pull to refresh

Как написать простенький локальный прокси на Java для текущих нужд

Хабрапользователь kalyaka попросил сделать небольшой корпоративный прокси.
И вот, сегодня, прокси готов. Написал я его на 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-файл.
_________
Текст подготовлен в ХабраРедакторе

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.