[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;
}

やれやれ。

    この記事へのコメント

    メールアドレスが公開されることはありません。

    頂戴したコメントは管理者に承認されるまで表示されません。