10. ruby - リンクチェック - fetch.rb リンク先を取得

 
10.1 リンク先を取得

10.1 リンク先を取得

 リンク先を実際に通信して結果を判断するクラスが長くなったので、リンク先を編集する処理と実際に取得する処理にわけました。。  こちらは実際に取得する処理です。
=begin

外部リンク・ドメイン内リンク・イメージファイルは open してみる

=end

require('pry')
require('uri')
require('open-uri')
require('searchName')
require('exceptlog')
require('openuri')

class Fetch
  def initialize()
  end

  def execute(sharp, uri, check)
    begin
      str = String(uri);

      if ((str[-4, 4] == '.png') ||                    # イメージなので存在の有無のみ
          (str[-4, 4] == '.gif'))
        html = open(uri).read
      else
        openuri = Openuri.new
        html = openuri.execute(uri)
      end

      if (sharp)                                        # # つきのものはドキュメント内の id まで検索
        html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')
        doc  = Nokogiri::HTML(html)

        search = SearchName.new
        response = search.execute(uri, doc, '#'+sharp)
        return response, check
      end

    rescue OpenURI::HTTPError => error
      return "HTTPError[#{error.message}]", check

    rescue SocketError => error
#      binding.pry
      return "#{error.message}", check
    rescue RuntimeError => error
      if (error.message.include?('redirection forbidden'))
        return 'redirection forbidden', check
        elsif ("#{error.class}" == 'Net::OpenTimeout')
          return 'Net::OpenTimeout', check
      elsif ("#{error.class}" == 'Net::ReadTimeout')
        return 'Net::ReadTimeout', check
      else
        exeptlog = ExceptLog.new
        binding.pry
        exeptlog.execute(self, error)
        exit 1
      end
    rescue TypeError => error
      if (error.message.include?('no implicit conversion'))
        return 'no implicit conversion', check
      elsif (error.message.include?('Net::OpenTimeout'))
          return 'Net::OpenTimeout', check
      else
        exeptlog = ExceptLog.new
        binding.pry
        exeptlog.execute(self, error)
        exit 1
      end
    rescue Net::ReadTimeout => error
      return "#{error.message}", check
    rescue OpenSSL::SSL::SSLError => error
      return "#{error.message}", check
    rescue EOFError => error
      return 'end of file reached', check
    rescue Errno::ECONNRESET => error
      return 'Connection reset by peer', check
    rescue Errno::ENOENT => error                         # No such file or directory
      return 'No such file or directory', check
    rescue Errno::EHOSTUNREACH => error
      return 'Failed to open TCP connection', check
    rescue Errno::ECONNREFUSED => error
      return 'Connection refused', check
    rescue => error
      exeptlog = ExceptLog.new
      binding.pry
      exeptlog.execute(self, error)
      exit 1
    end

    return 'OK', check
  end
end