在纯Perl中从另一个HTTP资源流传输的最简单方法是什么?

问题描述 投票:6回答:5

在Perl中从另一个HTTP资源进行流传输的最简单方法(不打开外壳进行卷曲并从stdin读取)?我在这里假设我正在读取的HTTP资源是潜在的无限流(或实际上非常长)]

perl http streaming mod-perl
5个回答
6
投票

[HTTP::Literequest方法允许您指定回调。

$data_callback参数(如果使用)是一种在接收到数据时过滤数据或处理大量传输的方法。它必须是一个函数引用,并将被传递:对进行回调的http请求实例的引用,对将要添加到主体的当前数据块的引用以及$cbargs参数(可以什么都可以)。它必须返回对要添加到文档正文中的数据的引用,或者返回undef。

但是,从源代码上看,sub request中存在一个[bug],因为它[忽略了传递的回调。它[忽略了。使用似乎更安全set_callback#!/usr/bin/perl use strict; use warnings; use HTTP::Lite; my $http = HTTP::Lite->new; $http->set_callback(\&process_http_stream); $http->http11_mode(1); $http->request('http://www.example.com/'); sub process_http_stream { my ($self, $phase, $dataref, $cbargs) = @_; warn $phase, "\n"; return; }

输出:
C:\ Temp> ht连接内容长度完成标题内容完成内容数据做完了

看起来传递给request方法的回调似乎受到不同的对待:

#!/usr/bin/perl

use strict;
use warnings;

use HTTP::Lite;

my $http = HTTP::Lite->new;
$http->http11_mode(1);

my $count = 0;
$http->request('http://www.example.com/',
    \&process_http_stream,
    \$count,
);

sub process_http_stream {
    my ($self, $data, $times) = @_;
    ++$$times;
    print "$$times====\n$$data\n===\n";
}

9
投票

3
投票

2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.