Sha256: 58364c4086f0bf726b32a87e0468d882fe4a704136c608d154833724cd74e3d6

Contents?: true

Size: 1.34 KB

Versions: 10

Compression:

Stored size: 1.34 KB

Contents

# frozen_string_literal: true

module DnsMock
  class Server
    CURRENT_HOST_NAME = 'localhost'
    CURRENT_HOST_ADDRESS = '127.0.0.1'

    class RandomAvailablePort
      ATTEMPTS = 100
      MIN_DYNAMIC_PORT_NUMBER = 49_152
      MAX_DYNAMIC_PORT_NUMBER = 65_535

      class << self
        def call
          DnsMock::Server::RandomAvailablePort::ATTEMPTS.times do
            port = rand(
              DnsMock::Server::RandomAvailablePort::MIN_DYNAMIC_PORT_NUMBER..DnsMock::Server::RandomAvailablePort::MAX_DYNAMIC_PORT_NUMBER
            )
            return port if port_free?(port)
          end
          raise DnsMock::Error::RandomFreePort, DnsMock::Server::RandomAvailablePort::ATTEMPTS
        end

        private

        def udp_port_free?(port, socket = ::UDPSocket.new)
          socket.bind(DnsMock::Server::CURRENT_HOST_NAME, port)
          socket.close
          true
        rescue ::Errno::EADDRINUSE
          false
        end

        def tcp_port_free?(port, socket = ::Socket.new(::Socket::AF_INET, ::Socket::SOCK_STREAM, 0))
          socket.bind(::Socket.sockaddr_in(port, DnsMock::Server::CURRENT_HOST_ADDRESS))
          socket.close
          true
        rescue ::Errno::EADDRINUSE
          false
        end

        def port_free?(port)
          udp_port_free?(port) && tcp_port_free?(port)
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
dns_mock-1.2.4 lib/dns_mock/server/random_available_port.rb
dns_mock-1.2.3 lib/dns_mock/server/random_available_port.rb
dns_mock-1.2.2 lib/dns_mock/server/random_available_port.rb
dns_mock-1.2.1 lib/dns_mock/server/random_available_port.rb
dns_mock-1.2.0 lib/dns_mock/server/random_available_port.rb
dns_mock-1.1.0 lib/dns_mock/server/random_available_port.rb
dns_mock-1.0.0 lib/dns_mock/server/random_available_port.rb
dns_mock-0.2.1 lib/dns_mock/server/random_available_port.rb
dns_mock-0.2.0 lib/dns_mock/server/random_available_port.rb
dns_mock-0.1.0 lib/dns_mock/server/random_available_port.rb