Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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

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

Вопрос исходно был задан на исходниках: 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=1HTTP/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, т.о. если кому интересно будет помочь, то я могу ответить на вопросы о результатах сниффинга.


Slym   (2009-04-20 18:56:00) [1]

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


Slym   (2009-04-20 18:53:00) [2]

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


Slym   (2009-04-20 18:43:00) [3]

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

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


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

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


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

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

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

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

------

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


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

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


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

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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо