У меня есть код, который загружает веб-документ с помощью nokogiri:
require 'nokogiri'
require 'open-uri'
require 'openssl'
require 'net/https'
define_method (:loadWebDoc) { |url|
web_doc = nil
begin
file = open(url)
web_doc = Nokogiri::HTML(file)
rescue OpenURI::HTTPError => ex
raise ex
end
web_doc
}
#process some urls with threads...
Это всегда работало хорошо, пока я не начал использовать его в потоках. Мой скрипт вызывает loadWebDoc
много раз успешно, но примерно через 30 секунд обработки документов я получаю сообщение об ошибке, подобное этому:
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/protocol.rb:44:in `connect_nonblock': SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server session ticket A (OpenSSL::SSL::SSLError)
Здесь аналогичная проблема в стеке , которая предлагает использовать TLSv1, но использует стандартный http, а не Nokogiri.
Я пробовал несколько вариантов чего-то вроде:
file = open(url, :ssl_version => OpenSSL::SSL::SSLContext::TLSv1)
но это просто дает мне ошибки вроде
uninitialized constant OpenSSL::SSL::SSLContext::TLSv1 (NameError)
Как я могу заставить Нокогири сделать то же самое? Похоже, мне нужно настроить версию и шифр ssl, но я не уверен, как с Nokogiri, и я, вероятно, использую неправильную константу.