Аутентификация дайджеста клиента Python с URLLIB2 не запоминает информацию заголовка авторизации - PullRequest
1 голос
/ 10 ноября 2009

Я пытаюсь использовать Python для написания клиента, который подключается к пользовательскому http-серверу, использующему дайджест-проверку подлинности. Я могу подключиться и вытащить первый запрос без проблем. Используя TCPDUMP (я нахожусь на MAC OS X - я и MAC, и нуб Python), я вижу, что первый запрос - это фактически два http-запроса, как и следовало ожидать, если вы знакомы с RFC2617. Первые результаты в 401 НЕСАНКЦИОНИРОВАНЫ. Информация заголовка, отправленная обратно с сервера, правильно используется для генерации заголовков для второго запроса с некоторыми настраиваемыми значениями заголовка авторизации, что дает ответ 200 OK и полезную нагрузку.

Все отлично. Мой механизм открытия HTTPDigestAuthHandler работает благодаря urllib2.

В той же программе я пытаюсь запросить вторую, другую страницу с того же сервера. Согласно RFC, я ожидаю, что на этот раз TCPDUMP покажет только один запрос, используя почти все ту же информацию заголовка авторизации (nc должен увеличиваться).

Вместо этого он начинается с нуля, сначала получает 401 и восстанавливает информацию, необходимую для 200.

Возможно ли при использовании urllib2 последующие запросы с дайджест-проверкой подлинности перезаписывать известные значения заголовка авторизации и выполнять только один запрос?

[Перечитайте это пару раз, пока это не станет понятным, я не уверен, как сделать это более понятным]

Google дал удивительно мало, так что я думаю, что нет. Я посмотрел на код для urllib2.py и его очень грязный (комментарии вроде: «Это не невероятное усилие»), поэтому я не был бы шокирован, если бы это было ошибкой. Я заметил, что мой заголовок подключения закрыт, и даже если я установил для него keepalive, он перезаписывается. Это привело меня к keepalive.py, но у меня это тоже не сработало.

Пикурл тоже не будет работать.

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

Таким образом, возможно ли с помощью urllib2 и дайджест-аутентификации получить 2 страницы с одного и того же сервера, выполнив только 3 http-запроса (2 для первой страницы, 1 для второй).

Если вы уже пробовали это раньше и уже знаете, что это невозможно, пожалуйста, дайте мне знать. Если у вас есть альтернатива, я весь в ушах.

Заранее спасибо.

1 Ответ

1 голос
/ 11 ноября 2009

Хотя он не доступен из коробки, urllib2 достаточно гибок, чтобы добавить его самостоятельно. Подкласс HTTPDigestAuthHandler, взломайте его (я думаю, retry_http_digest_auth метод), чтобы запомнить информацию об аутентификации и определить метод http_request(self, request), чтобы использовать ее для всех последующих запросов (добавьте заголовок WWW-Authenticate).

...