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'])
Example #2
0
 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
Example #3
0
    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
Example #4
0
 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