Ctrl K
ComunidadGuías…

app/services/connection_testing/http.rb

Rama develop · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
require 'net/http'

module ConnectionTesting
  # Net::HTTP plumbing for the survey connection-test probes. Generic over any
  # integration that speaks HTTP (SENEC, Shelly). InfluxDB keeps its own
  # InfluxDb::Http because that module is also shared with the data-polling
  # client.
  module Http
    # Failures that mean the host itself could not be contacted, as opposed to
    # a per-request HTTP error. SSLError covers an https probe hitting a plain
    # http port; EOFError the reverse.
    CONNECTION_ERRORS = [
      SocketError,
      Errno::ECONNREFUSED,
      Errno::ECONNRESET,
      Errno::EHOSTUNREACH,
      Errno::ENETUNREACH,
      Errno::ETIMEDOUT,
      Net::OpenTimeout,
      Net::ReadTimeout,
      OpenSSL::SSL::SSLError,
      EOFError,
    ].freeze

    # The subset of CONNECTION_ERRORS that can only happen *after* the TCP
    # connection was established — the peer accepted the connection and then
    # reset or closed it. For a protocol probe this proves a host is present
    # at the address; it just doesn't speak the expected protocol.
    PEER_RESET_ERRORS = [
      Errno::ECONNRESET,
      EOFError,
    ].freeze

    # Opens a Net::HTTP session. `verify: false` accepts self-signed
    # certificates — SENEC devices ship one for their local https endpoint.
    # The caller owns error handling: connection failures raise from
    # CONNECTION_ERRORS.
    def self.start(host:, port:, schema:, open_timeout:, read_timeout:, verify: true, &) # rubocop:disable Metrics/ParameterLists
      options = { use_ssl: schema == 'https', open_timeout:, read_timeout: }
      options[:verify_mode] = OpenSSL::SSL::VERIFY_NONE unless verify

      Net::HTTP.start(host, port.to_i, **options, &)
    end
  end
end