У меня есть список URL-адресов изображений (> 1000), которые мне нужно загрузить в моем приложении ruby. Я использую open-uri
для этого. Я знаю, что у него есть недостатки, но это удобно, если вам нужно поддерживать http, https и ftp.
Сам вызов так же прост, как этот
file = open(url) # an https url
После этого файл обрабатывается Paperclip.
Проблема в том, что время от времени происходит сбой вызова с Zlib::DataError
, даже при повторном использовании одних и тех же URL-адресов. Иногда их можно скачать, иногда изображение выдает ошибку. Это трассировка стека:
/usr/local/lib/ruby/2.6.0/net/http/response.rb:382 in inflate
/usr/local/lib/ruby/2.6.0/net/http/response.rb:382 in block in inflate_adapter
/usr/local/lib/ruby/2.6.0/net/protocol.rb:497 in call_block
/usr/local/lib/ruby/2.6.0/net/protocol.rb:488 in <<
/usr/local/lib/ruby/2.6.0/net/protocol.rb:163 in read
/usr/local/lib/ruby/2.6.0/net/http/response.rb:405 in read
/usr/local/lib/ruby/2.6.0/net/http/response.rb:293 in block in read_body_0
/usr/local/lib/ruby/2.6.0/net/http/response.rb:264 in inflater
/usr/local/lib/ruby/2.6.0/net/http/response.rb:283 in read_body_0
/usr/local/lib/ruby/2.6.0/net/http/response.rb:204 in read_body
/usr/local/lib/ruby/2.6.0/open-uri.rb:352 in block (2 levels) in open_http
/usr/local/lib/ruby/2.6.0/net/http.rb:1518 in block in transport_request
/usr/local/lib/ruby/2.6.0/net/http/response.rb:165 in reading_body
/usr/local/lib/ruby/2.6.0/net/http.rb:1517 in transport_request
/usr/local/lib/ruby/2.6.0/net/http.rb:1479 in request
/gems/newrelic_rpm-5.6.0.349/lib/new_relic/agent/instrumentation/net.rb:36 in block in request_with_newrelic_trace
/gems/newrelic_rpm-5.6.0.349/lib/new_relic/agent.rb:501 in disable_all_tracing
/gems/newrelic_rpm-5.6.0.349/lib/new_relic/agent/instrumentation/net.rb:35 in request_with_newrelic_trace
/gems/elastic-apm-2.3.1/lib/elastic_apm/spies/net_http.rb:54 in block in request
/gems/elastic-apm-2.3.1/lib/elastic_apm.rb:276 in with_span
/gems/elastic-apm-2.3.1/lib/elastic_apm/spies/net_http.rb:51 in request
/usr/local/lib/ruby/2.6.0/open-uri.rb:343 in block in open_http
/usr/local/lib/ruby/2.6.0/net/http.rb:920 in start
/usr/local/lib/ruby/2.6.0/open-uri.rb:337 in open_http
/usr/local/lib/ruby/2.6.0/open-uri.rb:756 in buffer_open
/usr/local/lib/ruby/2.6.0/open-uri.rb:226 in block in open_loop
/usr/local/lib/ruby/2.6.0/open-uri.rb:224 in catch
/usr/local/lib/ruby/2.6.0/open-uri.rb:224 in open_loop
/usr/local/lib/ruby/2.6.0/open-uri.rb:165 in open_uri
/usr/local/lib/ruby/2.6.0/open-uri.rb:736 in open
/usr/local/lib/ruby/2.6.0/open-uri.rb:35 in open
Я также загрузил изображения с помощью wget
, чтобы посмотреть, отправляет ли сервер испорченный образ, но его трудно отладить: вы не можете быть уверены, что все в порядке, потому что сервер не вернул ошибку в этом запуске или если с сервером все в порядке и с ним нет ошибок.
Так что я не уверен, что ошибка вызвана сервером, open-uri или ...?
Итак, чтобы лучше отладить эту проблему, я хочу понять, почему ruby http делает это inflate
и если я могу обойти это, ИЛИ если кто-то испытывал нечто подобное раньше.