WWW::Mechanize で SSL を使うときに、継承している LWP::UserAgent の ssl_opts メソッドで証明書のパスを指定しようとしたら以下のように「Can't locate object method "ssl_opts" via package "WWW::Mechanize"」と怒られた。
- ssl_test1.pl
#!/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 に引数を渡していると書かれているのを見つけたので、試してみると、
- ssl_test2.pl
#!/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
うまくいきました。