[Perl] Proxy経由でHTTPS通信を行う

随分前の話しになりますが、PerlからProxy経由でHTTP/HTTPSなページへアクセスする必要が生じたので以下のようなスクリプトを組んでいたのですが、実行環境のActivePerlを数年ぶりにアップデートして最新の5.20系に変えたところ動かなくなってしまいました。


use strict;
use utf8;
use LWP::UserAgent;
use URI::URL;

use constant
{
    HTTP_PROXY  => 'http://111.222.333.444:8080',
    HTTPS_PROXY => 'http://111.222.333.444:8080',
};

if (HTTPS_PROXY) {
    $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
    $ENV{HTTPS_PROXY} = HTTPS_PROXY;
}

my $ua = LWP::UserAgent->new;
$ua->proxy('http', HTTP_PROXY) if (HTTP_PROXY);

my $url = new URI::URL('https://example.com/');

my $response = $ua->get($url);
if ($response->is_success) {
    print $response->content;
}

「コンピュータに perl516.dll がないため、プログラムを開始できません。」云々のダイアログが表示されてしまい、エラーハンドリングでも拾いきれないので慌てて調べたところLWPまわりでSSLに絡む実装が変わったことが原因の模様。


このため以下のように修正して無事に動作することを確認。


use strict;
use utf8;
use LWP::UserAgent;
use URI::URL;

use constant
{
    HTTP_PROXY  => 'http://111.222.333.444:8080',
    HTTPS_PROXY => 'http://111.222.333.444:8080',
};

my $ua = LWP::UserAgent->new;
$ua->proxy('http',  HTTP_PROXY)  if (HTTP_PROXY);
$ua->proxy('https', HTTPS_PROXY) if (HTTPS_PROXY);

my $url = new URI::URL('https://example.com/');

my $response = $ua->get($url);
if ($response->is_success) {
    print $response->content;
}

やれやれ。

    このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

    reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

    頂戴したコメントは管理者に承認されるまで表示されません。また、メールアドレスが公開されることはありません。
    このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。