Class: Appium::Core::DirectConnections

Inherits:
Object
  • Object
show all
Defined in:
lib/appium_lib_core/driver.rb,
sig/lib/appium_lib_core/driver.rbs

Overview

DirectConnections has capabilities of directConnect

Constant Summary collapse

KEYS =

Returns:

  • (Hash[String | Symbol, String])
{
  protocol: 'directConnectProtocol',
  host: 'directConnectHost',
  port: 'directConnectPort',
  path: 'directConnectPath'
}.freeze
W3C_KEYS =

Returns:

  • (Hash[String | Symbol, String])
{
  protocol: 'appium:directConnectProtocol',
  host: 'appium:directConnectHost',
  port: 'appium:directConnectPort',
  path: 'appium:directConnectPath'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(capabilities) ⇒ DirectConnections

Returns a new instance of DirectConnections.

Parameters:

  • capabilities (Hash[String | Symbol, String])


99
100
101
102
103
104
# File 'lib/appium_lib_core/driver.rb', line 99

def initialize(capabilities)
  @protocol = capabilities[W3C_KEYS[:protocol]] || capabilities[KEYS[:protocol]]
  @host = capabilities[W3C_KEYS[:host]] || capabilities[KEYS[:host]]
  @port = capabilities[W3C_KEYS[:port]] || capabilities[KEYS[:port]]
  @path = capabilities[W3C_KEYS[:path]] || capabilities[KEYS[:path]]
end

Instance Attribute Details

#hoststring (readonly)

Returns a host name such as io.appium

Returns:

  • (string)

    Returns a host name such as io.appium



91
92
93
# File 'lib/appium_lib_core/driver.rb', line 91

def host
  @host
end

#pathstring (readonly)

Returns a path for webdriver such as /hub/wd

Returns:

  • (string)

    Returns a path for webdriver such as /hub/wd



97
98
99
# File 'lib/appium_lib_core/driver.rb', line 97

def path
  @path
end

#portinteger (readonly)

Returns a port number such as 443

Returns:

  • (integer)

    Returns a port number such as 443



94
95
96
# File 'lib/appium_lib_core/driver.rb', line 94

def port
  @port
end

#protocolstring (readonly)

Returns a protocol such as http/https

Returns:

  • (string)

    Returns a protocol such as http/https



88
89
90
# File 'lib/appium_lib_core/driver.rb', line 88

def protocol
  @protocol
end

Instance Method Details

#disallowed?(ip) ⇒ Boolean

Parameters:

  • ip (String)

Returns:

  • (Boolean)


154
155
156
157
# File 'lib/appium_lib_core/driver.rb', line 154

def disallowed?(ip)
  address = IPAddr.new ip
  DISALLOWED_RANGES.any? { |range| range.include? address }
end

#ip_literal?(host) ⇒ Boolean

Parameters:

  • host (String)

Returns:

  • (Boolean)


147
148
149
150
151
152
# File 'lib/appium_lib_core/driver.rb', line 147

def ip_literal?(host)
  IPAddr.new(host)
  true
rescue IPAddr::InvalidAddressError
  false
end

#resolve_addresses(host) ⇒ Array[String]

Parameters:

  • host (String)

Returns:

  • (Array[String])


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/appium_lib_core/driver.rb', line 131

def resolve_addresses(host)
  normalized_host = host.to_s.delete_prefix('[').delete_suffix(']')
  # If the host is already an IP literal, skip DNS resolution to avoid blocking calls
  return [normalized_host] if ip_literal?(normalized_host)

  Timeout.timeout(DNS_RESOLVE_TIMEOUT_SECONDS) do
    Socket.getaddrinfo(normalized_host, nil).map { |entry| entry[3] }.uniq
  end
rescue Timeout::Error
  ::Appium::Logger.warn("DNS resolution for '#{host}' timed out after #{DNS_RESOLVE_TIMEOUT_SECONDS}s")
  []
rescue SocketError => e
  ::Appium::Logger.warn("Failed to resolve host '#{host}' for direct connect: #{e.message}")
  []
end

#valid?Boolean

Returns:

  • (Boolean)


106
107
108
109
110
111
112
113
# File 'lib/appium_lib_core/driver.rb', line 106

def valid?
  return false unless [@protocol, @host, @port, @path].none?(&:nil?)

  addresses = resolve_addresses(@host)
  return false if addresses.empty?

  addresses.find { |ip| disallowed? ip }.nil?
end