【发布时间】:2016-12-08 16:52:17
【问题描述】:
我似乎无法通过代理获取 https。
例子:
require LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->proxy('https', 'https://proxy:8080');
# $ua->proxy(['https'], 'https://proxy:8080'); # Fails
# $ua->env_proxy; # This also fails.
my $response = $ua->get('https://aws.amazon.com/cloudwatch/');
if ($response->is_success) {
print $response->decoded_content; # or whatever
}
else {
die $response->status_line;
}
结果:
500 无法在 test.pl 第 17 行连接到 aws.amazon.com:443(超时)。
但如果我尝试使用 curl(也是 wget)使用相同的代理,它就可以正常工作。
$ curl --head --proxy https://proxy:8080 https://aws.amazon.com/cloudwatch/
HTTP/1.1 200 Connection established
HTTP/1.1 200 OK
Server: Server
Date: Thu, 08 Dec 2016 16:42:01 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 214187
Perl 版本
$ perl -MLWP -le "print(LWP->VERSION)"
6.15
$ perl --version
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
我也试过有和没有这些:
export HTTPS_VERSION=3
export PERL_NET_HTTPS_SSL_SOCKET_CLASS="Net::SSL"
export PERL_LWP_ENV_PROXY=1
export PERL_LWP_SSL_VERIFY_HOSTNAME=0
我的实际目标是让aws-scripts-mon 在代理后面的机器上工作,但它也使用LWP::UserAgent,所以如果我让它工作,那么它可能也会。
添加信息
事实证明,如果我通过以下方式更改为 http
$ua->proxy('http', 'http://proxy:8080'); 并访问一个 http url 然后它工作得很好。问题是我需要它来使用 https。
mon-put-instance-data.pl 的错误是:
./mon-put-instance-data.pl --mem-util --disk-space-util --disk-path=/
ERROR: Failed to call CloudWatch: HTTP 500. Message: Can't connect to monitoring.eu-west-1.amazonaws.com:443 (timeout)
LWP::Protocol::https::Socket: connect: timeout at /usr/local/share/perl5/LWP/Protocol/http.pm line 47.
【问题讨论】:
-
为什么你有
require而不是use?为什么你没有在你的程序顶部有use strict和use warnings 'all'?这些对于任何 Perl 程序都是必不可少的。 -
我明白你的意思,但我只是从 CPAN 快速复制和粘贴,这就是使用 LWP:Useragent 的示例的样子 there。
标签: perl lwp lwp-useragent