LINUX.ORG.RU

простой http proxy сервер


0

0

Потребовалось написать простой http proxy сервер. Написал на Си. Процесс биндит порт и ждет соединения. Получив говорит fork и ребенком: обслуживает запрос, закрывает соединение, завершает работу; родитель прододлжает ждать следубщего соединения. Проблемы: - соединение не закрывается - ребенок превращается в зомби - если от сервера приходит http/1.1 302 броузер не переадресуется

anonymous

от убожество! когда-то юникс через форк работал, но то было лет 15 назад (может больше)

потом придумали серверы с постановкой запросов в очередь

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

Расскажите это разработчикам апача А меня интересуют ответы на мои вопросы, почему в ребенке не закрывается соединение открытое родителем и как правильно прокси должен обслуживать http/1.1 302 и ему подобные.

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

нет не закрывает я думал сокет один на двоих и если родительего закроет ребенку ничего не останется

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

> я думал сокет один на двоих

Я неправильно выразился :) Не сам сокет, а "accepted socket" или как он там. Короче, дескриптор, который accept возвращает.

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

это решило одну проблему - соединение теперь не остается открытым. Но ребенок все равно становится зомби. Проблема с 302 не снялась Также обнаружил еще проблему (не сязана с испралением) - некоторые сайты возвращяют 404 (например яндекс) хотя без прокси открываются нормально

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

> ребенок все равно становится зомби.

А ты его wait? Зомби - это когда процесс завершился, а родитель не прочитал его статус.

> Проблема с 302 не снялась

Покажи заголовки ответа, который отсылается браузеру.

> некоторые сайты возвращяют 404

Покажи запрос браузера и соответствующий запрос прокси.

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

>А ты его wait? Зомби - это когда процесс завершился, а родитель не прочитал его статус. Как это wait? Зачем тогда ребенка запускать если родитель будет ждать его завершения?

>> Проблема с 302 не снялась >Покажи заголовки ответа, который отсылается браузеру. HTTP/1.0 302 Found Cache-Control: private Location: http://tv.gameclubsite.com/ Content-Type: text/html Server: GWS/2.1 Content-Length: 157 Date: Fri, 08 Apr 2005 11:00:44 GMT Cneonction: Close Connection: Keep-Alive

>> некоторые сайты возвращяют 404 >Покажи запрос браузера и соответствующий запрос прокси. GET http://www.yandex.ru/ HTTP/1.0 Accept: */* Accept-Language: ru,en-us;q=0.5 Proxy-Connection: Keep-Alive If-Modified-Since: Fri, 08 Apr 2005 06:29:48 GMT; length=21050 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) Host: www.yandex.ru Pragma: no-cache

Прокси ничего не меняет (поскольку я не знаю что она должна менять)

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

>Как это wait? Зачем тогда ребенка запускать если родитель будет ждать его завершения?

Самый очевидный ответ - детей м.б. несколько.

Если тебе не хочется ждать, установи реакцию SIG_IGN на SIGCHLD.

Тут в соседнем thread была ссылка http://www.advancedlinuxprogramming.com/ Так наверняка про это есть более подробно.

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

В заголовке запроса на проксю пишется http://www.domain.com/ HTTP/1.1

Прокся при отправке должна отодрать www.domain.com и сделать так:

GET / HTTP/1.0
Host: www.domain.com

Если хочешь, давай мыло - вышлю рабочую легковесную проксю (самописную, обрезок от одного из закрытых проектов :-)) - честно работает и собирается на FreeBSD и Linux :-)

no-dashi ★★★★★
()
Ответ на: комментарий от anonymous

>> Проблема с 302 не снялась

Вроде, всё нормально. Контент в количестве 157 байт браузеру нормально
отправляется?

Cneonction: Close
Connection: Keep-Alive

Это оно так и есть? Что за Cneonction? Или это опечатка и было
Connection? Тогда почему их 2?

> Прокси ничего не меняет (поскольку я не знаю что она должна менять)

См. RFC2616. Там всё написано.

GET http://www.yandex.ru/ HTTP/1.0
Host: www.yandex.ru

Должно быть:

GET / HTTP/1.0
Host: www.yandex.ru

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