2010-03-16 16 views
2

J'utilise urllib2 pour interagir avec un site Web qui renvoie plusieurs en-têtes Set-Cookie. Cependant, le dictionnaire d'en-tête de réponse n'en contient qu'un - il semble que les clés dupliquées se chevauchent.urllib2 Plusieurs en-têtes Set-Cookie en réponse

Existe-t-il un moyen d'accéder aux en-têtes dupliqués avec urllib2?

Répondre

5

Selon urllib2 docs, l'attribut .headers de l'objet URL de résultat est un httplib.HTTPMessage (qui semble être non documenté, au moins dans les documents Python).

Cependant,

help(httplib.HTTPMessage) 
... 

If multiple header fields with the same name occur, they are combined 
according to the rules in RFC 2616 sec 4.2: 

Appending each subsequent field-value to the first, each separated 
by a comma. The order in which header fields with the same field-name 
are received is significant to the interpretation of the combined 
field value. 

Donc, si vous accédez u.headers [Cookie Set-'], vous devriez obtenir un en-tête Set-Cookie avec les valeurs séparées par des virgules.

En effet, cela semble être le cas.

import httplib 
from StringIO import StringIO 

msg = \ 
"""Set-Cookie: Foo 
Set-Cookie: Bar 
Set-Cookie: Baz 

This is the message""" 

msg = StringIO(msg) 

msg = httplib.HTTPMessage(msg) 

assert msg['Set-Cookie'] == 'Foo, Bar, Baz' 
+0

est-ce que cela fonctionne aussi quand nous faisons add_header sur la demande? –

+0

Rushabh: Non, mais pour des choses comme les cookies, il existe des bibliothèques qui gèrent les règles RFC 2616. Voir 'Lib/cookielib'. –

0

set-cookie est différent cependant. De la RFC 6265:

serveurs d'origine NE DOIVENT PAS plier plusieurs champs d'en-tête Set-Cookie dans un seul champ d'en-tête. Le mécanisme habituel de pliage des en-têtes HTTP champs (ie, comme défini dans [RFC2616]) peut changer la sémantique de le champ d'en-tête Set-Cookie car le caractère% x2C (",") est utilisé par Set-Cookie dans un manière qui est en conflit avec un tel pliage.

En théorie, cela ressemble à un bug.