NAME

Cookies::Roundtrip - Convert between different HTTP Cookie formats, well, at least we tried!

VERSION

Version 0.01

SYNOPSIS

This module provides functionality for converting between some of the various HTTP Cookie formats. Roundtrip is a bit of a wish really as there can be unsupported fields in the various Cookie formats.

Anyway! Here we try to convert between HTTP::Cookies, HTTP::CookieJar, single Firefox::Marionette::Cookie or an ARRAY of Firefox::Marionette::Cookie, an ARRAY of Set-Cookie header strings, which cover WWW::Mechanize (and subclasses), LWP::UserAgent (and subclasses) and Firefox::Marionette. Note that WWW::Mechanize (and subclasses) and LWP::UserAgent (and subclasses) support both HTTP::Cookies, HTTP::CookieJar and this is controlled during construction.

Example usage:

use Cookies::Roundtrip qw/:all/;
use HTTP::Cookies;
use HTTP::CookieJar;

# Skip discarded (expired etc.) cookies?
my $skip_discard = 1; # or 0
# Verbosity level
my $VERBOSITY = 1; # 0 to ...

# from this HTTP::CookieJar cookie ...
my $hcj = HTTP::CookieJar->new;
$hc->add(...);
# ... convert to HTTP::Cookies
my $hc = httpcookiejar2httpcookies($hcj, undef, $skip_discard, $VERBOSITY);
# ... or supply the HTTP::Cookies object ($hc) to append to as sub parameter
httpcookiejar2httpcookies($hcj, $hc, $skip_discard, $VERBOSITY) or die;

# and back ...
my $hcj2 = httpcookies2httpcookiejar($hc, undef, $skip_discard, $VERBOSITY);

# From LWP::UserAgent
my $ua = LWP::UserAgent->new(cookie_jar_class=>'HTTP::CookieJar');
...
# extract them from LWP::UserAgent object
$hcj = lwpuseragent_get_cookies($ua, $VERBOSITY);
print "got ".count_cookies($hcj)." cookies\n";
# ... or load them into the LWP::UserAgent object
# note that the 2nd param ($hcj) can be a filename to load from file
# or any other Cookie object whose class we support
lwpuseragent_load_cookies($ua, $hcj, $VERBOSITY);

# write to files
wwwmechanize_save_cookies_to_file($mech, 'out.cookies', $skip_discard, $VERBOSITY);
lwpuseragent_save_cookies_to_file($ua, 'out.cookies', $skip_discard, $VERBOSITY);
firefoxmarionette_save_cookies_to_file($ffm, 'out.cookies', $skip_discard, $VERBOSITY);
# or load from files
wwwmechanize_load_cookies_from_file($mech, 'my.cookies', $skip_discard, $VERBOSITY);
wwwmechanize_load_cookies_from_file($ua, 'my.cookies', $skip_discard, $VERBOSITY);
wwwmechanize_load_cookies_from_file($ffm, 'my.cookies', $skip_discard, $VERBOSITY);
# write cookie to file
httpcookies2file($hc, 'out.cookies', $skip_discard, $VERBOSITY);
httpcookiejar2file($hcj, 'out.cookies', $skip_discard, $VERBOSITY);
# read cookies from file
$hc = file2httpcookies('my.cookies', undef, $VERBOSITY);
# or append them to existing cookies object
file2httpcookies('my.cookies', $hc, $VERBOSITY);

# count cookies of any Cookies object whose class we support
count_cookies($cookies_obj, $skip_discard, $VERBOSITY);
# clone cookies of any Cookies object whose class we support
my $newcook = clone_cookies($cookies_obj, $VERBOSITY);
# merge Cookie objects OF THE SAME class
$newcook = merge_cookies($cook1, $cook2, $skip_discard, $VERBOSITY);

# compare Cookie objects OF THE SAME class (we support) for equality
my $yes = cookies_are_equal($cook1, $cook2, $skip_discard, $VERBOSITY); # 1 or 0 or undef

# stringify any Cookies object whose class we support
print as_string_cookies($cook, $skip_discard, $VERBOSITY);

EXPORT

By default no symbols are exported. You need to manually import any symbol you wish to use. However, for your convenience the following export tags are available for importing symbols in groups.

Note that the :all tag will import all the exportable symbols.

SUBROUTINES

Below, $skip_discard is a flag dictating whether to skip discarded cookies during the operation (value of 1) or not (value of 0).

$verbosity denotes the verbosity level as an integer. 0 being mute.

lwpuseragent_get_cookies

my $ret = lwpuseragent_get_cookies($ua, $verbosity);

Arguments:

Return value:

It returns the cookies of the specified LWP::UserAgent object.

lwpuseragent_save_cookies_to_file

my $ret = lwpuseragent_save_cookies_to_file($ua, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

It saves the cookies held in specified LWP::UserAgent object to specified file. It returns ($ret) 1 on failure or 0 on success.

lwpuseragent_load_cookies

my $ret = lwpuseragent_load_cookies($ua, $cookies_or_file_etc, $verbosity);

Arguments:

Return value:

This is a generic function to load any type of cookies into the specifed LWP::UserAgent object. Cookies can be in a file ($cookies_or_file_etc is a scalar holding the filename), or a Cookies object we support or an ARRAY_REF of SetCookie strings or an ARRAY_REF of Firefox::Marionette::Cookie objects.

lwpuseragent_load_cookies_from_file

my $ret = lwpuseragent_load_cookies_from_file($ua, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

It loads cookies from file into the specifed LWP::UserAgent object. lwpuseragent_load_cookies will do the same job when specified with a filename.

It returns undef on failure or the cookies read from file as a Cookies object on success. Note that LWP::UserAgent supports both HTTP::Cookies and HTTP::CookieJar, the class of the returned object will be one of these, depending what the specified LWP::UserAgent object was instructed to hold, by using

my $ua = LWP::UserAgent->new(cookie_jar_class=>'HTTP::CookieJar');

lwpuseragent_load_setcookies

my $ret = lwpuseragent_load_setcookies($ua, $setcookies, $verbosity);

Arguments:

Return value:

lwpuseragent_load_firefoxmarionettecookies

my $ret = lwpuseragent_load_firefoxmarionettecookies($ua, $firefoxmarionettecookies, $verbosity);

Arguments:

Return value:

lwpuseragent_load_httpcookies

my $ret = lwpuseragent_load_httpcookies($ua, $httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

lwpuseragent_load_httpcookiejar

my $ret = lwpuseragent_load_httpcookiejar($ua, $httpcookiejar, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_get_cookies

my $ret = firefoxmarionette_get_cookies($ffmar, $verbosity);

Arguments:

Return value:

firefoxmarionette_save_cookies_to_file

my $ret = firefoxmarionette_save_cookies_to_file($ffmar, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_cookies

my $ret = firefoxmarionette_load_cookies($ffmar, $cookies_or_file_etc, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_cookies_from_file

my $ret = firefoxmarionette_load_cookies_from_file($ffmar, $filename, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_setcookies

my $ret = firefoxmarionette_load_setcookies($ffmar, $setcookies, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_firefoxmarionettecookies

my $ret = firefoxmarionette_load_firefoxmarionettecookies($ffmar, $firefoxmarionettecookies, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_httpcookies

my $ret = firefoxmarionette_load_httpcookies($ffmar, $httpcookies, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionette_load_httpcookiejar

my $ret = firefoxmarionette_load_httpcookiejar($ffmar, $httpcookiejar, $visit_cookie_domain_first, $skip_discard, $verbosity);

Arguments:

Return value:

wwwmechanize_get_cookies

my $ret = wwwmechanize_get_cookies($mech, $verbosity);

Arguments:

Return value:

wwwmechanize_save_cookies_to_file

my $ret = wwwmechanize_save_cookies_to_file($mech, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

wwwmechanize_load_cookies

my $ret = wwwmechanize_load_cookies($mech, $cookies_or_file_etc, $verbosity);

Arguments:

Return value:

wwwmechanize_load_cookies_from_file

my $ret = wwwmechanize_load_cookies_from_file($mech, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

wwwmechanize_load_setcookies

my $ret = wwwmechanize_load_setcookies($mech, $setcookies, $verbosity);

Arguments:

Return value:

wwwmechanize_load_firefoxmarionettecookies

my $ret = wwwmechanize_load_firefoxmarionettecookies($mech, $firefoxmarionettecookies, $verbosity);

Arguments:

Return value:

wwwmechanize_load_httpcookies

my $ret = wwwmechanize_load_httpcookies($mech, $httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

wwwmechanize_load_httpcookiejar

my $ret = wwwmechanize_load_httpcookiejar($mech, $httpcookiejar, $skip_discard, $verbosity);

Arguments:

Return value:

new_firefoxmarionettecookie

my $ret = new_firefoxmarionettecookie($params, $skip_discard, $verbosity);

Arguments:

Return value:

new_firefoxmarionettecookies

my $ret = new_firefoxmarionettecookies($params, $skip_discard, $verbosity);

Arguments:

Return value:

cookies2file

my $ret = cookies2file($cookies, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookiejar2file

my $ret = httpcookiejar2file($httpcookiejar, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

file2httpcookiejar

my $ret = file2httpcookiejar($filename, $httpcookiejar, $skip_discard, $verbosity);

Arguments:

Return value:

file2httpcookies

my $ret = file2httpcookies($filename, $httpcookies, $verbosity);

Arguments:

Return value:

httpcookies2file

my $ret = httpcookies2file($httpcookies, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionettecookies2file

my $ret = firefoxmarionettecookies2file($firefoxmarionettecookies, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

file2firefoxmarionettecookies

my $ret = file2firefoxmarionettecookies($filename, $firefoxmarionettecookies, $skip_discard, $verbosity);

Arguments:

Return value:

setcookies2file

my $ret = setcookies2file($setcookies, $filename, $skip_discard, $verbosity);

Arguments:

Return value:

file2setcookies

my $ret = file2setcookies($filename, $setcookies, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookies2httpcookiejar

my $ret = httpcookies2httpcookiejar($httpcookies, $httpcookiejar, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookies2firefoxmarionettecookies

my $ret = httpcookies2firefoxmarionettecookies($httpcookies, $firefoxmarionettecookies, $skip_discard, $verbosity);

Arguments:

Return value:

clone_cookies

my $ret = clone_cookies($w, $verbosity);

Arguments:

Return value:

clone_httpcookiejar

my $ret = clone_httpcookiejar($httpcookiejar, $verbosity);

Arguments:

Return value:

clone_firefoxmarionettecookie

my $ret = clone_firefoxmarionettecookie($firefoxmarionettecookie, $verbosity);

Arguments:

Return value:

clone_firefoxmarionettecookies

my $ret = clone_firefoxmarionettecookies($firefoxmarionettecookies, $verbosity);

Arguments:

Return value:

clone_httpcookies

my $ret = clone_httpcookies($httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

merge_cookies

my $ret = merge_cookies($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

merge_httpcookies

my $ret = merge_httpcookies($httpcookies_src, $httpcookies_dst, $skip_discard, $verbosity);

Arguments:

Return value:

merge_httpcookiejar

my $ret = merge_httpcookiejar($httpcookiejar_src, $httpcookiejar_dst, $skip_discard, $verbosity);

Arguments:

Return value:

merge_firefoxmarionettecookies

my $ret = merge_firefoxmarionettecookies($src, $dst);

Arguments:

Return value:

setcookies2httpcookiejar

my $ret = setcookies2httpcookiejar($setcookies, $httpcookiejar, $verbosity);

Arguments:

Return value:

setcookies2firefoxmarionettecookies

my $ret = setcookies2firefoxmarionettecookies($setcookies, $firefoxmarionettecookies, $verbosity);

Arguments:

Return value:

setcookie2firefoxmarionettecookie

my $ret = setcookie2firefoxmarionettecookie($setcookie, $firefoxmarionettecookie, $verbosity);

Arguments:

Return value:

count_cookies

my $ret = count_cookies($w, $skip_discard, $verbosity);

Arguments:

Return value:

count_httpcookies

my $ret = count_httpcookies($httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

my $ret = setcookie2httpcookies_set_cookie_array($setcookie, $verbosity);

Arguments:

Return value:

setcookie2hash

my $ret = setcookie2hash($setcookie, $verbosity);

Arguments:

Return value:

setcookies2httpcookies

my $ret = setcookies2httpcookies($setcookies, $httpcookies, $verbosity);

Arguments:

Return value:

firefoxmarionettecookies2setcookies

my $ret = firefoxmarionettecookies2setcookies($firefoxmarionettecookies, $setcookies, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionettecookies2httpcookiejar

my $ret = firefoxmarionettecookies2httpcookiejar($firefoxmarionettecookies, $httpcookiejar, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookiejar2httpcookies

my $ret = httpcookiejar2httpcookies($httpcookiejar, $httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

firefoxmarionettecookies2httpcookies

my $ret = firefoxmarionettecookies2httpcookies($firefoxmarionettecookies, $httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookies2setcookies

my $ret = httpcookies2setcookies($httpcookies, $setcookies, $skip_discard, $verbosity);

Arguments:

Return value:

httpcookiejar2setcookies

my $ret = httpcookiejar2setcookies($httpcookiejar, $setcookies, $verbosity);

Arguments:

Return value:

httpcookiejar2firefoxmarionettecookies

my $ret = httpcookiejar2firefoxmarionettecookies($httpcookiejar, $firefoxmarionettecookies, $verbosity);

Arguments:

Return value:

as_string_cookies

my $ret = as_string_cookies($w, $skip_discard, $verbosity);

Arguments:

Return value:

as_string_firefoxmarionettecookies

my $ret = as_string_firefoxmarionettecookies($w, $skip_discard, $verbosity);

Arguments:

Return value:

as_string_firefoxmarionettecookie

my $ret = as_string_firefoxmarionettecookie($w, $skip_discard, $verbosity);

Arguments:

Return value:

as_string_httpcookies

my $ret = as_string_httpcookies($httpcookies, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal

my $ret = cookies_are_equal($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_setcookies

my $ret = cookies_are_equal_setcookies($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_firefoxmarionettecookie

my $ret = cookies_are_equal_firefoxmarionettecookie($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_firefoxmarionettecookies

my $ret = cookies_are_equal_firefoxmarionettecookies($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_httpcookies

my $ret = cookies_are_equal_httpcookies($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_httpcookies_bad

my $ret = cookies_are_equal_httpcookies_bad($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

cookies_are_equal_httpcookiejar

my $ret = cookies_are_equal_httpcookiejar($obj1, $obj2, $skip_discard, $verbosity);

Arguments:

Return value:

CAVEATS

Converting between Perl Cookie classes is a futile task. Those who implemented a second Perl Cookie class are doing a dis-service to the community.

This module can fail at any time. If it does, please provide the details AND the remedy.

AUTHOR

Andreas Hadjiprocopis, <bliako at cpan.org>

BUGS

Please report any bugs or feature requests to bug-cookies-roundtrip at rt.cpan.org, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Cookies-Roundtrip. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc Cookies::Roundtrip

You can also look for information at:

ACKNOWLEDGEMENTS

LICENSE AND COPYRIGHT

This software is Copyright (c) 2025 by Andreas Hadjiprocopis.

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)