httplib2, как установить более одного куки? - PullRequest
6 голосов
/ 15 ноября 2009

Как вы, наверное, знаете, чаще всего HTTP-сервер отправляет больше, чем просто cookie-файл session_id; однако httplib2 обрабатывает файлы cookie со словарем, например:

response, content = http.request(url, 'GET', headers=headers)

headers = {'Cookie': response['set-cookie']}

url = 'http://www.example.com/home'   
response, content = http.request(url, 'GET', headers=headers)

Итак, как мне установить дополнительные куки? При работе со словарем у меня не может быть двойных ключей Cookie: S.

Спасибо за ваше время.

Ответы [ 4 ]

5 голосов
/ 15 ноября 2009

Файлы cookie содержатся в одном заголовке HTTP, разделенном точкой с запятой. Пример:

cookie1=value1;cookie2=value2

Таким образом, вам нужно будет создать строку из файлов cookie, отправленных сервером, а затем установить ее в качестве заголовка Cookie.

Редактировать : На самом деле, немного поиграв с httplib2 и перечитав ваш вопрос, я не уверен, что вам действительно нужно что-то делать, чтобы получить желаемую функциональность. Значение set-cookie, которое вы получаете от httplib2, на самом деле является необработанным заголовком Set-Cookie, отправленным с сервера; Вы можете просто вставить это в заголовок cookie нового ответа, и все будет работать нормально. Технически говоря, вы должны удалить некоторые атрибуты cookie, такие как expiry, но я думаю, что большинство серверов справятся с этим просто отлично.

3 голосов
/ 15 ноября 2009

Да, я только что узнал в другом месте о заголовке Cookie, когда выполнял запрос, но сервер может отправить несколько заголовков Set-Cookie, с файлом cookie (и атрибутами срока действия, домена и т. Д.) На заголовок. Но с помощью системы словарей, используемой в httplib2, я не могу получить все возможные заголовки Set-Cookie, отправленные сервером, но, по-видимому, только последний.

Итак, есть еще идеи:)?

2 голосов
/ 15 ноября 2009

Проводя дополнительное тестирование на фиктивной PHP-странице setcookie (), я сгенерировал в 3 тестах следующий набор заголовков:

Set-Cookie: chocolate=chips
Set-Cookie: milk=shape


Set-Cookie: chocolate=chips; expires=Sun, 15-Nov-2009 18:47:08 GMT; path=/; domain=thaorius.net; secure; httponly
Set-Cookie: milk=shape


Set-Cookie: chocolate=chips; expires=Sun, 15-Nov-2009 18:46:25 GMT
Set-Cookie: milk=shape

Выходные данные, фактически предоставляемые httplib2 для ключа set-cookie массива, соответственно для каждой пары заголовков:

chocolate=chips, milk=shape

chocolate=chips; expires=Sun, 15-Nov-2009 18:31:00 GMT; path=/; domain=thaorius.net; secure; httponly, milk=shape

chocolate=chips; expires=Sun, 15-Nov-2009 18:38:21 GMT, milk=shape

Похоже, что httplib2 правильно решает проблему, но теперь у меня возникла другая проблема. «,» В атрибуте expires. Как видите, файлы cookie разделяются запятой, но как отличить ее от атрибута expires.

Я мог бы разбить строку на запятые, а затем на «;» и получить пары ключей и значений для каждого файла cookie, просто и удобно; но с запятой в истекает, я не могу этого сделать.

Итак, я думаю, я мог бы использовать регулярное выражение, которое в основном ищет «expires = letters, num & letters nums: nums: nums произвольных символов [, |; | $]» и заменяет его чем-то вроде expires = STUB, так как меня не особо волнует срок годности печенья.

Итак, кто-нибудь будет так любезен, дайте мне регулярное выражение, которое я могу передать re.sub ()? До сих пор я не нуждался в регулярных выражениях, поэтому я их не выучил, и я действительно не хочу терять несколько дней на один:).

0 голосов
/ 21 мая 2010

Попробуйте это:

pp = re.compile('(Sun|Mon|Tue|Wed|Thu|Fri|Sat),')
pp.sub('','alpha Sun, beta')
'alpha  beta'
...