Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.17;
Скачать: CL | DM;

Вниз

Заголовок Proxy-Connection при использовании библиотеки WinINet   Найти похожие ветки 

 
Тимохов ©   (2009-03-15 11:04) [0]

Здравствуйте!

Вопрос исходно был задан на исходниках: http://forum.sources.ru/index.php?showtopic=267260 Если интересен ответ, то можно мониторить там.

------------

Ситуация
Я разрабатываю на Delphi приложение, которое должно обращаться на мой же сервер (на PHP).

Я сейчас тестирую свое приложение в части работы с прокси-серверами. У меня MS ISA Server.

На методику работы с прокси серверами оказывает влияние второй параметр функции InternetOpen.
Он может иметь следующие значения:
   * INTERNET_OPEN_TYPE_DIRECT
   * INTERNET_OPEN_TYPE_PROXY
   * INTERNET_OPEN_TYPE_PRECONFIG

С первым и третьим значением я разобрался. Интересует тонкости работы со вторым значением.

Важной задачей является - создание транспорта максимально простого для конечного пользователя.
По возможности он вообще не должен касаться настройки. Поэтому умолчательным значением поведения прокси будет INTERNET_OPEN_TYPE_PRECONFIG.
Однако для НЕ пользующих Internet Explorer нужно разработать возможность работы посредством явного указания прокси прямо в моей программе.

Проблемы
Проблема заключается в том, что если я не добавляю в заголовок своего запроса (он POST, кстати) Proxy-Connection: Keep-Alive, то HttpSendRequest подвисает и отвисает только по таймауту, т.е. по ошибке 12002 = ERROR_INTERNET_TIMEOUT.

Что сам понял
Я использовал WireShark.
Когда у меня все работало (т.е. когда был заголовок Proxy-Connection: Keep-Alive), то общение с прокси выглядело так:
   * Запрос клиента.
   * Ответ прокси-сервера со статусом 407.
   * Запрос клиента с затребованными данными (детали не знаю, но думаю, что это авторизация).
   * Ответ прокси-сервера.
   * Запрос клиента. Его прокси-сервер без проблем пропускает.
   * Ответ сервера.

Если заголовок Proxy-Connection: Keep-Alive убрать, то все ограничивается только первыми двумя строками - т.е. прокси-сервер отвечает кодом 407. И все... Т.е. примерно так:
   * Запрос HTTP POST http://www.tratratra.ru/query.php?param=1 HTTP/1.0 (application/x-www-form-urlencoded)
   * Ответ HTTP HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied.) (text/html)

Вопросы
   * Вопрос состоит в том - какова роль Proxy-Connection: Keep-Alive?
   * Правильно ли описанное поведение? Почему WinINet (судя по снифферу) прерывает общение?

PS. Я немного знаю WireShark, т.о. если кому интересно будет помочь, то я могу ответить на вопросы о результатах сниффинга.


 
Тимохов ©   (2009-03-21 00:08) [1]

Вот, многие сетуют на плохое качество вопросов.
Что вопрос плохой? Плохо оформлен? Сложный?

--------
Поправка к вопросу. Версия HTTP у меня все же 1.0. Умолчательное поведение заголовка Connection (но это же не Proxy-Connection!!!) для 1.0 прописано как close.

Однако это не меняет вопроса (перефразирую, впрочем, его) - кто виноват, что подвисает соединение по WinINet с использованием проксей при отсутствии в запросе заголовка proxy-connection в http версии 1.0?


 
Rouse_ ©   (2009-03-21 00:31) [2]

Дим, ну я-же тебе 2 раза обьяснял логоку поведения в случае отсутствия Keep-Alive.  
Я как-то не правильно обьясняю чтоль? :)


 
Тимохов ©   (2009-03-21 00:43) [3]

А ты еще раз объясни, пожалуйста. Использовав при этом не меньше 12 строк текста.

Только объясни, пожалуйста, на примере именно proxy-connection.
Особый упор, прошу сделать на спецификация указанного заголовка.  

Это же всем полезно будет.

------

Буду благодарен за вариант, при котором ты, будучи гуру, научить разобраться самому. Спеки, мне не помогают. А вот научиться пользоваться каким-то фришным сниффером - это очень полезно. Например, Wireshark (ранее - Ethereal, именно его ты мне и советовал года 2-3 назад).


 
Rouse_ ©   (2009-03-22 13:57) [4]

Keep-Alive обеспечивает открытый сеанс связи в течении времени, которое выставленно на сервере в параметре Keep-Alive Time. Если соединение устанавливается без этого параметра, то сеанс выглядит как
открытие соединения, вопрос, ответ, закрытие соединения (хотя все зависит от конкретного сервера конечно-же).
Если данный флаг указан в заголовках пакета то у обоих сокетов (клиенствкого и серверного) автоматически выставляется этот режим через setsockopt(), уровень SOL_SOCKET, параметр SO_KEEPALIVE


 
Slym ©   (2009-04-20 18:43) [5]

HTTP/1.0 - нету киплайвов: конект - запрос - ответ - дисконект...
но при этом ответ HTTP/1.1...
из этого предположу что соласно HTTP/1.0 ждет дисконект, а сервер получил пожелание кипалива и не обращая внимания на версию отвечает HTTP/1.1 и держит конекшен нарушая HTTP/1.0

попробуй отправить в HTTP/1.1


 
Slym ©   (2009-04-20 18:53) [6]

возможно параметр IE: галка использовать 1.1 через прокси


 
Slym ©   (2009-04-20 18:56) [7]

перечитал ветку - Я ошибся идей нету :)



Страницы: 1 вся ветка

Текущий архив: 2011.07.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1301925043
young_dev
2011-04-04 17:50
2011.07.17
SVN vs. GIT


1-1260213430
Leto
2009-12-07 22:17
2011.07.17
Странно работает thintwindow


15-1301659966
clickmaker
2011-04-01 16:12
2011.07.17
В Гугле открылась отличная вакансия


2-1302510695
MAX
2011-04-11 12:31
2011.07.17
изменить структуру dbf


15-1301662418
Baks
2011-04-01 16:53
2011.07.17
Как лучше записать несколько TBitmap в один файл