def _make_request(self, method, url, args, kwargs): # Decide whether to require SSL verification verify_ssl = True if (settings.verify_ssl is False) or hasattr(settings, 'insecure'): verify_ssl = False elif settings.certificate is not None: verify_ssl = settings.certificate # Call the superclass method. try: with warnings.catch_warnings(): warnings.simplefilter( "ignore", urllib3.exceptions.InsecureRequestWarning) return super(Client, self).request(method, url, *args, verify=verify_ssl, **kwargs) except SSLError as ex: # Throw error if verify_ssl not set to false and server # is not using verified certificate. if settings.verbose: debug.log('SSL connection failed:', fg='yellow', bold=True) debug.log(str(ex), fg='yellow', bold=True, nl=2) if not settings.host.startswith('http'): secho( 'Suggestion: add the correct http:// or ' 'https:// prefix to the host configuration.', fg='blue', bold=True) raise exc.ConnectionError( 'Could not establish a secure connection. ' 'Please add the server to your certificate ' 'authority.\nYou can run this command without verifying SSL ' 'with the --insecure flag, or permanently disable ' 'verification by the config setting:\n\n ' 'tower-cli config verify_ssl false') except ConnectionError as ex: # Throw error if server can not be reached. if settings.verbose: debug.log('Cannot connect to Tower:', fg='yellow', bold=True) debug.log(str(ex), fg='yellow', bold=True, nl=2) raise exc.ConnectionError( 'There was a network error of some kind trying to connect ' 'to Tower.\n\nThe most common reason for this is a settings ' 'issue; is your "host" value in `tower-cli config` correct?\n' 'Right now it is: "%s".' % settings.host)
def get_prefix(self, include_version=True): """Return the appropriate URL prefix to prepend to requests, based on the host provided in settings. """ host = settings.host if '://' not in host: host = 'https://%s' % host.strip('/') elif host.startswith('http://') and settings.verify_ssl: raise exc.TowerCLIError( 'Can not verify ssl with non-https protocol. Change the ' 'verify_ssl configuration setting to continue.') # Validate that we have either an http or https based URL url_pieces = urlparse(host) if url_pieces[0] not in ['http', 'https']: raise exc.ConnectionError( 'URL must be http(s), {} is not valid'.format(url_pieces[0])) prefix = urljoin(host, '/api/') if include_version: # We add the / to the end of {} so that our URL has the ending slash. prefix = urljoin(prefix, "{}/".format(CUR_API_VERSION)) return prefix