2015-03-27 4 views
1

Я написал скрипт Perl для отправки HTTP-запроса GET на веб-сайт. В заголовках запроса, я хочу установить несколько куков, так что заголовок выглядит какPerl HTTP :: Cookie добавить несколько файлов cookie

Cookie: key1 = val1; key2 = val2; key3 = val3 

Я использую HTTP::Cookies установить кук в WWW::Mechanize объекте.

Однако set_cookie() может добавлять только один файл cookie в банку с печеньем. Как добавить несколько файлов cookie?

Если я вызываю метод set_cookie() несколько раз, в HTTP-GET-сообщении отправляется только последний cookie-файл cookie_jar.

Ниже приведен код, который я написал

#! /usr/bin/perl 

use warnings; 
use WWW::Mechanize; 
use HTTP::Cookies; 

$cookies = HTTP::Cookies->new(); 

$cookies->set_cookie(0, 'key1', 'val1', '/', 'domain', 80, 0, 0, 86400, 0); 
$cookies->set_cookie(0, 'key2', 'val2', '/', 'domain', 80, 0, 0, 86400, 0); 
$cookies->set_cookie(0, 'key3', 'val3', '/', 'domain', 80, 0, 0, 86400, 0); 

$mech=WWW::Mechanize->new(cookie_jar => $cookies, timeout => 20); 
$mech->agent_alias('Windows IE 6'); 

$url = "http://domain/path"; 

eval{$mech->get($url)}; 

if ([email protected]) { 
    print "there was an error in sending the HTTP GET request"; 
} 

print $mech->content(); 

Ниже, как запрос HTTP GET выглядит следующим образом:

GET /path HTTP/1.1 
TE: deflate,gzip;q=0.3 
Connection: TE, close 
Accept-Encoding: gzip 
Host: domain 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 
Cookie: key3=val3 
Cookie2: $Version="1" 

Как вы можете видеть, в заголовках запроса HTTP GET выше, только последний cookie key3 отправлен. Как я могу отправить несколько файлов cookie?

+0

Пробовали ли вы с помощью файла архива куков? $ cookie_jar = HTTP :: Cookies-> new ( file => "$ ENV {'HOME'}/lwp_cookies.dat", autosave => 1, ); – dudeman

ответ

2

Это похоже на работу.

use strict; 
use warnings; 

use HTTP::Request; 
use HTTP::Cookies; 

my $jar = HTTP::Cookies->new({}); 
$jar->set_cookie(0, 'key1', 'val1', '/', 'example.com', 80, 0, 0, 86400, 0); 
$jar->set_cookie(0, 'key2', 'val2', '/', 'example.com', 80, 0, 0, 86400, 0); 
$jar->set_cookie(0, 'key3', 'val3', '/', 'example.com', 80, 0, 0, 86400, 0); 

my $request = HTTP::Request->new(qw{ GET http://www.example.com/ }); 
$jar->add_cookie_header($request); 

print $request->as_string, "\n"; 

выход

GET http://www.example.com/ 
Cookie: key2=val2; key1=val1; key3=val3 
Cookie2: $Version="1" 
+0

Спасибо. Я получил его работу с WWW :: Mechanize. Причина, по которой он не работал, состоял в том, что я устанавливал поле домена в set_cookie, начиная с точки. Например, .domain вместо домена. set_cookie не будет добавлять файл cookie, если поле имени домена cookie начинается с точки. –