File: //usr/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