def test_request_url_with_params(self): request = ClientRequest('GET', '/') request.url = "a/b/c?t=y" request.format_parameters({'g': 'h'}) self.assertIn(request.url, ['a/b/c?g=h&t=y', 'a/b/c?t=y&g=h'])
def _create_request_message(self, http_method, location_id, route_values=None, query_parameters=None): location = self._get_organization_resource_location(location_id) deployment_level = False deployment_url = None if location is None: logger.debug('API resource location ' + location_id + ' is not registered on ' + self.config.base_url + '.') deployment_url = self._get_deployment_url() if deployment_url is not None: logger.debug('Checking for location at deployment level: ' + deployment_url) location = self._get_resource_location(deployment_url, location_id) deployment_level = True if location is None: raise ValueError('API resource location ' + location_id + ' is not registered on ' + self.config.base_url + '.') if route_values is None: route_values = {} route_values['area'] = location.area route_values['resource'] = location.resource_name route_template = self._remove_optional_route_parameters(location.route_template, route_values) logger.debug('Route template: %s', location.route_template) if not deployment_level: url = self._client.format_url(route_template, **route_values) else: url = self._client.format_url(deployment_url + route_template, **route_values) request = ClientRequest(method=http_method, url=url) if query_parameters: request.format_parameters(query_parameters) return request
def _get_resource_locations(self, all_host_types): # Check local client's cached Options first if all_host_types: if self._all_host_types_locations is not None: return self._all_host_types_locations elif self._locations is not None: return self._locations # Next check for options cached on disk if not all_host_types and OPTIONS_FILE_CACHE[self.normalized_url]: try: logger.debug('File cache hit for options on: %s', self.normalized_url) self._locations = self._base_deserialize.deserialize_data( OPTIONS_FILE_CACHE[self.normalized_url], '[ApiResourceLocation]') return self._locations except DeserializationError as ex: logger.debug(ex, exc_info=True) else: logger.debug('File cache miss for options on: %s', self.normalized_url) # Last resort, make the call to the server options_uri = self._combine_url(self.config.base_url, '_apis') request = ClientRequest(method='OPTIONS', url=self._client.format_url(options_uri)) if all_host_types: query_parameters = {'allHostTypes': True} request.format_parameters(query_parameters) headers = {'Accept': 'application/json'} if self._suppress_fedauth_redirect: headers['X-TFS-FedAuthRedirect'] = 'Suppress' if self._force_msa_pass_through: headers['X-VSS-ForceMsaPassThrough'] = 'true' response = self._send_request(request, headers=headers) wrapper = self._base_deserialize('VssJsonCollectionWrapper', response) if wrapper is None: raise VstsClientRequestError( "Failed to retrieve resource locations from: {}".format( options_uri)) collection = wrapper.value returned_locations = self._base_deserialize('[ApiResourceLocation]', collection) if all_host_types: self._all_host_types_locations = returned_locations else: self._locations = returned_locations try: OPTIONS_FILE_CACHE[self.normalized_url] = wrapper.value except SerializationError as ex: logger.debug(ex, exc_info=True) return returned_locations
def _create_request_message(self, http_method, location_id, route_values=None, query_parameters=None): location = self._get_resource_location(location_id) if location is None: raise ValueError('API resource location ' + location_id + ' is not registered on ' + self.config.base_url + '.') if route_values is None: route_values = {} route_values['area'] = location.area route_values['resource'] = location.resource_name url = self._transform_route_template(location.route_template, route_values) logger.debug('Route template: %s', location.route_template) request = ClientRequest(method=http_method, url=self._client.format_url(url)) if query_parameters: request.format_parameters(query_parameters) return request