lib/selenium/webdriver/common/client_config.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.

require 'uri'

module Selenium
  module WebDriver
    #
    # Configuration for HTTP clients.
    #

    class ClientConfig
      class << self
        attr_accessor :default_extra_headers
        attr_writer :default_user_agent

        def default_user_agent
          @default_user_agent ||= "selenium/#{WebDriver::VERSION} (ruby #{Platform.os})"
        end
      end

      attr_accessor :open_timeout, :read_timeout, :max_redirects, :proxy
      attr_writer :extra_headers, :user_agent
      attr_reader :server_url

      #
      # @param [Numeric] open_timeout Seconds to wait for the connection to open.
      # @param [Numeric] read_timeout Seconds to wait for a response.
      # @param [Integer] max_redirects Maximum number of redirects to follow.
      # @param [Proxy] proxy Proxy to use for the connection.
      # @param [Hash] extra_headers Additional headers to send with each request.
      # @param [String] user_agent Value to send as the User-Agent header.
      # @param [String, URI] server_url URL of the server to connect to.
      #
      def initialize(open_timeout: 60,
                     read_timeout: 120,
                     max_redirects: 20,
                     proxy: nil,
                     extra_headers: nil,
                     user_agent: nil,
                     server_url: nil)
        @open_timeout = open_timeout
        @read_timeout = read_timeout
        @max_redirects = max_redirects
        @proxy = proxy || proxy_from_environment
        @extra_headers = extra_headers
        @user_agent = user_agent
        self.server_url = server_url
      end

      def user_agent
        @user_agent || self.class.default_user_agent
      end

      def extra_headers
        @extra_headers || self.class.default_extra_headers
      end

      def server_url=(url)
        if url.nil?
          @server_url = nil
        else
          url = url.to_s
          url += '/' unless url.end_with?('/')
          @server_url = URI.parse(url)
        end
      end

      private

      def proxy_from_environment
        proxy = ENV.fetch('http_proxy', nil) || ENV.fetch('HTTP_PROXY', nil)
        return unless proxy

        no_proxy = ENV.fetch('no_proxy', nil) || ENV.fetch('NO_PROXY', nil)
        proxy = "http://#{proxy}" unless proxy.match?(%r{\Ahttps?://})
        Proxy.new(http: proxy, no_proxy: no_proxy)
      end
    end
  end
end