Ruby Mechanize не передает cookie с запросом - PullRequest
3 голосов
/ 21 сентября 2011

У меня проблема с механизацией Ruby, когда он теряет cookie во время перенаправления 302. После ручного пост-запроса.

1) Загрузить страницу

agent.get(url)

Вход:

I, [2011-09-21T19:50:46.077628 #5040]  INFO -- : Net::HTTP::Get: /some_site
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept => */*
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: user-agent => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-encoding => gzip,deflate,identity
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: accept-language => en-us,en;q=0.5
D, [2011-09-21T19:50:46.077628 #5040] DEBUG -- : request-header: host => site.com
I, [2011-09-21T19:50:47.965232 #5040]  INFO -- : status: Net::HTTPOK 1.1 200 OK
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: date => Wed, 21 Sep 2011 17:50:46 GMT
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: server => Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g PHP/5.2.17 mod_perl/2.0.4 Perl/v5.10.0
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: x-powered-by => PHP/5.2.17
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: set-cookie => frontend=9d47f1e106d4f2efcc2830988eb66610; expires=Wed, 21-Sep-2011 18:50:46 GMT; path=/; domain=site.com
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: expires => Thu, 19 Nov 1981 08:52:00 GMT
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: cache-control => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: pragma => no-cache
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: content-encoding => gzip
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: vary => Accept-Encoding,User-Agent
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: keep-alive => timeout=15, max=100
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: connection => Keep-Alive
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: transfer-encoding => chunked
D, [2011-09-21T19:50:47.965232 #5040] DEBUG -- : response-header: content-type => text/html; charset=UTF-8
D, [2011-09-21T19:50:48.370832 #5040] DEBUG -- : saved cookie: frontend=9d47f1e106d4f2efcc2830988eb66610

Все это прекрасно работает и выглядит хорошо для меня. Сеансовый файл cookie устанавливается, добавляется в банку cookie для механизации.

pp agent.cookies[0]

отображает интерфейс cookie = нет проблем.

2) Отправить POST-запрос на сервер

agent.post(url,{"product" => "10000","qty" => "1"})

Это не отправляет куки на сервер. Я получаю сообщение об ошибке («куки не включены, пожалуйста, включите, чтобы продолжить»). Передает ли Mechanize только куки-файлы по запросу POST, если указано?

Файл cookie не отправляется на сервер, если я специально не добавлю его в запрос POST.

agent.post(url,{"product" => "10000","qty" => "1"},'cookie' => agent.cookies[0])

В этом случае логгер показывает это:

D, [2011-09-21T19:50:48.480032 #5040] DEBUG -- : request-header: cookie => frontend=9d47f1e106d4f2efcc2830988eb66610

3) Сервер выполняет перенаправление 302.

Для запроса GET страницы перенаправления Mechanize не передает куки-файл сеанса. Таким образом, сеанс теряется, и новый файл cookie сеанса устанавливается сервером.

I, [2011-09-21T19:50:49.182034 #5040]  INFO -- : follow redirect to: http://site.com/redirect/
I, [2011-09-21T19:50:49.182034 #5040]  INFO -- : Net::HTTP::Get: /redirect/
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept => */*
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: user-agent => Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-encoding => gzip,deflate,identity
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: accept-language => en-us,en;q=0.5
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: host => site.com
D, [2011-09-21T19:50:49.182034 #5040] DEBUG -- : request-header: referer => http:/site.com/referrerlink/
I, [2011-09-21T19:50:49.728035 #5040]  INFO -- : status: Net::HTTPOK 1.1 200 OK
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: date => Wed, 21 Sep 2011 17:50:49 GMT
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: server => Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g PHP/5.2.17 mod_perl/2.0.4 Perl/v5.10.0
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: x-powered-by => PHP/5.2.17
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: set-cookie => frontend=c08477bb03473d68acd83ed81ed56101; expires=Wed, 21-Sep-2011 18:50:49 GMT; path=/; domain=site.com
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: expires => Thu, 19 Nov 1981 08:52:00 GMT
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: cache-control => no-store, no-cache, must-revalidate, post-check=0, pre-check=0
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: pragma => no-cache
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-encoding => gzip
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: vary => Accept-Encoding,User-Agent
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-length => 6441
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: keep-alive => timeout=15, max=98
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: connection => Keep-Alive
D, [2011-09-21T19:50:49.728035 #5040] DEBUG -- : response-header: content-type => text/html; charset=UTF-8

Есть ли какие-либо предложения о том, как я могу предотвратить потерю cookie-файлом Mechanize во время перенаправления 302? Я не могу ничего, кроме ручного запроса POST из-за JavaScript, используемого на сайте.

И это обычное поведение Mechanize для отправки файлов cookie только с ручным запросом POST, если он явно указан (из моего опыта использования запросов POST у меня до сих пор не было проблем с потерей файлов cookie сеанса).

Я ценю вашу помощь.

Спасибо, Крис

1 Ответ

0 голосов
/ 21 октября 2011

Я столкнулся с той же проблемой с перенаправлениями, когда куки не сохранялись в банке после перенаправления.Я загрузил последнюю версию Mechanize из репозитория github (версия 2.0.2), и проблема, кажется, исправлена.Не совсем точно, какие изменения в кодовой базе исправили эту проблему, но теперь файлы cookie, похоже, сохраняются после перенаправлений.

Когда вы пытаетесь это исправить, убедитесь, что вы используете версию 2.0.2драгоценный камень, а не другая локально установленная версия драгоценного камня.Это заставило меня ненадолго.:)

...