2009-11-15 19 views
6

Como probablemente sepa, la mayoría de las veces, un servidor HTTP enviará más que solo una cookie session_id; Sin embargo, httplib2 maneja las galletas con un diccionario, así:httplib2, ¿cómo configurar más de una 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) 

Entonces, ¿cómo puedo configurar las galletas adicionales? Si se maneja con un diccionario, no puedo tener dobles claves de Cookie: S.

Gracias por su tiempo.

+1

Recomiendo leer el RFC http: http://www.w3.org/Protocols/rfc2616/rfc2616.html y el RFC cookie: http: //www.faqs. org/rfcs/rfc2109.html. Puede que no piense que debe llegar a todos esos documentos por el bien de esta pequeña tarea, pero en realidad, dado que obviamente está haciendo algún tipo de programación de red, debe comprender estos conceptos importantes. –

+0

Seguramente los leeré en unos días cuando tenga más tiempo, marqué los enlaces. Gracias. – user168833

Respuesta

5

Las cookies están contenidas en un solo encabezado HTTP, separados por punto y coma. Ejemplo:

cookie1=value1;cookie2=value2 

por lo que tendrá que construir una cadena a partir de las cookies enviadas por el servidor, y después fije ésta como la cabecera Cookie.

Editar: En realidad, jugando un poco con httplib2 y volviendo a leer su pregunta, no estoy seguro de que tenga que hacer algo para obtener la funcionalidad que desea. El valor set-cookie que obtiene de httplib2 es en realidad el encabezado Set-Cookie sin formato enviado desde el servidor; puede ponerlo en el encabezado cookie de la nueva respuesta, y todo funcionará bien. Técnicamente hablando, debe eliminar algunos de los atributos de cookies, como expiry, pero me imagino que la mayoría de los servidores se encargarán de eso.

3

Sí, acabo de enterarme en otro lugar sobre el encabezado Cookie al realizar la solicitud, pero el servidor puede enviar varios encabezados Set-Cookie, con atributos de cookie (y caducidad, dominio, etc.) por encabezado. Pero con el sistema de diccionario utilizado en httplib2, realmente no puedo obtener todos los posibles encabezados de Set-Cookie enviados por el servidor, pero al parecer, solo el último.

Entonces, ¿alguna otra idea :)?

2

Haciendo un poco de pruebas adicionales, con una página PHP setcookie ficticia(), me genera en 3 pruebas, el siguiente conjunto de cabeceras:

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 

La salida realidad suministrada por httplib2 en la tecla de setcookie la matriz, es, respectivamente, para cada par de cabecera, esto:

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 

lo que parece que httplib2 Cómo trata el problema correctamente, pero ahora me presentan con otro problema. El "," en el atributo expira. Como puede ver, las cookies se separan mediante una coma, pero cómo distinguirlas de la del atributo expira.

Pude dividir la cadena por comas, y luego por ";", y terminé con pares de valores clave para cada cookie, agradable y fácil; pero con la coma expira, no puedo hacer eso.

Así que, estoy pensando, podría usar una expresión regular que básicamente busque "expires = letters, num & letters nums: nums: nums arbitrarychars [, |; | $]" y lo reemplaza por algo como expira = STUB, ya que realmente no me importa el tiempo de caducidad de las cookies.

Entonces, ¿alguien sería tan amable de darme la expresión regular que puedo alimentar a re.sub()? Realmente no he necesitado expresiones regulares hasta ahora, así que no las aprendí, y realmente no quiero perder unos días por una sola :).

-2

Prueba esto:

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