HTTP::Cookies 至 Mojo::UserAgent::CookieJar

HTTP::Cookies to Mojo::UserAgent::CookieJar

我有 $cookie_jar 是使用 HTTP::Cookies:

创建的
$cookie_jar = HTTP::Cookies->new(
  file => "my$path/my_cookies.dat",
  autosave => 1,
);

我想通过 Mojo::UserAgent 使用此 $cookie_jar 但没有找到选项,我看到的唯一选项是解析原始字符串:

my $cookies = $cookie->parse($str);

它们不是兼容的对象,只有 HTTP::Cookies 才能读取它创建的文件。您需要使用 Mojo::UserAgent::CookieJar with Mojo::UserAgent. Note that it will create one by default, accessed via $ua->cookie_jar. It does not have file serialization support, but the Persistent role 才能添加此功能——但是它仍然不会读取 HTTP::Cookies 格式。

我已经上传了一个新版本 HTTP::Cookies::Mozilla,它包含一个解决这个问题的示例程序。


使用 HTTP::Cookie 加载数据,然后通过回调调用 scan 将其转换为您喜欢的任何格式:

$cookie_jar = HTTP::Cookies->new(
  file => "my$path/my_cookies.dat",
  autosave => 1,
);
$cookie_jar->scan( \&callback )

在该回调中,将其转换为 Mojo::Cookie::Response 对象:

{
my $jar = Mojo::UserAgent::CookieJar->new

# access the scoped variable after you've run all the callbacks.
sub jar { $jar }

sub callback {
    my( $version, $key, $val, $path, $domain, $port, 
        $path_spec, $secure, $expires, $discard, $hash ) = @_;

    my $cookie = Mojo::Cookie::Response->new;
    ...fill in data...

    $jar->add( $mojo_cookie);
    )
}

或者,编写 HTTP::Cookies 的子类,以 HTTP::Cookies 方式读取您的格式,但改为填充 Mojo::CookieJar。没那么难(我写过好几篇这样的东西,其中一些在 CPAN 上)。

HTTP::Cookies 也有 as_string 方法,它使 multi-line 字符串每个字符串有一个 cookie。您可以使用这些行来输入 Mojo::Cookie 到 re-parse,但这对我来说没有吸引力。