ablog

不器用で落着きのない技術者のメモ

Can't locate object method "ssl_opts" via package "WWW::Mechanize"

WWW::Mechanize で SSL を使うときに、継承している LWP::UserAgent の ssl_opts メソッドで証明書のパスを指定しようとしたら以下のように「Can't locate object method "ssl_opts" via package "WWW::Mechanize"」と怒られた。

#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
$mech->ssl_opts({
	verify_hostname => 0,
	SSL_cert_file => '~/cacert.pem' }
);

$mech->get('https://twitter.com/');
$mech->dump_headers();

__END__
% ./ssl_test1.pl
Can't locate object method "ssl_opts" via package "WWW::Mechanize" at ./ssl_test1.pl line 7.


Google先生に質問してみると、

WWW::Mechanize passes its constructor arguments up to its parent (LWP::UserAgent). Try this:

use WWW::Mechanize;

my $mech = WWW::Mechanize->new(
    ssl_opts => {
        verify_hostname => 0,
    },
);
Mechanize and Bypassing SSL Certificate Check

WWW::Mechanize はコンストラクタで LWP::UserAgent に引数を渡していると書かれているのを見つけたので、試してみると、

#!/usr/bin/env perl
use strict;
use warnings;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new(
	ssl_opts => {
		verify_hostname => 0,
		SSL_cert_file => '~/cacert.pem',
	},
);

$mech->get('https://twitter.com/');
$mech->dump_headers();

__END__
% ./ssl_test2.pl
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Date: Tue, 26 Feb 2013 04:39:43 GMT
Pragma: no-cache
ETag: "13a526f41fc9e6b5d138b9c89a8d140d"
Server: tfe
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 16211
Content-Type: text/html; charset=utf-8

うまくいきました。