gpt4 book ai didi

Perl Mojolicious EventSource gzip 输出

转载 作者:行者123 更新时间:2023-12-02 08:41:46 30 4
gpt4 key购买 nike

我有一个正在运行的 Mojolicious 服务器,它通过 HTML5 EventSource 提供数据。效果很好,但我希望数据以 gzip 格式编码。

通过写入发送压缩数据会在 Chrome 开发工具中导致 CONTENT_DECODING_FAILED。将建议的方法与“hook after_render”一起使用似乎不适用于事件流。如何使用 EventSource 和 Mojolicious 发送 gzip 编码数据?

use Mojolicious::Lite;
use Mojo::Redis;
use IO::Compress::Gzip 'gzip';

my $redis = Mojo::Redis->new;

get 'radar_events' => sub {
my $c = shift;
$c->render_later;
$c->inactivity_timeout(300);
$c->res->headers->content_type('text/event-stream');
$c->res->headers->cache_control('no_cache');
$c->res->headers->content_encoding('gzip');
$c->res->headers->header( 'Access-Control-Allow-Origin' => '*' );
my $id = Mojo::IOLoop->recurring(
5 => sub {
$c->delay(
sub {
my $delay = shift;
$redis->get( 'radar', $delay->begin );
},
sub {
my ( $delay, $jstring ) = @_;
my $buf = "event:rupdate\ndata: ".$jstring."\n\n";
gzip \$jstring => \my $buf;
$c->write($buf);
}
);
}
);
$c->on( finish => sub { Mojo::IOLoop->remove($id) } );
};

app->start;

最佳答案

我认为按照你的方式是不可能的。 Content-Encoding 是整个正文的编码,包括 event:rupdate\ndata:.... 消息。此外,每个事件消息都是一行(请参阅 the specification ),因此您无法通过这种方式传输二进制数据(如压缩数据)。

我不知道浏览器是否支持事件流的内容编码。但如果他们这样做,您将需要提供一个 gzip 流,从正文的开头开始,直到完成后才结束。由于 gzip 会缓冲数据以实现更好的压缩,因此您需要在添加每个事件后显式刷新 gzip 对象。

关于Perl Mojolicious EventSource gzip 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154835/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com