Прокси-сервер Java HTTP

Мне нужно реализовать приложение HTTP-прокси-сервера, которое будет запрашивать прокси-запросы от нескольких клиентов на удаленном сервере.

Вот шаги:

  • Запрос клиента на прокси-сервер
  • Запрос прокси-сервера на сервер
  • Сервер возвращает запрос на прокси
  • Прокси возвращает запрос клиенту.

Я просто не уверен, как мне реализовать этот прокси. Моя первая мысль заключалась в том, чтобы реализовать приложение tomcat, которое использует jersey/apache httpclient для перенаправления запроса на удаленный сервер и возврата ответа клиенту?

Есть ли лучший способ реализовать такой прокси-сервер?

Прокси-серверу потребуется обработать несколько потоков.

Ответ 1

Вы не можете реализовать его как сервлет, и нет причин использовать какую-либо форму HTTP-клиента.

Безликий прокси-сервер - это очень простая вещь:

  • Примите соединение и запустите для него поток.
  • Прочитайте запрос от клиента до пустой строки.
  • Извлеките команду GET или CONNECT или что-то еще, и подключитесь к указанному узлу.
  • Если это не удается, отправьте ответ на соответствующий HTTP-запрос, закройте сокет и забудьте о нем.
  • В противном случае запустите два потока для копирования байтов, по одному в каждом направлении. Ничего необычного, просто

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    
  • Когда один из этих сокетов читает EOS, выключите другой сокет для вывода и выйдите из потока, который получил EOS.
  • Если сокет, который был источником EOS, уже выключен для вывода, закройте их оба.

Или используйте SQUID для Apache.

Ответ 2

Отъезд LittleProxy - он имеет встроенные классы для входящих и исходящих запросов; вы можете просто написать свой код аналогично тому, как вы будете обрабатывать HTTP-запрос в сервлете.