![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заголовок 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?