:param request_dic: a dictionary containing parameters for the request
        :param opname: An API operation name, available are: loginUser,getInitialUserData,logoutUser,createNewBudget,
        freshStartABudget,cloneBudget,deleteTombstonedBudgets,syncCatalogData,syncBudgetData,getInstitutionList,
        getInstitutionLoginFields,getInstitutionAccountList,registerAccountForDirectConnect,
        updateDirectConnectCredentials,poll,createFeedback,runSqlStatement
        :return: the dictionary of the result of the request

def dorequest(self, request_dic, opname):
        """
        :param request_dic: a dictionary containing parameters for the request
        :param opname: An API operation name, available are: loginUser,getInitialUserData,logoutUser,createNewBudget,
        freshStartABudget,cloneBudget,deleteTombstonedBudgets,syncCatalogData,syncBudgetData,getInstitutionList,
        getInstitutionLoginFields,getInstitutionAccountList,registerAccountForDirectConnect,
        updateDirectConnectCredentials,poll,createFeedback,runSqlStatement
        :return: the dictionary of the result of the request
        """
        # Available operations :

        def curate_password(message):
            return message.replace(self.password, '********')

        def errorout(message):
            LOG.error(curate_password(message))
            raise NYnabConnectionError(message)

        json_request_dict = json.dumps(request_dic, cls=ComplexEncoder)
        params = {u'operation_name': opname, 'request_data': json_request_dict}
        LOG.debug(curate_password('%s  ... %s ' % (opname, params)))
        r = self.session.post(self.urlCatalog, params)
        self.lastrequest_elapsed = r.elapsed
        js = r.json()
        if r.status_code == 500:
            errorout('Unrecoverable server error, sorry YNAB')
        if r.status_code != 200:
            LOG.debug('non-200 HTTP code: %s ' % r.text)
        if not 'error' in js:
            errorout('The server returned a json value without an error field')
        if js['error'] is None:
            LOG.debug(curate_password('the server returned '+pp_json(js)))
            return js
        error = js['error']
        if 'id' not in error:
            errorout('Error field %s without id returned from the API, %s' % (error, params))
        if error['id'] == 'user_not_found':
            errorout('API error, User Not Found')
        elif error['id'] == 'user_password_invalid':
            errorout('API error, User-Password combination invalid')
        elif error['id'] == 'request_throttled':
            LOG.debug('API Rrequest throttled')
            retryrafter = r.headers['Retry-After']
            LOG.debug('Waiting for %s s' % retryrafter)
            sleep(float(retryrafter))
            return self.dorequest(request_dic, opname)
        elif error['id'] == 'invalid_session_token':
            errorout('Invalid session token. You should call init_session() on the connection object')
        else:
            errorout('Unknown API Error \"%s\" was returned from the API when sending request (%s)' % (error['id'], params))