Curl não reconhece o valor da validade no cookie corretamente
Estou tentando realizar um log-in no pinterest.com com curl. Eu tenho o seguinte fluxo de solicitação-resposta:
GET - Solicite o formulário de login e copie os campos ocultos (csrftoken)POST-Request credenciais de login (mail e pw) e csrftoken raspadoReceber Cookie de Sessão para loginUsando o Curl, posso ver os seguintes cabeçalhos sendo enviados e recebidos:
<code> GET /login/?next=%2F HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Host: pinterest.com Referer: Accept: text/html,application/xhtml+xml,application/xml,*/* Accept-Language: de-de,en-us Connection: keep-alive HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Date: Tue, 10 Apr 2012 15:03:24 GMT ETag: "45d6a85f0ede46f13f4fc751842ce5b7" Server: nginx/0.8.54 Set-Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612; Max-Age=31449600; Path=/ Set-Cookie: _pinterest_sess="eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg=="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:03:24 GMT; Max-Age=1334675004; Path=/ Vary: Cookie, Accept-Encoding Content-Length: 4496 Connection: keep-alive </code>
Portanto, após a etapa 1, os dois cookies csrftoken e _pinterest_sess são definidos. Mas uma olhada no arquivo cookiejar (eu uso CURLOPT_COOKIEFILE e CURLOPT_COOKIEJAR para deixar curl manipular o processamento do cookie) mostra o seguinte:
<code> # Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This file was generated by libcurl! Edit at your own risk. pinterest.com FALSE / FALSE 1365519805 csrftoken dec6cb66064f318790c6d51e3f3a9612 #HttpOnly_.pinterest.com TRUE / FALSE -1626222087 _pinterest_sess "eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg==" </code>
A primeira coisa a notar é o #HttpOnly_ antes da linha de cookie _pinterest_sess. Eu apenas suponho que curl lida com isso muito bem. Mas, olhando mais adiante, pode-se ver que um valor negativo é definido como data de vencimento: -1626222087
Eu não sei de onde isso está vindo, porque o cookie é definido com "expires = ter, 17-abr-2012 15:03:24 GMT" (que é cerca de 7 dias no futuro, contando a partir de hoje).
Na próxima solicitação, o cookie _pinterest_sess não será definido por curl:
<code> POST /login/?next=%2F HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Host: pinterest.com Referer: https://pinterest.com/login/?next=%2F Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612 Accept: text/html,application/xhtml+xml,application/xml,*/* Accept-Language: de-de,en-us Connection: keep-alive Content-Length: 123 Content-Type: application/x-www-form-urlencoded HTTP/1.1 302 FOUND Content-Type: text/html; charset=utf-8 Date: Tue, 10 Apr 2012 15:05:26 GMT ETag: "d41d8cd98f00b204e9800998ecf8427e" Location: http://pinterest.com/ Server: nginx/0.8.54 Set-Cookie: _pinterest_sess="eJzLcssPCy4NTclIjvAOrjQzyywoCChISgvLDi+2tY9PrSjILEottvUN8a3yc4k09gtxrfRLt7VVK04tLs5MAYonV/qGeFb4ZkWW+4LES4tTi+KBEv4u6UZ+WYEmvlm+QOxZ6R/iWOEbEmgLAKNfJps="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:05:26 GMT; Max-Age=1334675126; Path=/ Vary: Cookie Content-Length: 0 Connection: keep-alive </code>
Na resposta, outro cookie _pinterest_sess é definido, já que o curl não enviou o último.
Atualmente, não sei se estou fazendo algo errado ou se o curl não consegue analisar corretamente o valor de expiração no cookie.
Qualquer ajuda seria muito apreciada :)
// edite Mais uma coisa: De acordo comhttp://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c a função curl_getdate () é usada para extrair a data. A documentação sobre essa função lista alguns exemplos (http://curl.haxx.se/libcurl/c/curl_getdate.html):
Dom, 06 nov 1994 08:49:37 GMTDomingo, 06 de novembro de 1994: 08:49:37 GMTDom Nov 6 08:49:37 199406 de novembro de 1994 08:49:37 GMT06-nov-94 08:49:37 GMT6 de novembro 08:49:37 199406 de novembro de 1994 08:49:3706-nov-94 08:49:371994 6 de novembro 08:49:37 GMT08:49:37 06-nov-94Domingo 94 6 de novembro 08:49:376 de novembro de 199406 de novembro de 94Dom 6 nov 941994.Nov.6Dom / nov / 6/94 / GMTDom, 06 nov 1994 08:49:37 CET06 de novembro de 1994 08:49:37 ESTDom, 12 set 2004 15:05:58 -0700Sáb, 11 de setembro de 2004 21:32:11 +020020040912 15:05:58 -070020040911 +0200Nenhum deles coincide com a data de vencimento mencionada acima "Tue, 17-Apr-2012 15:03:24 GMT" porque todos os exemplos com hífens usam apenas 2 dígitos anos.