Встраивание JS не работает с ошибкой «Job exception: invalid stored block lengths (Zlib::DataError)»

Привет, у нас не получается заставить работать JS-вставку в нашей настройке. Я прочитал все другие похожие темы и ранее уже успешно настраивал такую вставку в совершенно другом проекте. Здесь же что-то выглядит иначе…

На внешнем сайте отображается только наш логотип, за которым следует надпись «загрузка обсуждения…».

В 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'

Поиск по этому сообщению об ошибке не даёт результатов ни здесь, ни в остальной части интернета?

Есть какие-то подсказки?

Похоже, ошибка связана со сжатием страницы? Можете поделиться ссылкой на страницу, которую вы пытаетесь встроить?

Спасибо за внимание к этому!

Это внешняя страница: Bitwig Preset: Phase-3 | Bitwiggers

А вот категория, где должны появляться темы: https://bitwish.top/c/bitwiggers/9

(Мы удалили шаблон после неудачных тестов.)

Помогает ли этот комментарий? (Это уже за пределами моей технической компетенции):

Ответы успешны (статус 200), и, судя по обсуждению, похоже, что система не может корректно обработать такой ответ при парсинге Bitwiggers, а именно при попытке обработать сжатие.

Судя по inflate, похоже, что было согласовано использование схемы сжатия deflate, тогда как предпочтительным, как мне кажется, является gzip. Запросы Firefox указывают, что он может обрабатывать оба варианта, но в данном случае сервер выбирает gzip.

Похоже, что при отправке запроса на ваш веб-сервер с помощью

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 лет, поэтому я предполагаю, что проблема на стороне вашего веб-сервера, но я всё же сообщил об этом в репозиторий проекта:

Интересно, спасибо за сообщение об ошибке. Подписался.

Попытка обобщить наши мысли:

Мы не контролируем эту обработку, но не считаем, что проблема в веб-сервере. А как насчет формирования заголовков? Если передано gzip, deflate, то ответ должен быть сжат gzip. Согласно спецификациям HTTP, клиент должен представлять опции, взвешенные или нет, в порядке их предпочтения. Таким образом, если запрос предпочитает deflate перед gzip, то он получает deflate. Разве проблема не в коде/запросе, поскольку он получил кодировку, которую запросил, но не смог её обработать?

Возможно, проблема связана с этим?

Здесь есть «merge» и, похоже, ожидание gzip?

Администратор другого сервера изучает, как можно принудительно включить gzip на своей стороне. Тем не менее, было бы интересно узнать ваше мнение по этому поводу.

(Для справки: сервер — AWS API Gateway; мы не можем им управлять, кроме как включать/выключать сжатие.)

Разработчик ответил: Issue · GitHub

Мог бы кто-нибудь помочь с переводом ответа разработчика Excon? Я не уверен, в чём именно проблема и кто может её исправить.

Также интересно, можем ли мы применить локальный патч к нашему Discourse, чтобы обойти эту проблему с gzip/deflate. Локальные патчи — это больно, но ещё больнее иметь интеграцию двух сайтов со сотнями страниц, внедрённых в обсуждения Discourse, которые ждут решения этой проблемы.

Сопровождающий Excon добавил исправление, которое теоретически решает эту проблему! :tada: По его словам, скоро должно выйти новое обновление Excon.

И вот автор Excon выпустил новую версию библиотеки с этим исправлением. :tada:

Значит ли это, что мы можем сразу обновить наш экземпляр, или Discourse использует собственный промежуточный репозиторий для таких библиотек? Судя по результатам обновлений Discourse, я полагаю, что они подтягиваются напрямую из исходных репозиториев, но лучше уточнить перед тем, как трогать наш бэкенд. :slight_smile:

Я решил обратиться напрямую к разработчикам Discourse :slight_smile: обновив систему и проверив логи. После того как мы увидели это

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

мы попробовали снова, и ТЕПЕРЬ ВСТРОЕННОЕ КОНТЕНТНОЕ ВКЛЮЧЕНИЕ РАБОТАЕТ!

Огромное спасибо @Falco за ваш отчет, переданный разработчикам. Вы были абсолютно правы, а я, возможно, создал лишний шум, который не был так уж полезен. Приношу свои извинения и ещё раз благодарю вас.