File: //lib/ruby/vendor_ruby/selenium/webdriver/common/proxy.rb
# frozen_string_literal: true
# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
module Selenium
module WebDriver
class Proxy
TYPES = {
direct: 'DIRECT', # Direct connection, no proxy (default on Windows).
manual: 'MANUAL', # Manual proxy settings (e.g., for httpProxy).
pac: 'PAC', # Proxy autoconfiguration from URL.
auto_detect: 'AUTODETECT', # Proxy autodetection (presumably with WPAD).
system: 'SYSTEM' # Use system settings (default on Linux).
}.freeze
ALLOWED = {type: 'proxyType',
ftp: 'ftpProxy',
http: 'httpProxy',
no_proxy: 'noProxy',
pac: 'proxyAutoconfigUrl',
ssl: 'sslProxy',
auto_detect: 'autodetect',
socks: 'socksProxy',
socks_username: 'socksUsername',
socks_password: 'socksPassword',
socks_version: 'socksVersion'}.freeze
ALLOWED.each_key { |t| attr_reader t }
def self.json_create(data)
data['proxyType'] = data['proxyType'].downcase.to_sym
return if data['proxyType'] == :unspecified
proxy = new
ALLOWED.each do |k, v|
proxy.send("#{k}=", data[v]) if data.key?(v)
end
proxy
end
def initialize(opts = {})
not_allowed = []
opts.each do |k, v|
if ALLOWED.key?(k)
send("#{k}=", v)
else
not_allowed << k
end
end
return if not_allowed.empty?
raise ArgumentError, "unknown option#{'s' if not_allowed.size != 1}: #{not_allowed.inspect}"
end
def ==(other)
other.is_a?(self.class) && as_json == other.as_json
end
alias_method :eql?, :==
def ftp=(value)
self.type = :manual
@ftp = value
end
def http=(value)
self.type = :manual
@http = value
end
def no_proxy=(value)
self.type = :manual
@no_proxy = value
end
def ssl=(value)
self.type = :manual
@ssl = value
end
def pac=(url)
self.type = :pac
@pac = url
end
def auto_detect=(bool)
self.type = :auto_detect
@auto_detect = bool
end
def socks=(value)
self.type = :manual
@socks = value
end
def socks_username=(value)
self.type = :manual
@socks_username = value
end
def socks_password=(value)
self.type = :manual
@socks_password = value
end
def socks_version=(value)
self.type = :manual
@socks_version = value
end
def type=(type)
raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}" unless TYPES.key? type
if defined?(@type) && type != @type
raise ArgumentError, "incompatible proxy type #{type.inspect} (already set to #{@type.inspect})"
end
@type = type
end
def as_json(*)
json_result = {
'proxyType' => TYPES[type],
'ftpProxy' => ftp,
'httpProxy' => http,
'noProxy' => no_proxy,
'proxyAutoconfigUrl' => pac,
'sslProxy' => ssl,
'autodetect' => auto_detect,
'socksProxy' => socks,
'socksUsername' => socks_username,
'socksPassword' => socks_password,
'socksVersion' => socks_version
}.delete_if { |_k, v| v.nil? }
json_result if json_result.length > 1
end
def to_json(*)
JSON.generate as_json
end
end # Proxy
end # WebDriver
end # Selenium