LINUX.ORG.RU

Минимальный самописный прокси на java

 ,


1

2

Пишу минимальный http прокси на java.
Опыта разработки сетевых приложений нет, ну и с java знакомство не долгое. Погуглил, кое-что написал, работает криво.
Принцип работы: сервер слушает порт. Читает http заголовок входящего запроса и достает от туда адрес удаленного сервера (метод getRawHeader). Создает два потока, в которых связывает удаленный сервер с инициирующим приложением (класс Connection).
Кто может помогите, пожалуйста, разобраться что не так. Репозиторий на github.
Глюки:
1. Вместо некоторых урлов открываются урлы открытые до этого
2. На некоторых урлах возникает ошибка «403 Forbidden»
3. На youtube видео проигрывается несколько секунд


Код не запускал, мельком посмотрел.

1. Не делай str.equals(""), а делай str.isEmpty()
2. Всегда закрывай все ресурсы в finally блоке! Много где у тебя они вообще не закрываются, а много где закрываются, но не в finally
3. private int mNumber; - это, судя по всему, какой-то счетчик. Он не синхронизован.
4. Не наследуй от Thread, а реализуй интерфейс Runnable!
5. Используй System.getProperty(«line.separator»);
6. indexOf(char) быстрее чем indexOf(String)

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

1. Переделал. 2. Да вроде все ресурсы закрываю. Закрытие сокетов, закрывает и их стримы, а других ресурсов нету. 3. Это счетчик номера соединения, он постоянный для каждого экземпляра Connection. 4. Сделал. 5. В хттп строки заканчиваются на CRLF. 6. Тоже сделал.

Спасибо, конечно за ответ, только это не сильно помогло.

di
() автор топика
Ответ на: комментарий от di

В коде java я ничего не смыслю.
Я написал простой прокси на СИ. Столкнулся с вот с какой неприятностью.
Если браузер включен на работу с прокси, то первая строка идет такая:
GET http://asdf.ru/abc.htm HTTP/1.1
Почему-то многие серверы не принимают такой запрос. Я преобразовал строку так:
GET /abc.htm HTTP/1.1
Стало работать хорошо.

oleg_2
()
Ответ на: комментарий от oleg_2

GET http://asdf.ru/abc.htm HTTP/1.1
Почему-то многие серверы не принимают такой запрос. Я преобразовал строку так:
GET /abc.htm HTTP/1.1
Стало работать хорошо.

Вроде как HTTP протокол не позволяет указывать протокол и домен в строке GET (для домена нужен отдельный заголовок Host: - так что я бы ещё убедился, что браузеры не отсылают в нём адрес прокси-сервера вместо адреса сайта). А в случае использования прокси заголовок с доменом передаётся, чтобы сам прокси-сервер знал, куда отправлять запрос.

Кстати, можешь скинуть пример сервера, принимающего запрос вида «GET http://asdf.ru/abc.htm HTTP/1.1»?

pv4 ★★
()
Ответ на: комментарий от pv4

Браузер дает на прокси подходящий запрос, с полем Хост, с куками, с реферем и
др. Первая строка с доменом, да, чтоб прокси знал, куда отправить запрос.
Номер порта в поле Хост не обязан быть.

ТС написал, что сбой видеоролика, значит запрос принят, значит есть и другая причина.
Но первую строку всё равно нужно очищать. Я так понял, что он весь заголовок в
исходном виде дает.

Такой запрос, состоящий из одной-единственной строки, принимают многие серверы:
GET http://www.yandex.ru/ HTTP/1.0
А такой запрос, состоящий из одной-единственной строки, принимает единственный сервер:
GET http://89.108.108.125:8282/client_ftp_public_1.txt HTTP/1.1
Это мой самодельный, видимо, отклонение от нормы.

Вот, например, эти берут с доменом, но поле «Host:» тоже должно быть.
http://www.kp.ru
http://www.yandex.ru
HTML страницы нормально. А к ним, особенно к kp.ru, идет масса запросов рисунков
и прочего, и на разные серверы. Получаются некоторые окна пустыми.

oleg_2
()
Ответ на: комментарий от kovrik

Не делай str.equals(""), а делай str.isEmpty()

желание смотреть отпало...

fornlr ★★★★★
()
Ответ на: комментарий от oleg_2

Я там переписал немного, и наверно перестарался. Сейчас работает так: принимает соединение с одного-двух табов, дальше видимо я не освобождаю сокеты или еще какие ресурсы, и новые запросы идут в первое соединение.

di
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.