JS埋め込みで「Job exception: invalid stored block lengths (Zlib::DataError)」が発生して失敗する

こんにちは。設定で JS embed を機能させることができません。他の類似トピックはすべて読みましたが、以前は別のプロジェクトでこの埋め込みを機能させたことがあります。今回は何かが違うようです…

外部サイトでは、ロゴと「loading discussion…」というテキストしか表示されません。

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

Webサーバーに次のようにリクエストを送信すると、

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

deflateで圧縮されたレスポンスが返ってきます。ほとんどのWebサーバーは、両方のオプションが与えられた場合、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年以上前のものなので、Webサーバーに問題があると思われますが、念のため上流にも報告しました。

「いいね!」 3

興味深いですね。バグのご報告ありがとうございます。購読しました。

私たちの考えを要約すると、以下のようになります。

それらの処理を制御することはできませんが、ウェブサーバーの問題ではないと考えています。ヘッダーの構築についてはどうでしょうか? gzip, deflate として渡された場合、レスポンスはgzip圧縮されるはずです。HTTP仕様によれば、クライアントはオプションを、重み付けされているかどうかにかかわらず、優先順位に従って提示する必要があります。したがって、リクエストがgzipよりもdeflateを優先する場合、deflateが返されます。これは、クライアントが要求したエンコーディングを受け取ったにもかかわらず、それを処理できなかったため、コード/リクエストの問題ではないでしょうか?

これは関連があるかもしれませんか?

そこには「マージ」があり、gzipが期待されているように見えますか?

別のサーバーの管理者は、gzipを強制する方法を調べています。それでも、この件に関するあなたの考えを知ることは興味深いでしょう。

(参考までに、サーバーはAWS API Gatewayであり、圧縮の有効化/無効化以外に、私たちが制御できるものではありません。)

「いいね!」 2

開発者が返信しました:Excon fails to inflate specific page · Issue #768 · excon/excon · GitHub

「いいね!」 2

Excon開発者からの応答を翻訳していただけませんか?問題がどこにあるのか、誰が修正できるのかわかりません。

また、このgzip/deflateの問題を回避するために、Discourseにローカルパッチを適用できるかどうか疑問に思っています。ローカルパッチは面倒ですが、この問題のためにDiscourseのディスカッションが保留されている、何百ページものサイト統合を埋め込むことはさらに面倒です。

「いいね!」 1

Excon のメンテナーがこの問題を理論上解決するパッチをコミットしました! :tada: 近いうちに新しい Excon リリースがリリースされるとのことです。

「いいね!」 2

そして今、Exconのメンテナーがこのパッチを含むライブラリの新しいバージョンを公開しました:tada:

これは、私たちのインスタンスをすぐにアップデートできるということでしょうか、それともDiscourseはこれらのライブラリのために独自のステージングリポジトリを使用しているのでしょうか?Discourseのアップグレードの出力を思い出すと、それらは直接アップストリームリポジトリからプルされていると思いますが、バックエンドに触れる前に確認した方が良いでしょう。:slight_smile:

「いいね!」 1

Discourseに直接問い合わせることにしました :slight_smile: アップグレードしてログを確認しました。これを見た後\n\n> excon 0.89.0 をインストール中\n> www/discourse/vendor/bundle/ruby/2.7.0/specifications/excon-0.89.0.gemspec\n\nもう一度試したところ、埋め込みが機能するようになりました!\n\n@Falco、あなたのアップストリームへの報告に本当に感謝します。あなたは完全に正しく、私はおそらくそれほど役に立たないノイズを追加してしまいました。申し訳ありません、そして再び感謝します。

「いいね!」 4

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