JS embed falha com "Job exception: invalid stored block lengths (Zlib::DataError)"

Olá, não conseguimos fazer o JS embed funcionar em nossa configuração. Li todos os outros tópicos semelhantes e já fiz esse embedding funcionar em um projeto totalmente diferente no passado. Este parece ser algo diferente…

No site externo, apenas nosso logotipo é exibido seguido por “carregando discussão…”

No Discourse, nenhum tópico está sendo criado, mesmo que o log de erros mostre que as requisições estão chegando.

Revisamos os URLs. Também testamos adicionar um URL estático (em vez de uma variável). Nada.

O log de erros do Discourse tem este Erro:

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'

Procurar por esta mensagem de erro não traz nada aqui, nem na… resto da Internet?

Alguma dica?

2 curtidas

Parece um erro relacionado à compressão da página? Você pode compartilhar um link para a página que está tentando incorporar?

3 curtidas

Obrigado por analisar isso!

Esta é a página externa: Bitwig Preset: Phase-3 | Bitwiggers

E esta é a categoria onde os tópicos devem aparecer: Bitwiggers.com - Bitwish

(Removemos o template após os testes falharem.)

Este comentário ajuda? (isso está fora da minha liga técnica):

As respostas são 200s bem-sucedidas e, com base nessa discussão, parece que ele está falhando ao lidar com essa resposta ao raspar o Bitwiggers, e está falhando especificamente ao tentar lidar com a compressão.

Com base em inflate, parece que negociou para usar o esquema de compressão deflate, enquanto acho que o preferido seria gzip. As solicitações do Firefox indicam que ele lidaria com ambos, mas o servidor decide por gzip nesse caso.

2 curtidas

Parece que se eu enviar uma requisição para o seu servidor web como

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

Eu recebo de volta uma resposta comprimida com deflate, onde a maioria dos servidores web, dadas as duas opções, preferiria usar gzip. Isso é estranho.

Vejo que posso reproduzir facilmente este erro com

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

# falha, padrão no excon
Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(response.body)

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

Este código tem mais de 8 anos no Excon, então eu suspeito que seu servidor web está com defeito aqui, mas eu o reportei ao upstream de qualquer maneira

3 curtidas

Interessante, e obrigado por registrar o bug. Inscrito.

Tentando resumir nossos pensamentos:

Não temos controle sobre esse tratamento, mas não achamos que seja o servidor web. E quanto à construção dos cabeçalhos? Se passados como gzip, deflate, a resposta deve ser comprimida. De acordo com as Especificações HTTP, o cliente deve apresentar as opções, ponderadas ou não, em ordem de acordo com sua preferência. então, se a solicitação prefere deflate a gzip, então recebe um deflate. Não é então o problema no código/solicitação, porque recebeu uma codificação que pediu e não conseguiu lidar com ela?

Talvez o problema esteja relacionado a isso?

Há um “merge” e o que parece ser uma expectativa de gzip?

O administrador do outro servidor está analisando como o gzip pode ser forçado do lado dele. Ainda assim, seria interessante saber seus pensamentos sobre isso.

(Para referência, o servidor é AWS API Gateway; não é algo sobre o qual temos controle, além de ativar/desativar a compressão.)

2 curtidas

O desenvolvedor respondeu: Excon fails to inflate specific page · Issue #768 · excon/excon · GitHub

2 curtidas

Alguém poderia ajudar a traduzir a resposta do desenvolvedor do Excon? Não tenho certeza de onde está o problema e quem poderia corrigi-lo.

Também me pergunto se poderíamos aplicar um patch local ao nosso Discourse para contornar esse problema de gzip/deflate. Patches locais são dolorosos, mas é ainda mais doloroso ter uma integração de dois sites com centenas de páginas a serem incorporadas com discussões do Discourse pendentes por causa desse problema.

1 curtida

O mantenedor do Excon enviou um patch que, em teoria, resolve este problema! :tada: Uma nova versão do Excon deve sair em breve, ele diz.

2 curtidas

E agora o mantenedor do Excon publicou uma nova versão da biblioteca incluindo este patch. :tada:

Isso significa que podemos atualizar nossa instância imediatamente, ou o Discourse está usando seu próprio repositório “staged” para essas bibliotecas? Lembrando da saída das atualizações do Discourse, acredito que elas estão sendo puxadas diretamente dos repositórios upstream, mas prefiro perguntar antes de mexer em nosso backend. :slight_smile:

1 curtida

Decidi perguntar diretamente ao Discourse :slight_smile: atualizando e verificando os logs. Depois de ver isso

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

tentamos novamente e AGORA A INCORPORAÇÃO FUNCIONA!

Muito obrigado @Falco pelo seu relatório upstream. Você estava absolutamente certo, e eu adicionei algum ruído que talvez não tenha sido tão útil. Minhas desculpas e obrigado novamente.

4 curtidas

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