# File lib/restclient/request.rb, line 157
    def transmit uri, req, payload, & block
      setup_credentials req

      net = net_http_class.new(uri.host, uri.port)
      net.use_ssl = uri.is_a?(URI::HTTPS)
      if @verify_ssl
        if @verify_ssl.is_a? Integer
          net.verify_mode = @verify_ssl
        else
          net.verify_mode = OpenSSL::SSL::VERIFY_PEER
        end
      else
        net.verify_mode = OpenSSL::SSL::VERIFY_NONE
      end
      net.cert = @ssl_client_cert if @ssl_client_cert
      net.key = @ssl_client_key if @ssl_client_key
      net.ca_file = @ssl_ca_file if @ssl_ca_file
      net.read_timeout = @timeout if @timeout
      net.open_timeout = @open_timeout if @open_timeout

      # disable the timeout if the timeout value is -1
      net.read_timeout = nil if @timeout == -1
      net.open_timeout = nil if @open_timeout == -1

      # verify_callback isn't well supported on all platforms, but do allow
      # users to set one if they want.
      if ssl_verify_callback
        net.verify_callback = ssl_verify_callback

        # Hilariously, jruby only calls the callback when cert_store is set to
        # something, so make sure to set one.
        # https://github.com/jruby/jruby/issues/597
        if RestClient::Platform.jruby?
          net.cert_store ||= OpenSSL::X509::Store.new
        end

        if ssl_verify_callback_warnings != false
          if print_verify_callback_warnings
            warn('pass :ssl_verify_callback_warnings => false to silence this')
          end
        end
      end

      RestClient.before_execution_procs.each do |before_proc|
        before_proc.call(req, args)
      end

      log_request

      net.start do |http|
        if @block_response
          http.request(req, payload ? payload.to_s : nil, & @block_response)
        else
          res = http.request(req, payload ? payload.to_s : nil) { |http_response| fetch_body(http_response) }
          log_response res
          process_result res, & block
        end
      end
    rescue EOFError
      raise RestClient::ServerBrokeConnection
    rescue Timeout::Error
      raise RestClient::RequestTimeout
    rescue OpenSSL::SSL::SSLError => error
      # UGH. Not sure if this is needed at all. SSLCertificateNotVerified is not being used internally.
      # I think it would be better to leave SSLError processing to the client (they'd have to do that anyway...)
      raise SSLCertificateNotVerified.new(error.message) if error.message.include?("certificate verify failed")
      raise error
    end