Plagger::Cookies - cookie_jar factory class


Plagger documentation Contained in the Plagger distribution.

Index


Code Index:

NAME

Top

Plagger::Cookies - cookie_jar factory class

SYNOPSIS

Top

  # config.yaml: Firefox's cookies.txt
  global:
    user_agent:
      cookies: /path/to/cookies.txt

  # or more verbosely
  global:
    user_agent:
      cookies:
        type: Safari
        file: /path/to/Cookies.plist
        autosave: 1

DESCRIPTION

Top

Plagger::Cookies is a factory class to create HTTP::Cookies subclass instances by detecting the proper subclass using its filename (and possibly magic, if the filename format is share amongst multiple subclasses, eventually).

THANKS TO

Top

Thanks to brian d foy and Gisle Aas for creating HTTP::Cookies::* subclass modules.

AUTHOR

Top

Tatsuhiko Miyagawa

SEE ALSO

Top

Plagger, HTTP::Cookies, HTTP::Cookies::Mozilla, HTTP::Cookies::Microsoft


Plagger documentation Contained in the Plagger distribution.

package Plagger::Cookies;
use strict;

use UNIVERSAL::require;
use Storable;

our %Instances;

sub create {
    my($class, $conf) = @_;

    unless (ref $conf && $conf->{type}) {
        my $file = ref $conf ? $conf->{file} : $conf;
        $conf = $class->auto_guess($file);
    }

    $Instances{$conf->{file}} ||= do {
        $conf = Storable::dclone($conf);
        my $type = delete $conf->{type};
        my $impl = $type ? "HTTP::Cookies::$type" : "HTTP::Cookies";
        Plagger->context->log(debug => "$conf->{file} => $impl");
        $impl->require or Plagger->context->error("Error loading $impl: $@");

        if ($conf->{file} && !-e $conf->{file}) {
            Plagger->context->log(warn => "$conf->{file}: $!");
        }

        $impl->new(%$conf);
    };
}

sub auto_guess {
    my($self, $filename) = @_;

    # autosave is off by default for foreign cookies files

    if ($filename =~ /cookies\.txt$/i) {
        return { type => 'Mozilla', file => $filename };
    }
    elsif ($filename =~ /index\.dat$/i) {
        return { type => 'Microsoft', file => $filename };
    }
    elsif ($filename =~ /Cookies\.plist$/i) {
        return { type => 'Safari', file => $filename };
    }
    elsif ($filename =~ m!\.w3m/cookie$!) {
        return { type => 'w3m', file => $filename };
    }

    Plagger->context->log(warn => "Don't know type of $filename. Use it as LWP default");
    return { file => $filename, autosave => 1 };
}

1;

__END__