Как обрабатывать ssl / force ssl_version при чтении документов с помощью Nokogiri? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть код, который загружает веб-документ с помощью 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, и я, вероятно, использую неправильную константу.

1 Ответ

0 голосов
/ 10 ноября 2018

Похоже, что ошибка 'connect_nonblock' возникает, потому что сервер не может обрабатывать много соединений, особенно в случае потоков. Попробуйте добавить задержку между попытками

open(url, open_timeout: 100)

* ** +1004 1005 * -doc.org / STDLIB-2.4.0 / libdoc / гнездо / RDoc / Socket.html # метод-я-connect_nonblock

...