JS嵌入失败,出现“Job exception: invalid stored block lengths (Zlib::DataError)”

您好,我们无法在我们的设置中运行 JS embed。我已阅读所有其他类似主题,并且过去曾在一个完全不同的项目中成功运行过此嵌入。这次看起来有些不同……

在外部网站上,只能看到我们的徽标,后面跟着“正在加载讨论…”

在 Discourse 上,即使错误日志显示请求已到达,也没有创建任何主题。

我们已检查了 URL。我们还尝试添加静态 URL(而不是变量)。无效。

Discourse 错误日志显示此错误:

Job exception: invalid stored block lengths (Zlib::DataError)  
excon-0.88.0/lib/excon/middlewares/decompress.rb:23:in `inflate'

excon-0.88.0/lib/excon/middlewares/decompress.rb:23:in `response_call'

excon-0.88.0/lib/excon/middlewares/base.rb:26:in `response_call'

excon-0.88.0/lib/excon/middlewares/instrumentor.rb:44:in `response_call'

excon-0.88.0/lib/excon/middlewares/base.rb:26:in `response_call'

excon-0.88.0/lib/excon/middlewares/expects.rb:20:in `response_call'

excon-0.88.0/lib/excon/middlewares/response_parser.rb:12:in `response_call'

excon-0.88.0/lib/excon/connection.rb:451:in `response'

excon-0.88.0/lib/excon/connection.rb:282:in `request'

excon-0.88.0/lib/excon.rb:250:in `get'

/var/www/discourse/lib/final_destination.rb:206:in `public_send'

/var/www/discourse/lib/final_destination.rb:206:in `resolve'

/var/www/discourse/app/models/topic_embed.rb:120:in `find_remote'

/var/www/discourse/app/models/topic_embed.rb:192:in `import_remote'

/var/www/discourse/lib/topic_retriever.rb:52:in `fetch_http'

/var/www/discourse/lib/topic_retriever.rb:39:in `perform_retrieve'

/var/www/discourse/lib/topic_retriever.rb:12:in `retrieve'

/var/www/discourse/app/jobs/regular/retrieve_topic.rb:15:in `execute'

/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'

rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'

/var/www/discourse/app/jobs/base.rb:221:in `block in perform'

/var/www/discourse/app/jobs/base.rb:217:in `each'

/var/www/discourse/app/jobs/base.rb:217:in `perform'

sidekiq-6.3.1/lib/sidekiq/processor.rb:196:in `execute_job'

sidekiq-6.3.1/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'

sidekiq-6.3.1/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'

sidekiq-6.3.1/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'

sidekiq-6.3.1/lib/sidekiq/middleware/chain.rb:143:in `invoke'

sidekiq-6.3.1/lib/sidekiq/processor.rb:163:in `block in process'

sidekiq-6.3.1/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.3.1/lib/sidekiq/job_retry.rb:112:in `local'

sidekiq-6.3.1/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.3.1/lib/sidekiq.rb:39:in `block in <module:Sidekiq>'

sidekiq-6.3.1/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.3.1/lib/sidekiq/processor.rb:257:in `stats'

sidekiq-6.3.1/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.3.1/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.3.1/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.3.1/lib/sidekiq/job_retry.rb:79:in `global'

sidekiq-6.3.1/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.3.1/lib/sidekiq/logger.rb:11:in `with'

sidekiq-6.3.1/lib/sidekiq/job_logger.rb:33:in `prepare'

sidekiq-6.3.1/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.3.1/lib/sidekiq/processor.rb:162:in `process'

sidekiq-6.3.1/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.3.1/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.3.1/lib/sidekiq/util.rb:43:in `watchdog'

sidekiq-6.3.1/lib/sidekiq/util.rb:52:in `block in safe_thread'

搜索此错误消息在这里,或者……互联网上的其他地方?一无所获。

有什么线索吗?

2 个赞

看起来是页面压缩相关的错误?你能分享一个你试图嵌入的页面的链接吗?

3 个赞

谢谢您查看!

这是外部页面:Bitwig Preset: Phase-3 | Bitwiggers

这是主题应出现的类别:Bitwiggers.com - Bitwish

(我们在测试失败后已移除模板。)

这个评论有帮助吗?(这超出了我的技术能力范围):

响应是成功的 200,并且根据讨论,似乎它在抓取 Bitwiggers 时未能处理该响应,并且在尝试处理压缩时特别失败。

基于 inflate,似乎它协商使用了 deflate 压缩方案,但我认为首选是 gzip。Firefox 的请求表明它可以处理两者,但在那种情况下服务器会选择 gzip

2 个赞

看起来,如果我向您的网络服务器发送如下请求:

curl 'https://bitwiggers.com/presets/d1a7c2c7-848d-425c-9058-993317cbcc9c/' -H 'accept-encoding: deflate, gzip' -vv

我会收到一个 deflate 压缩的响应,而大多数网络服务器在给出这两个选项时会更倾向于使用 gzip。这很奇怪。

我注意到使用以下代码可以轻松重现此错误:

require 'excon'
response = Excon.get('https://bitwiggers.com/presets/d1a7c2c7-848d-425c-9058-993317cbcc9c/',
 headers: {'accept-encoding' => 'deflate, gzip'})

# 失败,excon 中的默认设置
Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(response.body)

# 成功
Zlib::Inflate.new(0).inflate(response.body)

这段代码在 Excon 中已有 8 年多的历史,所以我猜测是您的网络服务器出了问题,但我还是向上游报告了这个问题:

3 个赞

很有意思,感谢您提交的这个 bug。已订阅。

我们来总结一下我们的想法:

我们无法控制该处理过程,但我们认为问题不在于 Web 服务器。那会不会是请求头构建的问题呢?如果传入的是 gzip, deflate,那么响应就应该是 gzipped。根据 HTTP 规范,客户端应根据其偏好按顺序提供选项,无论是否加权。因此,如果请求优先选择 deflate 而不是 gzip,那么它就会收到 deflate。那么问题是不是出在代码/请求上,因为它收到了它所要求的但未能处理的编码?

也许问题与此有关?

这里有一个“merge”,似乎期望是 gzip?

另一个服务器的管理员正在研究如何在他们的服务器端强制使用 gzip。尽管如此,了解您对此的看法仍然很有意义。

(供参考,该服务器是 AWS API Gateway;除了启用/禁用压缩外,我们无法控制它。)

2 个赞

开发者已回复:Excon fails to inflate specific page · Issue #768 · excon/excon · GitHub

2 个赞

能否有人帮忙翻译一下Excon 开发者的回复?我不确定问题出在哪里,也不知道谁能修复它。

我也想知道我们是否可以为我们的 Discourse 应用一个本地补丁来规避这个 gzip/deflate 问题。本地补丁很麻烦,但让两个网站的集成(包含数百页)因为这个问题而无法嵌入 Discourse 讨论,那就更麻烦了。

1 个赞

Excon 的维护者已提交了一个补丁,理论上可以解决此问题!:tada: 他说,很快就会发布新的 Excon 版本。

2 个赞

现在 Excon 的维护者已发布了该库的新版本,其中包含此补丁。:tada:

这是否意味着我们可以立即更新我们的实例,还是 Discourse 使用自己的临时存储库来管理这些库?回想一下 Discourse 升级的输出,我认为它们是直接从上游存储库拉取的,但我宁愿在接触我们的后端之前先问一下。 :slight_smile:

1 个赞

我决定直接询问 Discourse :slight_smile: 通过升级并检查日志。在看到这个之后:

安装 excon 0.89.0
www/discourse/vendor/bundle/ruby/2.7.0/specifications/excon-0.89.0.gemspec

我们又试了一次,现在嵌入功能可以正常工作了!

非常感谢 @Falco 你向上的报告。你说得完全正确,我添加了一些可能不太有用的信息。我很抱歉,再次感谢你。

4 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.