<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def request(context, url, timeout=60, method='get', good=(200, ), retry=tuple(range(500, 512)), return_type='text', **kwargs):
 """Async aiohttp request wrapper. Args: context (scriptworker.context.Context):
 the scriptworker context. url (str):
 the url to request timeout (int, optional):
 timeout after this many seconds. Default is 60. method (str, optional):
 The request method to use. Default is 'get'. good (list, optional):
 the set of good status codes. Default is (200, ) retry (list, optional):
 the set of status codes that result in a retry. Default is tuple(range(500, 512)). return_type (str, optional):
 The type of value to return. Takes 'json' or 'text'; other values will return the response object. Default is text. **kwargs: the kwargs to send to the aiohttp request function. Returns: object: the response text() if return_type is 'text'; the response json() if return_type is 'json'; the aiohttp request response object otherwise. Raises: ScriptWorkerRetryException: if the status code is in the retry list. ScriptWorkerException: if the status code is not in the retry list or good list. """

    session = context.session
    loggable_url = get_loggable_url(url)
    async with async_timeout.timeout(timeout):
        log.debug("{} {}".format(method.upper(), loggable_url))
        async with session.request(method, url, **kwargs) as resp:
            log.debug("Status {}".format(resp.status))
            message = "Bad status {}".format(resp.status)
            if resp.status in retry:
                raise ScriptWorkerRetryException(message)
            if resp.status not in good:
                raise ScriptWorkerException(message)
            if return_type == 'text':
                return await resp.text()
            elif return_type == 'json':
                return await resp.json()
            else:
                return resp