图像请求失败。可能的HTTPS问题

时间:2017-07-11 19:33:40

标签: perl http

我正在处理一些我不理解的Perl代码:

my $tmpdir = "XXX";

my $src = "tmp" . time . int rand 10 . ".jpg";

while ( -s "$tmpdir/$src" ) {
    $src = "tmp" . time . int rand 10 . ".jpg";
}

my $ua = LWP::UserAgent->new( keep_alive => 0, timeout => 10 );

my $req = HTTP::Request->new(
    "GET",
    "https://www.com/act/couponimage/1877",
);

my $res = $ua->request( $req, "$tmpdir/$src" );

if ( ! $res || ! -s "$tmpdir/$src" ) {
    header( 301, 0, 0, "https://www.com/" );
    exit 0;
}

出于某种原因,它会重定向到主页面(标题代码)。

这里显然有问题,因为它永远不会执行重定向的最后一个if子句。也许它与使用HTTPS有关?

这不是文件系统问题。以下优惠券图像路径正常

Xxx.com/img/coupon-2600.jpg

1 个答案:

答案 0 :(得分:0)

请求应该正常, 但正如所指出的,你真的应该检查你正在使用的软件包的版本。 对我来说(perl 5.22 - LWP :: UserAgent 6.26),呼叫$ua->req( $req )必须是$ua->request( $req->uri )。并且存储响应的文件必须与$ua->request( $req->uri, :content_file => $fn )一起提供。

我认为原作者假定通过将文件名提供给$ua->request来创建内容文件。使用:content_file,这就是我发生的事情。他把while(-s $ src)放在适当的位置,以确保他得到一个尚未采用的文件名。

因此,我相信你的问题的解决方案是改变

my $res = $ua->request($req, "$tmpdir/$src")

$ua->request($req->uri, ':content_file' => "$tmpdir/$src" );

文档提到使用:content_file表示实际响应内容不再存储在对象中,因此您可能需要调整代码。 如果您需要的只是文件,我会调整最终的if以检查现在应该存在的文件(我认为,这应该只在成功响应时发生)。

如果您需要的是稍后要使用的$ res对象,我可能会选择检查响应是否有效,然后将内容打印到您想要的文件中,所以只需执行

my $res = $ua->request( $req->uri );

相应地调整if并将内容打印到文件。 我个人更喜欢后者,因为我可以检查成功的反应,然后打印:这似乎更清楚。